翻译 Microsoft可移植可执行文件和通用目标文件格式文件规范v8.1修订版(Microsoft Portable Executable and Common Object File Format Specification Revision 8.1)收藏

新一篇: 关于_ValidateEH3RN | 旧一篇: Windows加载器与模块初始化(Windows Loader and the Module Initialization)

Microsoft可移植可执行文件和通用目标文件格式文件规范
修订版8.1 - 2008年2月15日
摘要
本规范描述了Microsoft® Windows®操作系统家族下的可执行文件(映像)和目标文件的结构。这些文件分别被称为可移植可执行(PE)文件和通用目标文件格式(COFF)文件。
注意:提供本文档是为了辅助开发用于Microsoft Windows操作系统上的工具和应用程序,但并不保证它在各个方面都是完整的规范。Microsoft保留更改本文档而不通知的权利。
 
Microsoft可移植可执行文件和通用目标文件格式文件规范的此次修订版取代了本规范的6.0修订版。
本规范中的信息适用于以下操作系统:
    Windows Server
® 2008
    Windows Vista®
    Windows Server 2003
    Windows XP
    Windows 2000
本规范最后列出了参考信息和相关资源。
本规范的最新版在万维网的以下地址被维护:
http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx
 
 
 
 
SmartTech译
电子信箱:zhzhtst@163.com
 
法律声明

Microsoft可移植可执行文件和通用目标文件格式文件规范
Microsoft Corporation
修订版 8.1
 
注意:提供本规范是为了辅助开发某些用于Microsoft Windows操作系统平台上的开发工具。但是Microsoft并不保证它在各个方面都是完整的规范,也无法保证这里的所有信息在发布之后一直都是准确的。Microsoft保留更改本规范而不通知的权利。
 
在合理的和非歧视性条款和条件下,Microsoft将针对任何Microsoft认为仅在面向Microsoft Windows的被称为编译器、链接器以及汇编程序的软件开发工具中实现和遵守本规范中所需部分这种有限用途下所需要的Microsoft权利要求书(如果存在)授予您免版税许可。
 
遵守所有适用的版法是用任。在不限制版权许可权利的前提下,未Microsoft明确可,不得出于任何目的或以任何形式或任何手段(子、机械、影印、记录或其他方法)制本规范的任何部分,或者将其存或引入索系,或者修改或用于其衍生作品,或者将其播。
 
于本规范中的主Microsoft可能拥有识产权。除非可中明确定,否提供本规范并不意味着Microsoft通过暗示、默许或其它方式针对这些知识产权和其它权利授予您任何许可。
 
© 2005-2008 Microsoft Corporation。保留所有权利。
 
本规范依“原样”提供。Microsoft不针对下列情形作任何明示的、暗示的或者法定的表示或担保:(1)本规范中的信息,包括对适销性、针对特定目的的适用性、不侵权或所有权的担保;(2)本规范中的内容适用于任何用途;(3)对这些内容的实现不会侵犯任何第三方的专利、版权、商标或其它权利。
 
Microsoft不就由本规范及其相关的使用或分发所带来的任何直接的、间接的、特别的、偶然的或者后果性的损害负任何责任。
 
MicrosoftMS-DOSMSDNVisual StudioVisual C++Win32 WindowsWindows NTWindows ServerWindows Vista是Microsoft Corporation在美国和/或其它国家的注册商标或商标。这里提到的其它产品和公司名称可能是其各自所有者的商标。
 
于上述名称和商,在没有事先得到其各自所有者明确可的情况下,不得以任何方式使用,包括广告或宣范及其内容。
 
文档更新历史记录:
日期
更改
2/15/2008
更新了5.7节,并将附录A移到了“Windows Authenticode可移植可执行签名格式”中
5/18/2006
创建
 

目录
 
1基本概念
本文档详细说明了Microsoft® Windows®操作系统家族下的可执行文件(映像)和目标文件的结构。这些文件分别被称为可移植可执行(PE)文件和通用目标文件格式(COFF)文件。“可移植可执行”这个名称道出了这种格式与平台体系结构无关的事实。
下表描述了贯穿于本规范中的一些概念:
名称
描述
属性证书
用来将可校验的声明与映像关联起来的证书。有许多不同的可校验声明可以与文件关联,最常用的一种就是软件制造商用来指明映像的消息摘要是什么的声明。消息摘要与校验和类似,但想要伪造它却极其困难。因此对一个文件进行修改并保持它的消息摘要与原始文件一致是非常困难的。正如制造商所做的那样,可以使用公钥或私钥加密机制来校验声明。本文档除了描述允许将它们插入到映像文件中外还描述了有关属性证书的详细信息。
日期/时间戳
由于不同目的而用于PE或COFF文件中好几个地方的戳。戳的格式与C运行时库时间函数所使用的戳的格式相同。
文件指针
某项内容在文件被链接器处理前(如果是目标文件文件)或者被加载器处理前(如果是映像文件)在文件自身中的位置。换句话说,这是一个位于存储在磁盘上的文件中的位置。
链接器
指的是随Microsoft Visual Studio®提供的链接器。
映像文件
可执行文件:或者是.EXE文件,或者是DLL。映像文件可以被认为是“内存映像”。术语“映像文件”经常用来代替“可执行文件”,因为后者有时仅用来指代.EXE文件。
目标文件
作为链接器的输入的文件。链接器生成一个映像文件,而这个映像文件又作为加载器的输入。
保留,必须为0
对一个域的这种描述表明,对于生成这个域的程序来说必须将这个域设置为0,对于使用这个域的程序来说必须忽略它的值。
RVA
相对虚拟地址。对于映像文件来说,它是某项内容被加载进内存后的地址减去映像文件的基地址。某项内容的RVA几乎总是与它在磁盘上的文件中的位置(文件指针)不同。
对于目标文件来说,RVA并没有什么意义,因为内存位置尚未分配。在这种情况下,RVA是一个节(后面将要描述)中的地址,这个地址在以后链接时要被重定位。为了简单起见,编译器应该将每个节的首个RVA设置为0。
节是PE或COFF文件中代码或数据的基本单元。例如一个目标文件中所有代码可以被组合成单个节,或者(依赖于编译器的行为)每个函数独占一个节。增加节的数目会增加文件开销,但是链接器在链接代码时有更大的选择余地。节与Intel 8086体系结构中的段非常相似。一个节中的所有原始数据必须被加载到连续的内存中。另外,映像文件可能包含一些具有特殊用途的节,例如.tls节或.reloc节。
VA
虚拟地址。除了不减去映像文件的基地址外,与RVA相同。这个地址之所以被叫做“虚拟地址”是因为Windows为每个进程创建一个私有的虚拟地址空间,它独立于物理内存。无论出于何种目的,VA都只应该被认为是一个地址。VA并不能像RVA那样能够预先得到,因为加载器可能不把映像加载到它的首选位置上。
2概览
 
