PE文件添加函数教程

本文详细介绍了如何在HelloPE.exe中添加user32.dll的MessageBoxExA函数,包括修改.text、.rdata、.data段,调整段表和DataDirectory,以及最终的运行测试。

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

修改HelloPE.exe,添加user32.dll的另一个函数MessageBoxExA,并测试。如何构造HelloPE.exe可以看我上次发的博客

构造HelloPE程序

主要思路:添加一个user32.dll的MessageBoxExA函数,运行程序后会先后弹出两个窗口,首先需要明白需要修改哪些部分

1、.text需要修改,因为要添加函数,就要加添加push和参数

2、.rdata段需要重新修改导入表和导入函数地址,是最难的部分

3、.data段需要为新加的弹出窗口设置标题和内容

4、段表需要修改,因为3个段的长度都发生了变化

5、DataDirectory需要修改。因为多了一个导入函数,所以IAT和IT的长度都会发生变化,同时IAT的起始位置虽然不变,但是IT的起始位置由于IAT变长了所以会延后。

目录

1、修改.data段

2、修改.text段

3、修改.rdata段

3.1 修改IAT(0600h到0614h)

3.2 修改导入表描述符(0615h到06BBh)

3.3 返回.text段还未确定的push函数地址

4、修改段表中的VirtuaSize字段

5、修改DataDirectory的第2项和第13项

6、运行程序


1修改.data

设置第二个弹出的窗口,标题为ByLyt,消息为Hello PE

记录标题的地址为080E,RVA为40300E,字符串的地址为0815,RVA为403015,后续会用到

2、修改.text

代码如下,红色为新增的代码,MessageBoxExA函数比MessageBoxA多一个语言标识符参数,新增标题和内容的地址由上一步得到

6A 00                      push 0                         ;第一个消息框风格(0表示默认风格)

68 00304000       push 0x403000          ;标题字符串所在的地址

68 07304000       push 0x403007           ;内容字符串所在的地址

6A 00                  push 0                         ;消息框所属窗口句柄

FF 15 ????          call ptr[????]                     ;调用MessageBoxA

6A 00                  push 0                        ; 第二个消息框风格

6A 00                  push 0                         ; 语言标识符(0表示使用默认语言)

68 0E304000       push 0x40300E          ;标题字符串所在的地址

68 15304000       push 0x403015           ;内容字符串所在的地址

6A 00                  push 0                         ;消息框所属窗口句柄

FF 15 ????          call ptr[????]                ;调用MessageBoxExa

6A 00                  push 0                         ;ExitProcess函数的参数,程序退出码

FF 15 ????          call ptr[????]             ;调用ExitProcess

3个函数的地址还不确定,要等.rdata填完才知道,所以先填入AA AA AA AA, 修改完如下图

3、修改.rdata

修改前

修改后

3.1 修改IAT(0600h0614h)

ExitProcess的RVA是20A2h ,填入A2 20 00 00

MessageBoxA的RVA是2078h,填入78 20 00 00

MessageExa的RVA是2086h,填入86 20 00 00

3.2 修改导入表描述符(0615h06BBh)

一共有三个

6C 20 00 00 00 00 00 00 00 00 00 00 96 20 00 00 08 20 00 00

70 20 00 00 00 00 00 00 00 00 00 00 96 20 00 00 0C 20 00 00

64 20 00 00 00 00 00 00 00 00 00 00 B0 20 00 00 00 20 00 00

然后隔20个字节0表示一个空导入表描述符

3.2.1 分析第一个导入表描述符

6C 20 00 00 00 00 00 00 00 00 00 00 96 20 00 00 08 20 00 00

6C 20 00 00即206C,转换成FOA为066C,这个位置对应78 20 00 00,即2078h,再转换成FOA为0678,这个位置对应9D 01 4D…即指向MessageBoxA函数的名字。96 20 00 00即2096,转换成FOA为0696,这个位置对应75 73 65…,即指向user32.dll的名字。08 20 00 00即2008,为MessageBoxA的RVA

3.2.2 分析第二个导入表描述符

70 20 00 00 00 00 00 00 00 00 00 00 96 20 00 00 0C 20 00 00

70 20 00 00即2070,转换成FOA为0670,这个位置对应86 20 00 00,即2086,在转换成FOA为0686,这个位置对应9D 02 4D 65…,即MessageBoxExa函数的名字。96 20 00 00即200C,转换成FOA为0696,这个位置对应75 73 65 …,即指向user32.dll的名字。0C 20 00 00即200C,为MessageBoxExa的RVA

3.2.3 分析第三个导入表描述符

64 20 00 00 00 00 00 00 00 00 00 00 B0 20 00 00 00 20 00 00

64 20 00 00即2064,转换成FOA为0664,这个位置对应A2 20 00 00,即20A2,在转换成FOA为06A2,这个位置对应80 00 45 78…,即ExitProcess函数的名字。B0 20 00 00即20B0,转换成FOA为06B0,这个位置对应6B 65 72 6E…,即指向kernel32.dll的名字。00 20 00 00即2000,为ExitProcess的RVA

3.3 返回.text段还未确定的push函数地址

MessageBoxA的VA地址00402008h ,所以反过来填入08 20 40 00

MessageBoxExa的VA地址0040200Ch,所以反过来填入0C 20 40 00

ExitProcess的VA地址00402000h,所以反过来填入00 20 40 00

修改完如下

4、修改段表中的VirtuaSize字段

修改前

4.1 .text段由原来的27字节变为现在的50字节

所以1B 00 00 00改为32 00 00 00

4.2 .rdata段由原来的143字节变为现在的188字节

所以8F 00 00 00改为BC 00 00 00

4.3 .data段由原来的14字节变为现在的29字节

所以0E 00 00 00改为1D 00 00 00

修改后如下

5、修改DataDirectory的第2项和第13

修改前

5.1 IAT的RVA还是为2000h,所以DataDirectory第13项前4字节不变。

5.2 有多少个导入的DLL就有多少个IAT表项,user32.dll表项有2个导入函数,每个函数的地址占4字节,然后再用4个字节0表示该dll结束,然后Kernel32.dll只有一个导入函数,该函数地址占4字节,最后以4个字节0表示结束,一共4*2+4+4+4=20,所以整个IAT大小为20字节,即14h, 所以DataDirectory第13项后4字节改为14 00 00 00

5.3 IT从0614开始,转换成RVA为2014h,反写为14 20 00 00,所以DataDirectory第2项前4字节改为14 20 00 00。

5.4 导入表描述符20字节,一共3个函数加上2个空导入表描述符即100字节,64h,反写为64 00 00 00,所以DataDirectory第2项后4字节改为64 00 00 00

修改后如下

6、运行程序

先使用LordPE软件检查是否写好的PE文件是否有误

6.1 查看导入表信息

6.2查看段信息

6.3将文件改为exe后缀,运行结果如下

6.4 点击确定后会弹出第二个窗口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Genius256

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值