PE文件格式分析

Posted lqerio

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PE文件格式分析相关的知识,希望对你有一定的参考价值。

第一阶段: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,对比,确认一致

 

技术图片

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中修改

 

技术图片
 

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中的大小。

以上是关于PE文件格式分析的主要内容,如果未能解决你的问题,请参考以下文章

PE文件格式偏移参考

PE 格式详解与试验

PE 格式详解与试验

实验1 可移植可执行文件格式应用

PE文件和COFF文件格式分析——签名COFF文件头和可选文件头2

PE格式:分析IatHook并实现