0.介绍

PE是Windows操作系统使用的可执行文件格式。它是微软在UNIX平台的COFF(Common Object File Formxat,通用对象格式)基础上而成的(在Windows开发环境中,PE格式也称为PE/COFF格式。)。最初(正如Portable这个单词所代表的那样)设计用来提高程序在不同操作系统上的移植性,但实际上这种文件格式仅使用在Windows系列的操作系统。

PE文件是指32位的可执行文件,也称为PE32。64位的可执行文件称为PE+或PE32+,是PE(PE32)的一种扩展形式(注意不是PE64)。

事实上,一个文件是否是PE文件与其扩展名无关,即表明PE文件可以是任何扩展名。


1.PE文件格式

PE文件格式种类:

  • 可执行系列:EXE/SCR
  • 驱动程序系列:SYS/VXD
  • 库系列:DLL/OCX/CPL/DRV
  • 对象文件系列:OBJ

注:严格来讲,OBJ(对象)文件之外的所有文件都是可执行的。DLL/SYS文件等虽然不能直接在Shell(Explorer.exe)中运行,但可以使用其他方法(调试器、服务等)执行。


2.基本结构

从DOS头(DOS Header)到节区头(Section Header)是PE头部分,其下的节区合成PE体。文件中使用偏移(offset),内存中使用VA(Vitual Address,虚拟地址)来表示位置。文件加载到内存时,情况就会发生变化(节区的大小、位置等)。文件的内容一般可分为代码(.text)、数据(.data)、资源(.rsrc)节,分别保存。

注:有不同种开发工具(VB/VC++/…)与编译选项,节区的名称、大小、个数、储存的内容都是不同的。它们根据不同的用途分类保存到不同的节中。

各节区头定义了各节区在文件或内存中的大小、位置、属性等。

PE头与各节区的尾部存在一个区域,称为NULL填充(NULL padding)。(PE文件中文件/内存中节区的起始位置应该在各文件/内存最小单位的倍数位置之上,空白区域将用NULL填充。)


3.VA&RVA

VA指的是进程虚拟内存的绝对地址,RVA(Relative Virtual Address,相对虚拟地址)指从某个基准位置(ImageBase)开始的相对地址。VA与RVA满足下面的换算关系。

RVA+ImageBase=VA

PE头内部大多都以RVA形式存在,原因在于,PE文件(主要是DLL)加载到进程虚拟内存的特定位置时,该位置可能已经加载了其他的PE文件(DLL)。此时必须通过重定位将其加载到其他空白的位置,若PE头信息使用的是VA,则无法正常访问。因此使用了RVA来定位信息,即使发生了成定位,只要相对于基准位置的相对地址没有变化,就能正常访问到指定信息,就不会出现任何问题。