文档介绍:PE 文件格式 PE 文件格式系列译文之一---- 【翻译】“ PE 文件格式” 版完整译文(附注释) ========================================================= 原著: Bernd. Luevelsmeyer 翻译: ah007 [ 注意: 本译文的所有大小标题序号都是译者添加, 以方便大家阅读。圆圈内的数字是注释的编号, 其中注释②译自微软的《 PECOFF 规范》, 其它译自网络。---- 译者] 一、前言( Preface ) ------------------ PE(“ portable executable ”,可移植的可执行文件)文件格式, 是微软 WindwosNT,Windows9 5和 Win3 2 子集①中的可执行的二进制文件的格式;在 WindowsNT 中, 驱动程序也是这种格式。它还能被应用于各种目标文件②和库文件中。这种文件格式是由微软设计的, 并于 1993 年被 TIS ( tool interface standard, 工具接口标准)委员会( 由 Microsoft,Intel,Borland,,IBM, 等等组成)所批准,它明显的基于 COFF 文件格式的许多知识。 COFF (“ common object file fromat ”, 通用目标文件格式) 是应用于好几种 UNIX 系统③和 VMS ④系统中的目标文件和可执行文件的格式。 Win32 SDK ⑤中包含一个名叫<> 的头文件, 其中含有很多用于 PE 格式的#define 和 typedef 定义。我将逐步地提到其中的很多结构成员名字和#define 定义。你也可能发现 DLL 文件“ ”很有用途, 它是 WindowN T 的一部分,但其书面文件却很缺乏。它的一些功用在“ work ”(开发者网络)中有所描述。二、总览( General Layout ) ------------------------- 在一个 PE 文件的开始处, 我们会看到一个 MS-DOS 可执行体( 英语叫“ stub ”, 意为“根,存根”);它使任何 PE 文件都是一个有效的 MS-DOS 可执行文件。在 DOS- 根之后是一个 32 位的签名以及魔数 0x00004550 (IMAGE_NT_SIGNATURE) ( 意为“ NT 签名”, 也就是 PE 签名; 十六进制数 45和 50 分别代表 ASCII 码字母 E和 P---- 译者注)。之后是文件头(按 COFF 格式),用来说明该二进制文件将运行在何种机器之上、分几个区段、链接的时间、是可执行文件还是 DLL 、等等。( 本文中可执行文件和 DLL 文件的区别在于: DLL 文件不能被启动, 但能被别的二进制文件使用, 而一个二进制文件则不能链接到另一个可执行文件。) 那些之后, 是可选头( 尽管它一直都存在, 却仍被称作“可选”---- 因为 COFF 文件格式仅为库文件使用一个“可选头”,却不为目标文件使用一个“可选头”,这就是为什么它被称为“可选”的原因) 。它会告诉我们该二进制文件怎样被载入的更多信息:开始的地址呀、保留的堆栈数呀、数据段的大小呀、等等。可选头的一个有趣的部分是尾部的“数据目录”数组; 这些目录包含许多指向各“节”数据的指针。例如: 如果一个二进制文件拥有一个输出目录,那么你就会在数组成员“ IMAGE_DIRECTORY_ENTRY_EXPORT ”( 输出目录项) 中找到一个指向那个目录的指针,而该指针指向文件中的某节。跟在各种头后面我们就发现各个“节”了,它们都由“节头”引导。本质上讲, 各节中的内容才是你执行一个程序真正需要的东西, 所有头和目录这些东西只是为了帮助你找到它们。每节都含有和对齐、包含什么样的数据(如“已初始化数据”等等)、是否能共享等有关的一些标记, 还有就是数据本身。大多数( 并非所有) 节都含有一个或多个可通过可选头的“数据目录”数组中的项来参见的目录, 如输出函数目录和基址重定位目录等。无目录形式的内容有:例如“可执行代码”或“已初始化数据”等。+-------------------+ | DOS-stub | --DOS- 头+-------------------+ | file-header | -- 文件头+-------------------+ | optional header | -- 可选头|--------- -| ||| data directories | -- 数据目录|| +-------------------+ ||| section headers | -- 节头|| +-----