创建远程线程(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,