1 解释了Microsoft PE可执行文件格式:
MS-DOS 2.0 兼容
EXE 文件头
 
映像头基地址
未使用
 
 
OEM 标识
OEM 信息
 
PE文件头偏移
 
 
 
MS‑DOS 2.0
(仅用于MS­‑DOS兼容)
MS‑DOS 2.0占位程序
 
重定位表
 
 
未使用
 
 
PE 文件头
(按8字节边界对齐)
 
 
 
节头
 
 
 
 
 
映像页:
导入信息
导出信息
基址重定位信息
资源信息
 
 
 
图 1.典型的可移植EXE文件布局
 
2 解释了Microsoft COFF目标模块格式:
Microsoft COFF文件头
 
 
 
 
节头
 
 
 
 
 
原始数据:
代码
数据
调试信息
重定位信息
 
 
 
图 2. 典型的COFF目标模块布局
3文件头
PE文件头由Microsoft MS‑DOS®占位程序、PE文件签名、COFF文件头以及可选文件头组成,COFF目标文件头由COFF文件头和可选文件头组成。在这两种情况下,文件头后面紧跟着的都是节头。
3.1 MS‑DOS占位程序(仅适用于映像文件)
MS‑DOS占位程序是一个运行于MS‑DOS下的合法应用程序,它被放在EXE映像的最前面。链接器在这里放一个默认的占位程序,当映像运行于MS‑DOS下时,这个占位程序显示“This program cannot be run in DOS mode(此程序不能在DOS模式下运行)”这条消息。用户可以使用/STUB链接器选项来指定一个不同的占位程序。
在位置0x3C处,这个占位程序包含PE文件签名的偏移地址。此信息的存在使得即使映像文件中有一个MS‑DOS占位程序,Windows仍然能够正常执行它。这个文件偏移是在链接时被放在0x3C处的。
3.2签名(仅适用于映像文件)
在MS‑DOS占位程序后面、在偏移0x3C指定的文件偏移处,是一个4字节的签名,它用来标识文件为一个PE格式的映像文件。这个签名是“PE\0\0”(字母“P”和“E”后跟着两个空字节)。
3.3 COFF文件头(适用于目标文件和映像文件)
在目标文件的开头,或者紧跟着映像文件签名之后,是一个如下格式的标准COFF文件头。注意Windows加载器限制节的最大数目为96。
偏移
大小
描述
0
2
Machine
标识目标机器类型的数字。要获取更多信息,请参考3.3.1节“机器类型”。
2
2
NumberOfSections
节的数目。它给出了节表的大小,而节表紧跟着文件头。
4
4
TimeDateStamp
从UTC时间1970年1月1日00:00起的总秒数(一个C运行时time_t类型的值)的低32位,它指出文件何时被创建。
8
4
PointerToSymbolTable
COFF符号表的文件偏移。如果不存在COFF符号表,此值为0。对于映像文件来说,此值应该为0,因为已经不赞成使用COFF调试信息了。
12
4
NumberOfSymbols
符号表中的元素数目。由于字符串表紧跟符号表,所以可以利用这个值来定位字符串表。对于映像文件来说,此值应该为0,因为已经不赞成使用COFF调试信息了。
16
2
SizeOfOptionalHeader
可选文件头的大小。可执行文件需要可选文件头而目标文件并不需要。对于目标文件来说,此值应该为0。要获取可选文件头格式的详细描述,请参考3.4节“可选文件头(仅适用于映像文件)”。
18
2
Characteristics
指示文件属性的标志。对于特定的标志,请参考3.3.2节“特征”。
3.3.1机器类型
Machine域可以取以下各值中的一个来指定CPU类型。 映像文件仅能运行于指定处理器或者能够模拟指定处理器的系统上。
常量
描述
IMAGE_FILE_MACHINE_UNKNOWN
0x0
适用于任何类型处理器
IMAGE_FILE_MACHINE_AM33
0x1d3
Matsushita AM33处理器
IMAGE_FILE_MACHINE_AMD64
0x8664
x64处理器
IMAGE_FILE_MACHINE_ARM
0x1c0
ARM小尾处理器
IMAGE_FILE_MACHINE_EBC
0xebc
EFI字节码处理器
IMAGE_FILE_MACHINE_I386
0x14c
Intel 386或后继处理器及其兼容处理器
IMAGE_FILE_MACHINE_IA64
0x200
Intel Itanium处理器家族
IMAGE_FILE_MACHINE_M32R