资源释放技术:
是一种病毒木马经常使用的技术,为了是程序变得更加简洁,当程序要使用一些图片、文本文件时可以把他们作为资源插入到程序中,当程序运行时,在释放到本地。
这样编译出来就只有一个exe文件。
实现原理:
插入资源:首先创建资源,然后在VS里添加自定义资源,并导入创建的资源。
然后利用FindResource()定位程序里的资源,获得资源信息块。
再利用SizeofResource()获得资源的大小
通过LoadResource()把资源加载到程序内存中。
接着通过LockResource()锁定加载到内存中的资源,防止其他操作影响这块内存。
最后从内存中读取出这块内存并保存。
实现步骤:
这里创建一个文本文件为例:
添加资源:选择自定义。
导入刚刚创建的txt文件
导入结果:
最后是代码实现。
代码实现:
#include<Windows.h>
#include<iostream>
#include<tchar.h>
#include"resource.h" //要包含资源文件的头文件
BOOL FreeMyResource(UINT uiResourceName, TCHAR* lpszResourceType, char *lpszSaveFileName);
int _tmain()
{
_tprintf(_T("资源释放技术 \r\n"));
FreeMyResource(IDR_MYRESOURCE, TEXT("MYRESOURCE"), "TEST.txt");
getchar();
return 0;
}
BOOL FreeMyResource(UINT uiResourceName,TCHAR* lpszResourceType,char *lpszSaveFileName)
{
//获取指定模块的资源
HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(uiResourceName), lpszResourceType);
if (hRsrc == NULL)
{
_tprintf(_T("FindResource Failed!"));
return FALSE;
}
//获取资源大小
DWORD dwSize = SizeofResource(NULL, hRsrc);
if (dwSize<=0)
{
_tprintf(_T("SizeofResource Failed!"));
return FALSE;
}
//将资源加载到内存
HGLOBAL hGlobal = LoadResource(NULL, hRsrc);
if (hGlobal==NULL)
{
_tprintf(_T("LoadResource Failed!"));
return FALSE;
}
//锁定资源
LPVOID lpVoid = LockResource(hGlobal);
if (lpVoid==NULL)
{
_tprintf(_T("LockResource Failed!"));
return FALSE;
}
//将资源保存为文件
FILE* fp = NULL;
fopen_s(&fp, lpszSaveFileName, "wb+");//打开一个文件/创建新文件
if (fp==NULL)
{
_tprintf(_T("LockResource Failed!"));
return FALSE;
}
fwrite(lpVoid, sizeof(char), dwSize, fp);
fclose(fp);
return TRUE;
}
运行结果
释放成功。