今天给大家分享一下如何使用“PE文件加区段工具”、“LordPE”、“WinHex”、“OllyDbg”为PE文件添加section、dll(API)
打开搜狗浏览器搜狗搜索->PE文件加区段工具,点击普通下载。
其他浏览器下载方法类似。
下载方法同上
官方下载链接:http://www.winhex.com/winhex/
官方下载地址:http://www.ollydbg.de/
自建Hello world.exe,如果是其他重要EXE文件,请先做好备份
2、点击“查看区段”按钮,查看已有区段
4、再次点击“查看区段”按钮,查看现有区段
5、点击“测试运行”按钮,查看EXE文件是否能正常运行,或在cmd命令下查看是否能正常运行
6、退出程序
使用LordPE给EXE增加section
删除上一步使用的EXE可执行文件,使用hello world源程序再次生成EXE可执行文件
2、在弹出界面,点击“区段”按钮,查看已有区段
3、选中最后一个区段“.reloc”,右击,选择“添加区段”,新增区段名为“.NewSec”
4、选中新增区段,右击,选择“编辑区段”
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之后的数据删除即可
使用“WinHex”给EXE添加section
步骤与上一种方法相类似,只需将相应字段修改即可,之后操作相同。
三、添加Dll(API)
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字符串,表明添加成功,至此,添加完毕
注:由于有地址随机化的保护机制,我们的地址也是直接写入,所以直接保存再次打开则将出错,若想不出错,则可以在添加代码时,将所有地址全部计算偏移地址带入,使得程序下次执行程序时根据偏移地址查找相关内容
一、准备工具
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、点击“查看区段”按钮,查看已有区段
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
其中0x0107600E处的内容为CALL DWORD PTR DS:[1077019],0x7019为我们添加的API的偏移地址
0x01076014处的内容为JMP 0107155D,0x155D为未修改前的程序执行入口点
8、按下F8单步步过(或F9)去执行我们添加的API,根据执行结果,可判断我们添加成功
9、继续执行JMP跳转指令,返回原程序,并且成功输出了HelloWorld字符串,表明添加成功,至此,添加完毕
注:由于有地址随机化的保护机制,我们的地址也是直接写入,所以直接保存再次打开则将出错,若想不出错,则可以在添加代码时,将所有地址全部计算偏移地址带入,使得程序下次执行程序时根据偏移地址查找相关内容
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello world!\n");
return 0;
}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!