PE文件格式详解
Windows NT 3.1引入了一种名为PE文件格式的新可执行文件格式。PE文件格式的规范包含在了MSDN的CD中(Specs and Strategy, Specifications, Windows NT File Format Specifications),但是它非常之晦涩。 然而这一的文档并未提供足够的信息,所以开发者们无法很好地弄懂PE格式。本文旨在解决这一问题,它会对整个的PE文件格式作一个十分彻底的解释,另外,本文中还带有对所有必需结构的描述以及示范如何使用这些信息的源码示例。 为了获得PE文件中所包含的重要信息,我编写了一个名为PEFILE.DLL的动态链接库,本文中所有出现的源码示例亦均摘自于此。这个DLL和它的源代码都作为PEFile示例程序的一部分包含在了CD中(译注:示例程序请在MSDN中寻找,本站恕不提供),你可以在你自己的应用程序中使用这个DLL;同样,你亦可以依你所愿地使用并构建它的源码。在本文末尾,你会找到PEFILE.DLL的函数导出列表和一个如何使用它们的说明。我觉得你会发现这些函数会让你从容应付PE文件格式的。 ### PE文件格式详解 #### 摘要与背景 Windows NT 3.1引入了一种新的可执行文件格式,称为PE文件格式。PE文件格式的标准规范可以在MSDN CD中的“Specs and Strategy, Specifications, Windows NT File Format Specifications”中找到,但这份文档描述相当晦涩难懂。因此,本文旨在通过深入解析PE文件格式的各个方面,帮助开发者更好地理解和使用PE文件格式。文章不仅包含了PE文件格式的所有必要结构描述,还提供了具体的源码示例来演示如何利用这些信息。 #### PE文件格式的历史与发展 随着Windows NT的发布,微软推出了全新的PE文件格式。这种格式是在UNIX操作系统常用的COFF(Common Object File Format)规范基础上进行改进的,同时也保留了与早期MS-DOS和Windows系统的兼容性,确保了新老系统的无缝衔接。 #### PE文件格式的组成部分 PE文件格式被组织成一系列线性的数据流,主要包括以下几个部分: 1. **MS-DOS头部**:这是PE文件格式的第一部分,与早期MS-DOS系统的文件头保持一致,用于向后兼容。 2. **PE文件标志**:紧跟在MS-DOS头部之后,是一个简单的标志,用来标识该文件为PE格式。 3. **PE文件头**:包含了关于文件的基本信息,比如魔数、机器类型等。 4. **可选头部**:提供了更详细的信息,如节表的起始位置、虚拟地址、大小等。 5. **节头部**:定义了文件中各个段的位置和属性。 6. **段实体**:实际存储着可执行代码和数据的部分。 7. **其他信息区域**:包括重定位信息、符号表、行号信息和字符串表等。 #### MS-DOS头部/实模式头部 MS-DOS头部是PE文件格式中的第一个组成部分,其结构与MS-DOS 2.0以来使用的头部结构相同。保留这个相同的结构的主要原因是为了保持向后兼容性。当在一个低于Windows 3.1或MS-DOS 2.0的系统中尝试加载一个PE文件时,系统可以通过读取MS-DOS头部确定该文件与当前系统不兼容,从而给出明确的提示信息。 #### PE文件头 PE文件头包含了文件的标识符以及其他关键信息,例如: - **魔数**:用来识别文件是否为PE格式。 - **机器类型**:指定目标机器的架构,例如x86或x64。 - **节数目**:表示文件中节的数量。 - **可选头大小**:指示可选头部的大小。 #### 可选头部 可选头部提供了更详细的信息,用于描述PE文件的结构和布局,包括但不限于: - **虚拟地址**:定义了段在内存中的位置。 - **物理地址**:描述了文件中段的实际位置。 - **节表的起始位置**:指出了节表在文件中的起始偏移量。 - **特征标志**:包含了一些额外的属性标志。 #### 节头部 每个节都有一个对应的节头部,用来描述该节的属性和位置,包括但不限于: - **名称**:节的名字。 - **虚拟大小**:节在内存中的大小。 - **原始大小**:节在文件中的大小。 - **虚拟地址**:节在内存中的起始位置。 - **原始地址**:节在文件中的起始位置。 #### 其他信息区域 除了上述组成部分外,PE文件还包括一些其他重要的信息区域,例如: - **重定位信息**:用于在加载时调整段的地址。 - **符号表信息**:存储了符号的名称及其在内存中的位置。 - **行号信息**:记录了源代码中的行号对应关系。 - **字符串表数据**:包含了文本字符串。 #### 示例工具与库 为了便于理解和使用PE文件格式,作者开发了一个名为`PEFILE.DLL`的动态链接库,以及一个名为`EXEVIEW.EXE`的应用程序。这些工具可以帮助开发者测试和分析PE文件,提供了诸如查看`.idata`段头部、导入映像数据目录、可选头部等功能,极大地简化了PE文件的解析工作。 ### 结语 通过本文的详细介绍,我们不仅了解了PE文件格式的基本结构和组成部分,而且还学会了如何使用`PEFILE.DLL`等工具来解析和处理PE文件。这对于软件开发者来说是非常有价值的资源,有助于提高他们对Windows可执行文件的理解和调试能力。
- dishen102013-06-22这个还不是很详细吧..
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助