首页
论坛
课程
招聘
[原创]使用“PE文件加区段工具”、“LordPE”、“WinHex”、“OllyDbg”为PE文件添加section、dll(API)
2018-10-19 20:31 6287

[原创]使用“PE文件加区段工具”、“LordPE”、“WinHex”、“OllyDbg”为PE文件添加section、dll(API)

2018-10-19 20:31
6287
今天给大家分享一下如何使用“PE文件加区段工具”、“LordPE”、“WinHex”、“OllyDbg”为PE文件添加section、dll(API)


一、准备工具

1、PE文件加区段工具

打开搜狗浏览器搜狗搜索->PE文件加区段工具,点击普通下载。

其他浏览器下载方法类似。

2、LordPE

下载方法同上

3、WinHex

官方下载链接:http://www.winhex.com/winhex/

4、OllyDbg

官方下载地址:http://www.ollydbg.de/


二、添加section

自建Hello world.exe,如果是其他重要EXE文件,请先做好备份

#include <stdio.h>
int main(int argc, char *argv[])
{
    printf("Hello world!\n");
    return 0;
}

使用PE文件加区段工具给EXE增加section

1、使用PE文件加区段工具打开Hello world.exe

2、点击“查看区段”按钮,查看已有区段

3、输入区段名,并点击 “增加区段”按钮


4、再次点击“查看区段”按钮,查看现有区段

5、点击“测试运行”按钮,查看EXE文件是否能正常运行,或在cmd命令下查看是否能正常运行

6、退出程序


使用LordPE给EXE增加section

删除上一步使用的EXE可执行文件,使用hello world源程序再次生成EXE可执行文件

1、打开LordPE,点击“PE编辑器按钮”,打开要编辑的PE文件


2、在弹出界面,点击“区段”按钮,查看已有区段

3、选中最后一个区段“.reloc”,右击,选择“添加区段”,新增区段名为“.NewSec”

4、选中新增区段,右击,选择“编辑区段”


5、在“编辑区段”对话框中输入区段名,虚拟大小,物理大小,其中Vsize<=Rsize,注意区块对齐,这里是0x200,其他数据根据需要修改,标志设置点击右下角图标进行设置

6、查看添加结果,并保存修改



7、点击当前窗口右下角“L”按钮,打开“结构列表”窗口,查看File Header结构下的NumberOfSections字段取值,该值为6,表明修改成功


或者点击“位置计算器”按钮,打开 “文件位置计算器”对话框,输入RVA值,这里输入0,点击“执行”按钮,再点击“十六进制编辑器”按钮,打开“16Edit FX”对话框,根据PE文件结构中DOS Header结构下的e_flanew字段确定PE Header相对偏移地址RVA,Signature字段占4字节,File header结构下的Machine字段2字节,NumberOfSections字段4字节,故0xFE、0xFF这两个字段表示NumberOfSections字段的值,此处为6,说明修改成功

8、双击helloworld.EXE,或者cmd命令下打开helloworld.EXE,发现弹出如下对话框:


表示并没有真正添加成功,造成这个情况的主要原因是,我们只修改了PE文件里面的数据,添加了一个区块头,并未添加数据,文件大小不变

9、打开之前下载的“WinHex”16进制编辑工具,打开前面所修改的PE文件,全选所有数据,右击复制(十六进制),新建文件,大小为原文件大小+添加section大小,这里为0x23F0+0x200=0x25F0,其中,0x23F0为文件原始大小,0x200为之前添加的section大小,2K<0x25F0<3K,新建好之后,右击->剪贴板数据->粘贴,再将0x25F0之后的数据删除即可


10、文件另存为为“test.exe”,在当前文件夹打开cmd命令窗口,运行测试,发现能成功运行,表明添加成功



使用“WinHex”给EXE添加section

步骤与上一种方法相类似,只需将相应字段修改即可,之后操作相同。


三、添加Dll(API)

