查看: 209|回复: 0

[原创图文] PE结构_PE头

[复制链接]

12

主题

29

帖子

1

精华

VIP

Rank: 16

学币
139
荣耀
0
rank
100
违规
0
发表于 2020-11-12 16:50:16 | 显示全部楼层 |阅读模式
PE结构_PE头
前言
该文章前半部分讲解整个PE的结构。然后我们来解析一段程序字节码来加深PE结构的理解。
天象独行
注意:该文章说明的是32bit的PE结构。本质上64bit 结构(PE32+)与32bit结构上没有区别。区别在于修改了几个域,将原来的域扩展到64bit而已。

一;PE结构框架
PE结构简单来说就是由一系列有组织的数据的集合组成的。下面我们直接来看下图来了解PE文件的基本结构框架。

PE结构_PE头

PE结构_PE头
我们先看图当中右边的部分,我们可以看到整个PE结构由DOS头,PE头,节表(因为翻译的不同,部分文章当中用“块”表示,同一个含义),节内容组成。接下来,我们分别来看看这些结构由什么作用。

DOS MZ头和DOS Stub
第一部分Dos头主要是为了兼容DOS系统所遗留下来的产物。它里面包含了“DOSMZ头”和“DOS Stub”两个部分。其中DOS MZ头它的定义数据结构名称为IMAGE_DOS_HEADER。
下图为该数据结构的描述。DOS Stub 当中包含了一些DOS指令。

PE结构_PE头

PE结构_PE头

IMAGE_NT_HEADERS
第二部分PE头的数据结构定义为IMAGE_NT_HEADERS。(如下图查看)

PE结构_PE头

PE结构_PE头

数据结构IMAGE_NT_HEADERS当中包含了Signature,IMAGE_FILE_HEADER,IMAGE_OPTIONAL_HEADER32,IMAGE_DATA_DIRECTORY。当中后三个包含的内容本身也是一个数据结构(数据结构当中嵌套数据结构形式)

PE头标志Signature
PE头标志Signature是标志着PE头的开始位置。占位四个字节,这个位置的地址保存在DOS MZ头当中最后一个元素(IMAGE_DOS_HEADER.e_lfanew)。

标准PE头IMAGE_FILE_HEADER
       Signature标识之后紧接着就是标准PE头内容。整个IMAGE_FILE_HEADER数据结构(标准通用对象文件格式COFF)占位20字节。该结构当中记录了PE文件的全局属性详细如下图:

PE结构_PE头

PE结构_PE头

扩展PE头IMAGE_OPTIONAL_HEADER32       该结构同样是定义了一些属性。详细如下图:      

PE结构_PE头

PE结构_PE头

PE结构_PE头

PE结构_PE头



数据目录项IMAGE_DATA_DIRECTORY
       在扩展PE头数据结构当中最后一个元素“DataDirectory”定义了数据目录项。数据目录项本身也是一个数据结构。其中记录了不同类型的数据的目录信息。比如:导出表,导入表,资源,重定位表等。下面我们来看看具体结构:

PE结构_PE头

PE结构_PE头

节表项IMAGE_SECTION_HEADER
       PE头下面紧接着就是节表,节表当中记录着特定的节有关的信息。(节的属性,节的大小,在文件和内存中的起始位置)
       节表当中节的数量IMAGE_FILE_HEADER.NumberOfSections。下面我们来看看节表的数据结构的定义:

PE结构_PE头

PE结构_PE头

二;案例
       下面我们来打开一个应用程序来看看他们的PE结构
注释:下面标注出来常用的内容
       首先我们来查看一下DOS头内容。着重查看“MZ标识”和“PE头位置”。我们可以在DOS MZ 数据结构的定义当中可以知道”MZ”标志位是第一个元素,并且类型属于WORD。占用两个字节。“PE头位置”定义在最后一个元素,类型是DWORD。占用四个字节。那么我们查看下图:

PE结构_PE头

PE结构_PE头
       DOS Strub 是存放一些DOS指令,这里我们不去查看它。既然我们通过DOSMZ数据结构的最后一个元素知道了PE头的地址(起始地址0000 00 b0)那么现在我们跳转进入PE头来查看。
       我们都知道PE头的数据结构IMAGE_NT_HEADERS。当中定义了三个元素。DWORD类型元素Signature,数据结构类型IMAGE_FILE_HEADER(标准PE头),数据结构类型IMAGE_OPTIONAL_HEADER32(扩展PE头)。其中标准PE头占用20个字节,扩展PE头占用216个字节。下面我们来看看PE头的大体位置:

PE结构_PE头

PE结构_PE头
       注释:因为Intel兼容机采用的是小端法。所以存储在硬盘文件当中有效位放在最低位。举例:PE头标签在硬盘/(内存)存储位00004550h
      现在我们从图中大概可以了解了PE头文件大体的位置,那么现在我们逐步分析一下其中内容:
       PE头标签(IMAGE_NT_HEADER.Signature)的RVA地址为0000h,且为DWORD类型。所以占用四个字节。通过查看发现。该位置存储的内容为十六进制值为“00004550h”
       标准PE头(IMAGE_NT_HEADER.FileHeader)的RVA地址为00004h,且它是一个数据结构,占位是20个字节。那么我们来看看该数据结构IMAGE_FILE_HEADER。

       IMAGE_FILE_HEADER.Machine 是标准PE头当中的第一个元素。它是一个WORD数据类型。表示PE文件的运行平台。从图中我们可以知道它的值为014Ch。它的具体含义如下表:

PE结构_PE头

PE结构_PE头
       IMAGE_FILE_HEADER.NumberOfSections 元素是一个WORD类型数据,且RVA的值为0006h。它表示的含义是PE中节的数量。我们来在图中查看一下:

PE结构_PE头

PE结构_PE头
       IMAGE_FILE_HEADER.TimeDateStamp 元素是一个DWORD数据类型,且RVA的值为0008h。它表示编译器创建此文件时的时间戳。值为“5F8D9A37h”如下查看

PE结构_PE头

PE结构_PE头
       下面我们在来看看IMAGE_FILE_HEADER.Characteristics 元素,它是一个单字数据类型。偏移量为0016h。表示为文件属性标志字段。它是用二进制的位为1表示具备对应位置的权限。详细如下表:

PE结构_PE头

PE结构_PE头

PE结构_PE头

PE结构_PE头
       标准PE头之后紧接着就是扩展PE(IMAGE_OPTIONAL_HEADER32)头。同样对照着数据结构定义来寻找具体元素位置。这里我们着重来看看扩展PE头当中最后一个元素”DataDirectory”它同样也是一个数据结构。表示数据目录(IMAGE_DATA_DIRECTORY)
数据目录当中包含了不同类型的数据的目录信息。它是由16个IMAGE_DATA_DIRECTORY结构组成的。

       下图描述了数据目录的起始位置:

PE结构_PE头

PE结构_PE头
       数据目录项紧接这就是节表的内容,之后就是节内容。下面就不继续查看。






温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
学逆向论坛-免费的逆向学习论坛
微信公众号
快速回复 返回顶部 返回列表