现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

基于PEview分析PE文件

2017-04-19 08:48 工业·编程 ⁄ 共 3148字 ⁄ 字号 暂无评论

1 PE文件

1.1 PE文件简介

PE文件是Portable Executable(可移植的可执行文件)的简写。EXE、DLL、SYS、COM都是PE文件,PE文件是微软Windows操作系统上的程序文件。

1.2 PE文件格式

PE文件都有相同的格式,其格式如图1所示。

2017041901

图1 PE文件格式

从图1可以看出,PE文件主要包含头和数据部分,其中可以将头部看作是数据的索引。而头部又包含了DOS头、NT头和Section头三部分。DOS头包含了MZ文件头和DOS块两部分。所以,PE文件格式的详细划分,如图2所示。

2019041902

图2 PE文件的详细格式

2 PEview软件

PEview.exe工具是一款可以进行PE文件解析的强大PE文件解析工具。通过PEview软件,我们一起来分析PE文件的详细格式。

3 PE文件的DOS头

在VS2015中,新建一个控制台程序,不输入任何代码,编译生成exe文件,该exe文件就是一个PE文件。

3.1 通过PEview查看PE文件格式

通过PEview.exe打开该exe文件,如图3所示。

2017041904

图3PEview查看PE文件

从图3中可以看到,左侧的树形控件显示了PE文件的格式,而右侧则显示的是PE文件的头部和数据的具体内容。

3.2 DOS头

PE文件头部中的DOS头分为MZ文件头和DOS块,如图3所示,分别对应的是IMAGE_DOS_HEADER和MS-DOS Stub Program。

3.2.1 IMAGE_DOS_HEADER头

IMAGE_DOS_HEADER头的大小是64个字节,如图4所示。

2017041905

图4 IMAGE_DS_HEADE头数据

其中,前两个字节0x4D和0x5A,是字母“M”和“Z”的ASCII码,是MS-DOS设计者Mark Zbikowski的姓名缩写。最后四个字节,表示下一个头部,即NT头的偏移地址,从图4中可以看到,该值是0x000000E8,即NT头的起始地址是0x000000E8。这两个标志之间的是PE文件在MS-DOS环境下运行时所需要的一些参数,在图3所示的界面中,点击左侧树形控件中的“IMAGE_DOS_HEADER”,在右侧既可以看到这些参数的具体值,如图5所示。

2019041906

图5 IMAGE_DOS_HEADER参数值

3.2.2 DOS块

DOS块跟在IMAGE_DOS_HEADER后面,如图3所示。其中,“MS-DOS stub Program”即为DOS块。从字面上理解,DOS块是一个在DOS环境下可以运行的程序,在图3所示的界面中点击左侧的“MS-DOS stub Program”,则会在右侧显示该程序的数据,如图6所示。

2019041907

图6 MS-DOS stub Program头

从图6可以看出,“MS-DOS stub Program”中包含了一个字符串,当PE文件在DOS环境下运行时,就会显示该字符串,即“This program cannot be run in DOS mode”,来提示用户PE程序必须在Windows下才能运行。

4 PE的NT头

点击PEview左侧树形控件中的“IMAGE_NT_HEADERS”左侧的“+”,展开NT头结构,如图7所示。

2017041908

图7 NT头结构

从图7中可以看到,NT头包括Signatrue、IMAGE_FILE_HEADER和IMAGE_OPTIONAL_HEADER三部分。

4.1 Signatrue

在图7中,选中“Signatrue”,在右侧显示了该部分的内容,如图8所示。

2017041909

图8 Signatrue的值

从图8可以看出,Signatrue共4个字节,其值为0x00004550,即为字符串“PE”,因此Signatrue也叫做PE文件的文件签名,标志该文件的类型为PE。

4.2 IMAGE_FILE_HEADER

单击图7中的“IMAGE_FILE_HEADER”,在右侧可以看到该部分的内容,如图9所示。

2017041910

图9 IMAGE_FILE_HEADER内容

从图9中可以看出,IMAGE_FILE_HEADER部分共20字节。其中0x000000EC-0x000000ED,这两个字节表示机器类型,用于标识CPU的类型,0x014C表示CPU为Intel 386或后继处理器及其兼容处理器;0x000000EE-0x000000EF表示节的数目,0x0009表示本应用程序有9个节(section),从图3左侧中可以看出,本应用程序确实有9个节(section);0x000000F4-0x000000FB这8个字节已经不再使用,因此将这8个字节都设置为0;0x000000FC-0x000000FD,这两个字节是IMAGE_OPTIONAL_HEADER,即NT头的第三部分的大小,其值为0x00E0;0x000000FE-0x000000FF,这两个字节指定了文件特征值,其值为0x0102,其16位的含义均不同。

4.3 IMAGE_OPTIONAL_HEADER

单击图7中的“IMAGE_OPTIONAL_HEADER”,在右侧可以看到该部分的内容,如图10所示。

2017041911

图10 IMAGE_OPTIONAL_HEADER内容

从图10中可以看出,IMAGE_OPTIONAL_HEADER头由两部分组成,分别是0x0000012E-0x0000015F的参数部分和0x00000160-0x000001DF的数据目录部分。其中参数部分包含了产生该PE文件的连接器版本号、代码基地址、数据基地址、镜像基地址等信息;数据目录部分包含了导出表、导入目录表、资源表等地址和大小。

5 节(section)头

从图3可以看出,PE文件的NT头之后就是节(section)头,每个节头的大小是40字节。在“4.2 IMAGE_FILE_HEADER”中提到,本PE文件包含9个节,可以从图3中找到这9个节对应的节头。表1列出了各节头的对应节的内容。

表1 节头对应节的内容

2017041912

5.1 节头的格式

在PEview左侧的树形控件中选择IAMGE_SECTION_HEADER.text,即默认代码节的节头,在右侧可以看到默认代码节的节头格式,如图11所示。

2017041913

图11 IAMGE_SECTION_HEADER.text结构

其中,Name表示节头的名称,其大小为8个字节;Virtual Size表示节头对应的节的大小,其大小为4个字节;RVA是Relative Virtual Address的简称,即相对虚拟地址,指定了节头对应节的RVA,其大小为4个字节;Size of Raw Data指的是磁盘文件中已经初始化数据的大小,其大小为4个字节;Pointer to Raw Data、Pointer to Relocations和Pointer to Line Numbers分别保存了节中数据起始地址、重定位项起始地址和行号信息数量的地址,大小均为4个字节;Number of Relocations和Number of Line Numbers分别表示节中重定位项的数量和行号信息的数量,大小均为2个字节,Characteristics是描述节特征的标志,大小为4个字节。

5.2 Characteristics节特征格式
在“5.1 节头的格式”中提到,Characteristics是描述节特征的标志,其大小为4个字节,共32位,每位的含义如表2所示。

                                                                          表2 Characteristics各位含义

2017041914

从图11可以看出,该PE文件的Characteristics的值是0x20000060,即10 0000 0000 0000 0000 0000 0110 0000‬,对应表2可以看出,该PE文件的默认代码节中包含了可执行代码、已初始化数据,并且该节可以作为代码执行。

给我留言

留言无头像?