1、生成可执行文件,使用LordPE打开生成的PE文件。先采用上面的方法添加一个section,然后再次用LordPE打开该文件

2、打开输入表

3、右击最后一个dll,采用添加section同样的方法添加dll,先输入DLL名字(USER32.dll),然后输入MessageBoxA并检测函数是否存在,同时记录ThunkRVA字段的值,这里为0x7019,这里的ThunkRVA的值就是MessageBoxA在IAT中的RVA地址


4、再次打开“区段表”对话框,查看区段,记录“.mySec”和“.Silvana”的VOffset


5、记录原程序执行入口点,0x155D,将程序执行入口点更改为“.mySec”的VOffset,0x6000,保存程序


更改后

6、用Ollydbg打开上一步保存的test.exe,按下F9程序在0x01076000处暂停,此处地址理解为0x01070000+0x00006000=0x01076000,0x6000为我们添加的section的偏移地址,我们将程序执行入口点放到这里,是为了在我们自己添加的section中,添加我们自己的代码,并且让程序执行。至于0x01070000,可查阅相关资料,这里不做具体解释,它在这里有一个特点是,每次用ollydbg打开,这个值都会有所变化


7、添加代码,参数值,去调用我们添加的Dll中的API

A.添加title值,选中,右击,二进制,编辑

B.添加text,选中,右击,二进制,编辑

C.添加代码,双击,输入

其中0x0107600E处的内容为CALL DWORD PTR DS:[1077019],0x7019为我们添加的API的偏移地址

0x01076014处的内容为JMP 0107155D,0x155D为未修改前的程序执行入口点

8、按下F8单步步过(或F9)去执行我们添加的API,根据执行结果,可判断我们添加成功


9、继续执行JMP跳转指令,返回原程序,并且成功输出了HelloWorld字符串,表明添加成功,至此,添加完毕




注:由于有地址随机化的保护机制,我们的地址也是直接写入,所以直接保存再次打开则将出错,若想不出错,则可以在添加代码时,将所有地址全部计算偏移地址带入,使得程序下次执行程序时根据偏移地址查找相关内容





2020 KCTF秋季赛【攻击篇】正在火热进行中!

收藏
点赞0
打赏
分享
最新回复 (6)
雪    币: 455
活跃值: 活跃值 (133)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
ssarg 活跃值 2018-10-19 21:59
2
0
雪    币: 1006
活跃值: 活跃值 (55)
能力值: ( LV7,RANK:118 )
在线值:
发帖
回帖
粉丝
For@* 活跃值 2018-10-19 22:18
3
0
各位读者可以把这篇博客看做对《加密与解密4》第821、822页,23.3.1 增加输入函数 的一个操作简化版或详细版,再或者是一个相似版吧,方法原理与之几乎相同,这里多介绍了一下添加section的方法,添加section的方法与书上有点不同,但原理一样。
关于添加section,我采用的方法是将添加的代码放到自己单独添加的section中,而《加密与解密4》上面感觉省略了很多步骤,初次看到23.3.1节的时候,感觉很懵,或许作者也是为了让读者自己动手证明这一方法的可行性,有可能是压缩了一下内容
最后于 2018-10-19 22:21 被For@*编辑 ,原因:
雪    币: 4477
活跃值: 活跃值 (345)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jgs 活跃值 2018-10-20 10:04
4
0
不错,学习了,收藏,谢谢楼主。
雪    币: 3
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
平生欢 活跃值 2018-10-23 10:35
5
0
不错 学习了 谢谢楼主
雪    币: 1390
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
淡定今生 活跃值 2018-11-27 07:13
6
0
学习了,谢谢楼主,加密很有用
雪    币: 583
活跃值: 活跃值 (80)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
supersoar 活跃值 2020-1-29 00:11
7
0
《加密与解密》代码二次开发这块的内容 篇幅来说确实有点少了 。
感谢分享。不过我感觉就这个步骤来说还是挺麻烦的。
游客
登录 | 注册 方可回帖
返回