修改PE加載dll

創建遠程線程(CreateRemoteThread()API),使用註冊表(AppInit_Dlls),消息勾取(SetWindowsHookEx()API)等Dll注入都是動態注入,也就是程序本身並不加載待注入的Dll。通過修改exe的格式,我們可以實現靜態注入,也就是對程序的機器字節進行修改,使程序運行時自動加載dll。

下面我們就來詳細的介紹一下這種方法。exe,dll等文件統稱爲可執行文件,它們都有着固定的格式,也就是PE格式。普通pe文件的基本結構爲:DOS頭,DOS存根,NT頭,節區頭,節區等幾個部分組成。在.rdata節區中存在着exe執行時需要加載的dll。我們通過修改此節區,可以加載自己想注入的dll文件。(關於PE格式的學習,請自己參考教材,重點掌握RVA to RAW,EAT,IAT   在此推薦一本書 《逆向工程 核心原理》適合新手學習)。

首先編寫dll文件,代碼如下所示:(http://pan.baidu.com/s/1eS14zx4   上面有我分享的原文件)

#include "windows.h"  

#ifdef __cplusplus
extern "C" {
#endif
	__declspec(dllexport) void dummy()
	{
		return;
	}
#ifdef __cplusplus
}
#endif//dll對外提供的函數

BOOL APIENTRY DllMain(HANDLE hMoudle,DWORD reason,LPVOID lpReserved)  //dllmain函數
{  
	switch(reason)  
	{  
	case DLL_PROCESS_ATTACH:  //<span style="font-family: Arial, Helvetica, sans-serif;">在dll第一次加載時自動執行,以後加載則只增加引用數,不會執行</span>
		MessageBox(NULL,L"testsuccess",L"Success",MB_OK);  
		return TRUE;
	default:  
		return TRUE;  
	}  
}  

下面我們就對textview.exe進行開刀,強行插入我們的dll。
用PEView查看textview.exe(PEview下載地址http://pan.baidu.com/s/1b0Gwu6),在PEview找到IMPORT Directory Table(idt)一項,可以看到該程序加載了4個dll:Kernel32.dll  user32.dll gdi32.dll shell32.dll。
我們可以把我們自己的dll也放到這裏面,這樣就可以和kernel.dll一樣自動加載了。
當我們把自己的dll添加進去的時候,idt容量就會變大,使得原來的地方容納不開,所以我們需要找一片空白的地方存放我們新的idt。這裏我們選擇了RAW:7e80的地方創建新的idt。

下面開始修改textview.exe<span style="font-family: monospace; white-space: pre; background-color: rgb(240, 240, 240);">,用ultraedit以十六進制方式打開textvew.exe,</span>:
1:修改導入表的RVA值
<img src="https://img-blog.csdn.net/20160416170235975?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
修改import的RVA和size.使用RAW to RVA公式得到RVA爲8c80,size爲78(十六進制)。
2:刪除綁定導入表
綁定導入表是一種提高dll加載速度的技術。當然它是可選的,所以保險起見,把BOUND IMPORT TABLE全部置爲0.
3:創建新的IDT
現將選來的IDT完全複製,然後複寫到IDT的新位置。然後在IDT的尾部添加與Myhack3.dll對應的IID.
4:設置新添加dll文件的name、int、iat
設置myhack3.dll的IID屬性。
5:修改IAT節區內的屬性
將.rdata節區添加可寫屬性。


下面是實驗結果:


先彈出對話框,之後程序正常執行。

用ultraedit以十六進制方式打開textvew.exe,
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章