第一阶段:PE文件格式分析
使用UltraEdit观察PE文件例子程序hello-2.5.exe的16进制数据,在打印稿中画出该PE文件基本结构。
使用Ollydbg对该程序进行初步调试,了解该程序功能结构,在内存中观察该程序的完整结构。 熟悉各类PE文件格式查看和编辑工具(PEView、Stud_PE等)。
使用UltraEdit修改该程序,使得该程序仅弹出第二个对话框。
第二阶段:熟悉并分析PE文件的引出表
找到系统System32目录下的user32.dll文件,用UltraEdit打开并分析该文件引出表,找出函数MessageBoxA的地址,并验证该地址是否正确。
第三阶段:熟悉并修改PE文件的引入表结构,以及代码段和数据段
手工修改hello-2.5.exe程序,使得其可以弹出第三个对话框
用UltraEdit修改hello-2.5.exe程序的引入表,使该程序仅可以从kernel32.dll中引入LoadLibrary和GetProcAddress函数,而不从user32.dll导入任何函数。然后,在代码节中写入部分代码利用这两个函数获取MessageBoxA的函数地址,使hello-2.5.exe程序原有功能正常。
第四阶段:熟悉并修改PE文件的资源表
利用PEview.exe熟悉PEview.exe程序的资源表的结构。
用UltraEdit修改PEview.exe,使得该文件的图标变成csWhu.ico。
熟悉eXeScope工具的使用,并利用该工具汉化PEview.exe程序。
第五阶段:思考
如何打造最小的PE文件:修改WHU_PE-2.5.exe文件,保持该文件的功能不变,使得该文件大小尽可能小。
替换程序的图标时,如果新图标比原有图标大,应该如何解决?
如何给一个没有图标的程序(如hello-2.5.exe),添加一个图标?
1.PE文件格式分析
代码节
引入函数节
已初始化的数据节
OD观察结构
STUDYPE
PEview
2.修改使只弹出第二个窗口:
查看到第二个窗口RVA为1016
在PE文件可选映像头AddressofEntryPoint处(大小4字节,偏移10H)修改值为1016
原:
修改后:
效果图:
3.找到系统System32目录下的user32.dll文件,用UltraEdit打开并分析该文件引出表,找出函数MessageBoxA的地址,并验证该地址是否正确。
这里采用上课教授的PEview+STUD_PE方法
1.使用PEView打开user32.dll,查找MessageBoxA的RVA。
在AddressOfNames数组(Name Pointer Table)中找到MessageBoxA字符串,其数组序号为01DD
0000740C在EXPORT NAME 位置上是字符串 MessageBoxA
在Ordinal Table找到序号(Value)01DD项,Data为01DC。而由于Ordinal Table中Data从0开始,故在Address Table中找到第01DC+1 即01DD项
Data为407EA,也即MessageBoxA的RVA
2.得到其RVA为407EA后,用Stud_PE打开user32.dll,使用Raw与Rva转换功能,得其VA为77D507EA。
3.用OD打开hello-2.5.exe,查看MessageBoxA,对比,确认一致
![PE文件格式分析_第9张图片](http://img.e-com-net.com/image/info8/f11af47ac82840ebbad53532924903b2.jpg)
4.手工修改hello-2.5.exe程序,使得其可以弹出第三个对话框。
OD打开hello-2.5.exe
1.修改.data title和text之间用00隔开
2.修改其代码
这里注意先添加了五行,类似前两个弹窗的代码
然后将原来最后的六行下移
然后修改前三个CALL,因为可以看到三个JMP的位置已经改变了。比如MessageBoxA变成401056
然后修改最后一个call,这里call的是结束,0040104a
然后修改新框的title为00403059,这是我们刚刚在.data中添加内容的起始地址
Text为0040306E 这样就显示data段添加的内容,而不是原来的内容教学测试
然后保存
先保存.Text段
再保存.data段(保存时选中所有修改)
最后保存为文件
1.拓展
这里JMPmessagebox也是一个跳转,402008.
于是上面call messagebox的地方也可以直接call 402008
效果图:
就不放了。。效果是弹出了第三个框:
5.用UltraEdit修改hello-2.5.exe程序的引入表,使该程序仅可以从kernel32.dll中引入LoadLibrary和GetProcAddress函数,而不从user32.dll导入任何函数。然后,在代码节中写入部分代码利用这两个函数获取MessageBoxA的函数地址,使hello-2.5.exe程序原有功能正常。
1. 修改结构IMPORT Hints/Names&DLL Names
这里每一条记录前两项是序号,可选。如664H开始的00 00.
两条间用00隔开。如671H处的00.
2.修改INT
3.修改IAT
4.修改IDT
这里2092H是kernel32.dll的偏移
5.另存为hello_256.exe。用PEVIEW查看其引出节
6.修改PE头部和节表中的相关结构
先改节表:
由PEview可知其节表位置及VirtualSize位置为1D8H。A6H为原来从600H到6A5H共6AH个字节的大小。修改为9FH.
再改PE头部:
先查看IMPORT TABLE和IMPORT Address Table的位置
在UE中修改
![](http://img.e-com-net.com/image/info8/9ba1e2ee0350447eb3693c879811de71.png)
7.在OD中修改代码节和数据节
修改.data段
在“初始化数据段”添加代码段中要用到的字符串“user32.dll”和“MessageBoxA”
记录这两个字符串的RVA
user32.dll:0040 3059
MessageBoxA:0040 3064
修改.text段
注意第一行汇编为:PUSH 00403059而不是PUSH hello_256.00403059
最后JMP的部分,值为VA. 比如
JMP DWORD PTR DS:[402004]即为Loadlibrary 是刚刚在PE文件IAT中修改的。
8.先保存.Text段
再保存.data段(保存时选中所有修改)
最后保存为文件 hello_2569.exe
结果如图:
6.利用PEview.exe熟悉PEview.exe程序的资源表的结构。
如图,复制了一个PEVIEW便于修改
7.用UltraEdit修改PEview.exe,使得该文件的图标变成csWhu.ico。
在section .rsrc(资源节中)存放图标资源。
icon 1 0001 0009
在DATA_ENTRY查看
大小为668H, 1640字节
而whucs.ico大小为776字节(UltraEdit打开可知。前面OD指OLLYDBG)。可以直接替换
用UE打开whucs.ico,复制内容,粘贴到PEVIEW的0000D4C0开始的位置。
注意复制的时候不要全选,否则会造成之后的文件移位。复制到D7A7
观察可知数据从16开始复制。(“(”开始)
查看GROUP ICON开始位置为F3E4
然后复制whucs.ico的前20位(基本格式),复制到peview的 F3E4位置
之后注意修改icon id 16-->01,icon项数改为3.(因为原来就有3项)(具体字段内容见mooc)
保存为pevieww
8.熟悉eXeScope工具的使用,并利用该工具汉化PEview.exe程序。
先用exescope打开peview
修改两处File和 open
保存,查看
9.思考
1.如何打造最小的PE文件:修改WHU_PE-2.5.exe文件,保持该文件的功能不变,使得该文件大小尽可能小。
参考慕课“挑战自己:手工打造最小PE文件”
将NT映像头填充到MZ文件头和DOSstub中,保留前四个字节和入口点
删除没有用的节表,DataDirectory。删除text节和rdata节中多余空间。保留IAT。
2.替换程序的图标时,如果新图标比原有图标大,应该如何解决?
首先修改目标icon的size值。之后先计算超出多少,超出的字节后移。
然后更改之后受到影响的数据的RVA,
3.如何给一个没有图标的程序(如hello-2.5.exe),添加一个图标?
1.添加资源节节表
修改映像文件头中节表数,增加一
修改可选文件头中SizeofImage,增加2000H
在DataDrictory添加资源节的RVA
2.之后在资源节节表按照成员信息填写完成。(28H字节)
3.之后复制粘贴cs.ico的内容到icon1的偏移处。
注意修改group icon
4.添加完成后计算size,返回来修改节表的size和可选映像头中的DataDrictory中的大小。