修改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,
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值