小论PE结构

前面在二进制文件中小提了一下PE结构,只是皮毛,这里在做一些添加。

PE文件的概念

弱弱的解释一下:PE(Portable Executable)文件称为可移植的可执行的文件,是微软Windows操作系统上的程序文件,包括EXE、DLL、SYS等。

PE文件的结构

主要就是下图所示的三大块儿

PE结构之DOS头

所有的PE文件都是以一个64字节的DOS头开始。这个DOS头只是为了兼容早期的DOS操作系统。

PE结构之PE文件头

PE文件头是PE文件格式各部分中信息以及结构较为复杂的一个部分,主要包含三部分:

PE文件标志

映像文件头

* 可选文件头
  • PE文件标志是一个常量,即“PE00”,它标志着PE文件头的开始,同时它也是PE文件的一个主要标识。可以通过DOS头中e_lfanew找出该标志的位置。
  • 映像文件头,它紧跟在PE文件标识的后面,映像文件头是一个结构体。

Machine代表着改程序要执行在的计算机的类型;NumberOfSections表明了该PE文件的节数,该值与表的数量以及节表的数量应保持一致;SizeOfOptionalHeader表明了可选映像头的大小。

  • 可选映像头,尽管名字是可选映像头,但是事实上它并不是可选而是必须存在的,是“必选”的。

PE结构之节表

节表是紧挨着NT映像头的一结构数组,它的数量与节的数量是一致的,也与映像头文件中NumberOFSections是一致的。

PE结构之节信息

这里在前面也提及到了,PE文件格式把可执行文件分成若干个数据节(section),不同的资源被存放在不同的节中,PE文件中的节类型包括:

  • .text 由编译器产生,存放着二进制的机器代码,也是反汇编和调试的对象
  • .data 初始化的数据块,如宏定义、全局变量等
  • .idata 可执行文件所使用的动态链接库等外来函数与文件的信息
  • .rsrc 存放程序的资源,如图标、菜单等
  • .reloc、edata、.rdata等

PE文件的查看

注意,分析一波,在此之前贴一个PE图,参照这个进行分析:

OK,随机打开一个PE可执行文件。

上图的1标记处看出MZ长度虽然不定,但是E-lfanew的位置却是定的,在3ch处,这个很关键,因为PE文件头部就是有e_lfanew定位的.

那从上面的3ch处发现了PE文件头的位置就在00E8,是不是呢?继续往下看。图的2标记处看出DOS处长度不定。

上图可以看出DOS的所占很长,基于E-lfanew偏移大小为ACH,后面就是PE文件头所在位置,也的确就在00E8处。

最后看图的3标记处,也就是说PE文件后缀所在位置,那标准位置就是基于PE头偏移04h+14h-2h=16h处
也就是下图选中的位置。

下面再看看节的信息,就以.text为准吧。看看PE结构表。

如上图所示,偏移量在字节表头地址偏移14h后面。那就在右边找到.text字节位置处。向后找14h处偏移,得到.text节基于PE文件的偏移为0400
,如下图所示。

验证一下,转到0400地址处,的确是.text节的存储数据。如下图所示:

最后贴上整理比较详细的一些PE结构讲解:

Contents
  1. 1. PE文件的概念
  2. 2. PE文件的结构
    1. 2.1. PE结构之DOS头
    2. 2.2. PE结构之PE文件头
    3. 2.3. PE结构之节表
    4. 2.4. PE结构之节信息
  3. 3. PE文件的查看
|