資源釋放技術:
是一種病毒木馬經常使用的技術,爲了是程序變得更加簡潔,當程序要使用一些圖片、文本文件時可以把他們作爲資源插入到程序中,當程序運行時,在釋放到本地。
這樣編譯出來就只有一個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;
}
運行結果
釋放成功。