Dll注入--修改PE文件头

本文介绍了一种通过修改PE文件头中的导入表来实现DLL注入的方法。具体步骤包括:分析PE文件结构,找到导入表并修改其内容,添加自定义DLL信息,并调整相关指针确保操作系统加载PE文件时自动加载目标DLL。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DLL注入,除了常见的远线程注入,挂钩和修改注册表以外还可以通过修改PE文件头来达到注入目的,废话少说先上菜。

1. 思路

PE文件经常会调用外部DLL文件,而需要调用的DLL文件都会在PE文件说明,通过 NT头->可选头->导入表 可以找到导入表,而导入表就是对需要导入的每个DLL的说明,它实际上是一个20个字节组成的IID结构体数组,每个结构体就是一个DLL信息说明,我们只需要向PE文件中准确添加这样的一个IID结构体,并且修改好相应指针就能利用操作系统加载PE文件的时候自动加载DLL文件了。

2.步骤

以下通过一个实例说明,例子来源于《逆向工程核心原理》25章,其中包括一个test.exe文件和一个myhack3.dll文件,目的是要通过手动修改test.exe文件的内容来注入myhack3.dll文件。
(1)首先用PEview查看test.exe文件已包含的DLL文件,并分析IID的插入方法
这里写图片描述
从上图发现test.exe已经加载了4个dll文件每个dll文件都是一个IID结构体,占20个字节,而且最后一个结构体为空,即全0结构。

《Windows PE权威指南》113页上面提到最后一个结构体实际不必要为全空,只要其中的Name[1]是0就能满足结束条件
IID结构说明:
STRUCT IAMGE_IMPORT_DESCRIPTOR
{
union
{
DWORD Characteristics;
DWORD OriginalFirstThunk; // INT的RVA
}
DWORD TimeDateStamp; //一个32位的时间标志
DWORD ForwarderChain;//这是一个被转向API的索引,一般为0
DWORD Name;//DLL名字,是个以00结尾的ASCII字符的RVA地址
DWORD FirstThunk; // 指向输入表的RVA
} ;

我们要插入一个IID结构在现有结构体数组的最后面(实际不一定非要插在这里),就要查看此处是否有可利用空间(可利用空间的意思就是一定要被加载到内存,且不影响到其他数据完整性还要有可写入权限,为什么要有可写入权限,是因为系统加载时需要用INT的指针写入IAT),于是我们需要查看上图中的76CC-772F这段内容,看它尾部是否有可利用空间
这里写图片描述
我们发现772F后面有数据F6 87…,因此不能把IID插入到这里,需要另寻它处,于是我们在来查看.rdata节区后面的空间,看是否有剩余空间(由于文件对齐的原因一般都有剩余空间,但其实我们还可以加入一个新节来存放IID,不过相对麻烦一点)
这里写图片描述
从上图发现该节去尾部还有大段空白,于是我们可以吧IID结构体数组移动到这里,并添加上自己的IID,然后吧相关头文件指针修改指向这里,但是这里还需要注意一个问题:此处是否是上文提到过的可利用区域,即是否会被加载到内存以及是否有可写权限?
这里写图片描述
我们查看该节头部发现加载到内存的文件部分应该是长度是2C56 而实际存在与磁盘的内容为2E00比内存中的内容要大,那么磁盘文件中多出的2E00-2C56去哪里了?(实际上这是磁盘文件对了保证文件对齐而填充的0,如上上个图所示),所以我们在这里添加其它数据不会影响到PE文件的其它数据,同时还要修改上图中的内存权限标记添加rdata节区可读属性0x80000000

可写属性的宏是(IMAGE_SCN_MEM_WRITE)

自此,我们已经找到了IID结构所在地址76CC-772F和要把它复制到的地方7E60-7FFF,还有需要添加的权限0x80000000,下面开始修改。

(2)移动IID数组,并在尾部添加一个IID结构,添加可写权限
先复制76CC-772F到7E60-7FFF这片区域
这里写图片描述
移动的具体地址可在这片区域随意选择,这里选择了7E80,其次是添加自己IID结构,这里自己添加的IID结构地址为7ED0,它实际上是覆盖了之前原有IID结构数组的最后一个全0结构,至于添加的内容
STRUCT IAMGE_IMPORT_DESCRIPTOR
{
union
{
DWORD Characteristics;
DWORD OriginalFirstThunk; // INT的RVA =8D00
}
DWORD TimeDateStamp; //一个32位的时间标志 =0
DWORD ForwarderChain;//被转向API的索引 =0
DWORD Name;//DLL名字 =8D10
DWORD FirstThunk; // 指向输入表的RVA IAT=8D20
} ;
而上述地址都是RVA,要把它们转变为RAW(文件偏移),如下表所示

这里写图片描述

上图来自书中,而填好地址之后还得在相应的地址填上实际的内容
这里写图片描述
图中的8D00、8D10、8D20、8D30都是之RVA转化为RAW之后分别是 7F00、7F10、 7F20、 7F30,地址转换可一手动计算也可以利用PEview等工具计算,移动IID数组和添加IID都已完成,现在要添加可写权限即与之前的40000040 or一下,于是
80000000 OR 40000040=C0000040
这里写图片描述
(3)修改可选头(IMAGE_OPTIONAL_HEADER)头部指针,删除绑定导入表

绑定导入表:IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT用于加快修正导入表,不是必要PE文件必要内容,当我们自己添加了DLL又不修改它的话就会出错,为了省去麻烦这里就直接删除它

可选头(IMAGE_OPTIONAL_HEADER)中有个指针指向了IID结构数组的起始位置,我们移动了IID结构,所以要修改此处
这里写图片描述
RVA 84CC改为我们修改的地址RVA 8C80也就是RAW 7E80,文件大小0X64改为0X78也就是增加0X78-0X64=0X14=20个字节,
自此,大功告成,只差验证!!!我的天,写了半天、、、
(4)验收
这里写图片描述
从图中可以看出myhack3.dll已经加载成功,任务COPY!没有表情图片,晕死|||

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值