修改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:  //在dll第一次加载时自动执行,以后加载则只增加引用数,不会执行
		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,用ultraedit以十六进制方式打开textvew.exe,:
1:修改导入表的RVA值

修改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节区添加可写属性。


下面是实验结果:

修改PE加载dll_第1张图片修改PE加载dll_第2张图片

先弹出对话框,之后程序正常执行。

用ultraedit以十六进制方式打开textvew.exe,

你可能感兴趣的:(windows逆向)