通过修改PE文件导入DLL
修改思路
实例
1.查看IDT信息
图1
由上图我们可以得到以下信息:
IDT的RVA信息在文件偏移160h处,值为84CC
IDT的大小信息在文件偏移164h处,值为64h
1.1转到IDT处查看具体信息
转到84CC也就是文件偏移76CC
共有5个IID结构体(每个IID20个字节,对应一个DLL相关信息),最后一个IID为NULL
由上图我们发现并没有足够空间添加我们的DLL,
那么转移IDT
2.转移IDT
由图1可知IDT在.rdata节区,
查看.rdata节区是否有多余的空白区域
图二
由上图可知.rdata节区的文件偏移为5200h,大小为2E00h
转到8000h(5200+2E00),这里我们从后往前看,因为节区中一般后面才会是NULL区域
从7E60~7FFF都是NULL,
但是还不能直接将IDT转移至此处,
需要先看看.rdata节区头的信息,看看该空白区域是不是有效的NULL区域(不一定是NULL就能用,只有在节区头中规定了的区域才是有效的)
由图2可知:.rdata节区在文件中大小为2E00h,在内存中大小为2C56h,很明显还有1AA(2E00-2C56)的空间可以使用,那么我们可以放心的将IDT转移到此处
3.修改IDT的RVA与SIZE
转到文件偏移160h:
修改IDT的RVA与SIZE:
8C80就是文件偏移7E80处,大小多了14h(20个字节),就是我们添加的DLL
4.删除绑定导入表
绑定导入表是一种提高DLL加载速度的技术,如果其值为0,则不用修改,如果不为0,那么要将其置位0,使其不存在(因为绑定导入表不存在是允许的,但如果存在,里面信息记录错误,那么会导致程序运行时出错)
可以看到其值为0
5.创建IDT
将之前的IDT信息(84CC处)复制到新位置8C80(文件偏移7E80):
6.写入DLL信息
IID中有3个重要成员需要写入:
- INT的RVA
- DLL名字的RVA
- IAT的RVA
这里用的8D00,8D10,8D20对应文件偏移7F00,7F10,7F20
正好在下面,比较方便
7.设置INT,NAME,IAT
8.修改IAT所在节区属性
PE文件加载到内存时,PE装载器会修改IAT,将函数实际地址写入IAT,所以IAT所在节区必须要有可写属性,这是一种方法
因为可选头的最后一个成员Data Directory数组含有IAT,所以直接转到此区域为dummy添加IAT,然后将整个IAT大小添加8个字节即可,这是另外一种方法
先试试方法一
IAT在.rdata节区,修改.rdata属性
将40000040与80000000(可写属性值)进行bit OR运算,得到C0000040
9.验证
DLL导入成功