windows黑客編程系列
對VS及windows編程太生硬了,每一步操作都得找好久。
資源釋放
病毒木馬之所以會廣泛使用資源釋放技術,是因爲它可以使程序變得更簡潔。
- 如果程序需要額外加載一些第三方DLL文件,文本文件,圖片文件,或者其他的音視頻文件等,可以把它們作爲資源插入到程序裏。
- 等待程序運行後,再把它們釋放至本地。
這樣做的好處是編譯出來的程序只有一個exe文件,而不需要附帶其他文件,因而使程序變得很簡潔,降低了被發現的風險。
資源插入
環境:VS2019
新建控制檯程序即可。
- 右鍵資源文件->添加->資源
- 選擇自定義,輸入你想填寫的資源類型,我填的是MYTYPES。
- 選擇MYTEPES類型,點擊導入
- 然後將想插入的文件插入進來。
- 插入完成後,我們查看資源文件是否插入成功。視圖->其他窗口->資源視圖
進行資源提取
// ConsoleApplication1.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。
//
#undef UNICODE
#include <Windows.h>
#include <stdio.h>
#include "resource.h"
// 提取資源
BOOL FreeMyResourse(UINT uiResouceName, char *lpszResourceType, char* lpszSaveFileName)
{
HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(uiResouceName), lpszResourceType);
if (hRsrc == NULL)
{
printf("can't find the resource!\n");
return FALSE;
}
DWORD dwSize = SizeofResource(NULL, hRsrc);
if (dwSize <= 0)
{
printf("the resource's size is error!\n");
return FALSE;
}
HGLOBAL hGlobal = LoadResource(NULL, hRsrc);
if(hGlobal == NULL)
{
printf("load resource error!\n");
return FALSE;
}
LPVOID lpVoid = LockResource(hGlobal);
if (lpVoid == NULL)
{
printf("lock resource error!\n");
return FALSE;
}
FILE* fp = NULL;
fopen_s(&fp, lpszSaveFileName, "wb+");
if (fp == NULL)
{
printf("open file error!\n");
return FALSE;
}
fwrite(lpVoid, sizeof(char), dwSize, fp);
fclose(fp);
return TRUE;
}
int main()
{
char lpszResourceType[20] = "MYTYPES";
char szSaveFileName[20] = "555.txt";
BOOL flag = FreeMyResourse(IDR_MYTYPES2, lpszResourceType, szSaveFileName);
if (flag == TRUE)
{
printf("the resource is free!\n");
}
return 0;
}
可以看到555.txt已經提取成功了。
期間遇到的小問題
- “char *” 類型的實參與 “LPCWSTR” 類型的形參不兼容
- 未定義標識符 “IDR_MYTYPES2”
第一個問題:
#undef UNICODE
在頭文件之前加入此行即可。
第二個問題:
#include "resource.h"
該標識符在上文中插入資源的最後部分展示過了,但程序出現未定義該標識符問題,原因爲沒有引入resource.h的頭文件。
DLL延遲加載
在開發程序的時候,通常會使用第三方庫。但是並不是所有的第三方庫都會提供靜態文件,大多數會提供DLL文件,這樣,程序需要相應的DLL文件才能加載啓動。
DLL延遲加載技術是一種使用延遲加載方式編譯鏈接可執行文件。這樣可執行程序就可以先加載執行,所依賴的DLL在正式調用時再加載進來。
該技術可以跟資源釋放技術結合使用,即將DLL文件加載入exe文件的資源節中,然後通過釋放資源+DLL延遲加載來減小被發現的概率,只需一個exe文件,不需附加額外的DLL文件,也不擔心程序會丟失DLL文件。
如何進行DLL文件的延遲加載
- 右鍵項目->屬性->鏈接器->輸入->延遲加載的DLL
- 將需要延遲加載的DLL文件輸入點擊確定即可