標題不知道這麼說好不好,感覺很亂。
我以前就很納悶,爲什麼我一個木馬的客戶端,能配置好各種選項以後生成一個服務端。一個exe文件怎麼生出另一個exe文件?
一般的木馬生成、木馬釋放都使用的這個方法,dll也可以加到資源中,這樣我們的程序就可以免去包含很多亂七八糟的二進制文件,一個exe就夠了,執行的時候再釋放。
其實原理很簡單,把二進制文件導入到資源中。我們就以vs2010爲例:
0x01 在VC的資源視圖中選擇添加資源 - 導入,選擇你要包含的exe
0x02 包含以後,會看到你選擇的文件已經以二進制的形式展現在你面前:
0x03 來到代碼編輯區,我們在需要使用這個exe文件的時候,從資源裏拿出這段二進制代碼,寫入內存或一個磁盤文件就行了。首先定位我們的資源文件,其中IDR_RCEXE即爲資源文件的ID:
HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCEA(IDR_RCEXE), TEXT("RCEXE"));
0x04 獲得資源文件大小,這個大小之後我們如果要提取出來會用到的:
DWORD dwSize = SizeofResource(NULL, hRsrc);
0x05 加載資源,使用之前獲得的資源文件句柄hRsrc:
HGLOBAL hGlobal = LoadResource(NULL, hRsrc);
0x06 在內存中鎖定資源,其返回值即爲一個指向資源第一個字節的指針:
LPVOID pBuffer = LockResource(hGlobal);
0x07 已經獲得了指針了,再怎麼做就看你自己的了。比如我這裏就是簡單地將這個exe文件釋放到硬盤的臨時目錄下 C:\Users\Phtih0n\AppData\Local\Temp,其中dwSize就是之前獲得的資源文件大小:
FILE* fp = fopen("C:\Users\Phtih0n\AppData\Local\Temp\tmp100.exe", "wb");
if (fp != NULL)
{
fwrite(pBuffer, sizeof(char), dwSize, fp)
fclose(fp);
}
這樣,下次就能直接調用C:\Users\Phtih0n\AppData\Local\Temp\tmp100.exe了。
如果是dll,也是一樣的,釋放出來以後就能LoadLibrary調用它了。
0x08 總結
其實這一套過程和代碼基本上就是固定的,獲得資源句柄 - 獲得資源文件大小 - 加載資源文件 - 鎖定資源並獲得其指針。
以後寫代碼的時候就直接複製這一端,改一下就能爲己用。
轉自:https://www.leavesongs.com/C/vc-resource-exe.html