PE手工编辑EXE(EXE文件手工编辑过程, PE文件格式,为EP编写的EXE源程序VC工程 )

PE手工编辑EXE(EXE文件手工编辑过程, PE文件格式,为EP编写的EXE源程序VC工程 )

工具:
ollydbg.exe, 010 Editor.exe

任务:
把EPTest.exe复制一份,名称为EPTest - 副本.exe。
运行EPTest.exe后弹出1个对话框。编辑EPTest.exe文件,弹出2次相同的对话框。

练习题:
编辑EPTest.exe文件后,弹出3次对话框,且第3次对话框上的文字是要求的字符串。

本文档最后,通过解析EXE文件的完整过程,达到对PE文件的学习和理解
1.在ollydbg.exe编辑中, 打开文件EP Test - 副本.exe
滚动到代码段第1行,注意观察00401000 - 0040103C区间的代码:
在这里插入图片描述2.在010 Editor编辑中, 打开文件EP Test.exe
选择代码段struct IMAGE_SECTION_DATA Section[0] .text:
在这里插入图片描述
3.对照ollydbg.exe中的图,在010 Editor编辑中, 选择代码复制,范围从0100-103F共4行,这是一个完整函数。
在这里插入图片描述
4.在010 Editor编辑中, 滚动代码段到空白处,即3950H处, 单击鼠标。
在这里插入图片描述
5.在010 Editor编辑中, 滚动代码段到3950H处, 单击鼠标编辑代码:
在这里插入图片描述
6.在ollydbg.exe中, 寻找到大空隙004010C3
在这里插入图片描述
7.在ollydbg.exe中, 滚动鼠标到004010C3处,进行编辑:
在这里插入图片描述
把上面编辑为右面面:
在这里插入图片描述
把8个代码C2 10 00 90 90 90 90 90 替换为E8 88 28 00 00 C2 10 00
如下图所示:
在这里插入图片描述
8.在010 Editor编辑中, 滚动代码段到10C3处, 单击鼠标编辑代码:
在这里插入图片描述
按照ollydbg.exe中的代码,在010 Editor中输入:

9.在010 Editor编辑中, 保存文件运行。开始两个文件“EP Test.exe”和“EP Test - 副本.exe ”是一样的。经过手工编辑后,大小未变,但运行结果不同:后者比前者多弹出一次对话框,就是我们编辑exe 的结果。

在这里插入图片描述
在这里插入图片描述


在010Editor中,查看RR3.EXE文件的分析结果
在这里插入图片描述
1. 第1部分长度30H:
struct IMAGE_DOS_HEADER DosHeader
在这里,指明
(1) AddressOfRelocationTable:File address of relocation table, 即IMAGE_DOS_STUB DosStub
(2) AddressOfNewExeHeader:即 struct IMAGE_NT_HEADERS NtHeader .

2.第2部分长度40H:IMAGE_DOS_STUB DosStub
无重要信息

  1. 第3部分长度F8H: struct IMAGE_NT_HEADERS NtHeader
    (1) WORD NumberOfSections: Section num
    (2) WORD SizeOfOptionalHeader:即结构的长度 struct IMAGE_OPTIONAL_HEADER32 OptionalHeader

3-1. 第3-1部分长度E0H: struct IMAGE_OPTIONAL_HEADER32 OptionalHeader
(1) DWORD SizeOfCode 3000h: 代码段长度
(2) DWORD AddressOfEntryPoint 10A0h: 代码入口点
(3) DWORD BaseOfCode 1000h: 代码段装入内存后的偏移
(4) DWORD BaseOfData 4000h: 数据段装入内存后的偏移
(5) DWORD ImageBase 400000h:整个程序装入内存后的默认段地址
(6) DWORD SizeOfImage 6000h: 整个程序装入内存后的存储空间大小(程序运行内存大小要求)
(7) DWORD SizeOfHeaders 1000h: 即:"struct IMAGE_SECTION_DATA Section[1].rdata"的长度
(8) DWORD NumberOfRvaAndSizes 16: 即结构的长度 struct IMAGE_DATA_DIRECTORY_ARRAY DataDirArray
(9) struct IMAGE_DATA_DIRECTORY_ARRAY DataDirArray:
重要项目有
(9-1) 输入信息(struct IMAGE_DATA_DIRECTORY Export)
(9-2) 输出信息(struct IMAGE_DATA_DIRECTORY Import): 使用外部DLL的描述
DWORD VirtualAddress .rdata = 0x4404: 第1个struct IMAGE_IMPORT_DESCRIPTOR ImportDescriptor[0]的地址
DWORD Size: DLL的长度
(9-3) 重定位信息(struct IMAGE_DATA_DIRECTORY BaseRelocationTable)
(9-4) 输入地址表(struct IMAGE_DATA_DIRECTORY ImportAddressTable)
(9-5) 延迟导出描述(struct IMAGE_DATA_DIRECTORY DelayLoadImportDescriptors)

  1. 第4部分长度78H: struct IMAGE_SECTION_HEADER SectionHeaders[3]: 段描述:
    (1) struct IMAGE_SECTION_HEADER SectionHeaders[0].text:代码段描述
    (2) struct IMAGE_SECTION_HEADER SectionHeaders[1].rdata:程序装入描述
    (3) struct IMAGE_SECTION_HEADER SectionHeaders[2].data: 数据段描述

4-1. 第4-1部分长度28H: struct IMAGE_SECTION_HEADER SectionHeaders[0].text:代码段描述
(1) DWORD VirtualAddress 1000h:代码段装入内存后的偏移(参见3-1-2)
(2) DWORD SizeOfRawData 3000h: 代码段长度(参见3-1-1)
(3) DWORD PointerToRawData 1000h: 代码段在文件中的开始地址

4-2. 第4-2部分长度28H: struct IMAGE_SECTION_HEADER SectionHeaders[1].rdata:程序描述段
(1) DWORD VirtualAddress 4000h: 程序描述信息装入内存的地址
(2) DWORD SizeOfRawData 1000h: 程序描述信息的大小
(3) DWORD PointerToRawData 4000h : 程序描述信息在文件中的开始地址

4-3. 第4-3部分长度28H: struct IMAGE_SECTION_HEADER SectionHeaders[2].data: 数据段描述
(1) DWORD VirtualAddress 5000h: 数据段装入内存后的开始地址
(2) DWORD SizeOfRawData 1000h: 数据段长度
(3) DWORD PointerToRawData 5000h: 数据段在文件中的开始地址
5. 第5部分: 根据需要填充00,满足对齐要求
6. 第6部分: 代码段内容 struct IMAGE_SECTION_DATA Section[0] .text
7. 第7部分: 描述段内容struct IMAGE_SECTION_DATA Section[1] .rdata
对引用的DLL进行描述等等;
(1) struct IMAGE_IMPORT_DESCRIPTOR ImportDescriptor[0] KERNEL32.dll 4404h
对引用的每一个Function进行描述:
(1-1) struct IMAGE_IMPORT_BY_NAME ImportByName[0]: GetCurrentDirectoryA
(1-2) struct IMAGE_IMPORT_BY_NAME ImportByName[1]: GetModuleHandleA
(2) struct IMAGE_IMPORT_DESCRIPTOR ImportDescriptor[1] USER32.dll 4418h
若自己手工找:
先找rdata段的前2个字节,然后索引即可找到
第1个struct IMAGE_IMPORT_DESCRIPTOR ImportDescriptor[0]的地址。

8. 第8部分: 数据段内容 struct IMAGE_SECTION_DATA Section[2] .data

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值