通过修改PE文件导入DLL

通过修改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个重要成员需要写入:

  1. INT的RVA
  2. DLL名字的RVA
  3. 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导入成功

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值