0~1深入解析PE文件结构+做实验
字数 1910 2025-08-22 12:23:30

深入解析PE文件结构 - 完整教学文档

0. 概述

PE文件(Portable Executable File Format)是Windows下可执行程序的标准格式,包括.exe、.dll、.sys等文件。PE文件分为32位(PE32)和64位(PE32+)两种版本。

1. PE文件基本结构

PE文件由四个主要部分组成:

  1. DOS头:保持对DOS系统的兼容,并定位真正的PE头
  2. NT头:包含PE文件标识、PE文件头和可选头
  3. 节表:描述PE文件后续节的属性
  4. :实际包含代码、数据等内容,每个节有独立的内存权限

2. 地址概念

2.1 地址类型

  • VA (Virtual Address):虚拟地址,绝对内存地址
  • RVA (Relative Virtual Address):相对虚拟地址,相对于内存映像头的偏移
  • FOA (File Offset Address):文件偏移地址,在磁盘文件中的偏移

2.2 地址转换公式

VA = RVA + ImageBase

3. DOS头详解

DOS头结构体定义在winnt.h中,大小为64字节(0x40)。关键字段:

  • e_magic:MZ标识,固定为0x5A4D('MZ')
  • e_lfanew:指向NT头的偏移

3.1 DOS存根

DOS头后跟一段DOS程序,称为DOS存根,通常显示"This program cannot be run in DOS mode."然后退出。

3.2 实验验证

只有e_magic和e_lfanew两个字段是必需的,其他字段可以置零而不影响程序运行。

4. NT头详解

NT头由三部分组成:

4.1 PE标识

固定为"PE\0\0"四个字节(0x50450000)。

4.2 文件头(IMAGE_FILE_HEADER)

关键字段:

  • Machine:CPU类型,如0x014C(x86)、0x8664(x64)
  • NumberOfSections:节的数量
  • SizeOfOptionalHeader:可选头的大小
  • Characteristics:文件属性标志

4.3 可选头(IMAGE_OPTIONAL_HEADER32)

虽然名为"可选",但实际是必需的。关键字段:

  • Magic:标识文件类型(0x010B为PE32)
  • AddressOfEntryPoint:程序入口点RVA
  • ImageBase:建议装载基址
  • SectionAlignment:内存中对齐值(默认4KB)
  • FileAlignment:文件中对齐值
  • SizeOfImage:映像总大小
  • DataDirectory:数据目录表

5. 数据目录表

数据目录表位于可选头末尾,包含16个数据目录项,每个项描述一个重要数据结构的位置和大小。

5.1 导出表

描述模块(.dll)中的导出函数,支持按名称和序号两种导出方式。

5.2 导入表

描述PE文件依赖的模块和函数,包含:

  • INT (Import Name Table):导入名称表
  • IAT (Import Address Table):导入地址表

IAT在加载前与INT相同,加载后被填充为实际函数地址。

5.3 重定位表

解决模块基址变化时的地址修正问题,包含需要重定位的位置信息。

6. 节表与节操作

6.1 节表结构(IMAGE_SECTION_HEADER)

每个节表项40字节,描述一个节的属性:

  • Name:节名称
  • VirtualSize:节在内存中的实际大小
  • VirtualAddress:节的RVA
  • SizeOfRawData:节在文件中的大小
  • PointerToRawData:节在文件中的偏移
  • Characteristics:节属性(如可读、可写、可执行)

6.2 地址转换示例

将VA转换为FOA的步骤:

  1. 计算RVA = VA - ImageBase
  2. 确定RVA所属的节
  3. 计算节RVA与FOA的差值
  4. FOA = RVA - 差值

6.3 节操作技术

  1. 空白区添加代码:利用节内对齐填充空间
  2. 扩大节:修改节大小属性,增加文件数据
  3. 新增节
    • 在节表后添加新节表项
    • 修正NumberOfSections和SizeOfImage
    • 在文件末尾添加节数据
  4. 合并节:将多个节合并为一个

7. 实验与工具

推荐工具:

  • LordPE:查看和编辑PE文件结构
  • 010 Editor:二进制文件编辑
  • IDA Pro:反汇编分析

8. 参考

  • 《逆向工程核心原理》
  • 滴水逆向教程
  • Microsoft PE/COFF规范

通过深入理解PE文件结构,可以更好地进行软件分析、漏洞挖掘和逆向工程工作。

深入解析PE文件结构 - 完整教学文档 0. 概述 PE文件(Portable Executable File Format)是Windows下可执行程序的标准格式,包括.exe、.dll、.sys等文件。PE文件分为32位(PE32)和64位(PE32+)两种版本。 1. PE文件基本结构 PE文件由四个主要部分组成: DOS头 :保持对DOS系统的兼容,并定位真正的PE头 NT头 :包含PE文件标识、PE文件头和可选头 节表 :描述PE文件后续节的属性 节 :实际包含代码、数据等内容,每个节有独立的内存权限 2. 地址概念 2.1 地址类型 VA (Virtual Address) :虚拟地址,绝对内存地址 RVA (Relative Virtual Address) :相对虚拟地址,相对于内存映像头的偏移 FOA (File Offset Address) :文件偏移地址,在磁盘文件中的偏移 2.2 地址转换公式 3. DOS头详解 DOS头结构体定义在winnt.h中,大小为64字节(0x40)。关键字段: e_ magic :MZ标识,固定为0x5A4D('MZ') e_ lfanew :指向NT头的偏移 3.1 DOS存根 DOS头后跟一段DOS程序,称为DOS存根,通常显示"This program cannot be run in DOS mode."然后退出。 3.2 实验验证 只有e_ magic和e_ lfanew两个字段是必需的,其他字段可以置零而不影响程序运行。 4. NT头详解 NT头由三部分组成: 4.1 PE标识 固定为"PE\0\0"四个字节(0x50450000)。 4.2 文件头(IMAGE_ FILE_ HEADER) 关键字段: Machine :CPU类型,如0x014C(x86)、0x8664(x64) NumberOfSections :节的数量 SizeOfOptionalHeader :可选头的大小 Characteristics :文件属性标志 4.3 可选头(IMAGE_ OPTIONAL_ HEADER32) 虽然名为"可选",但实际是必需的。关键字段: Magic :标识文件类型(0x010B为PE32) AddressOfEntryPoint :程序入口点RVA ImageBase :建议装载基址 SectionAlignment :内存中对齐值(默认4KB) FileAlignment :文件中对齐值 SizeOfImage :映像总大小 DataDirectory :数据目录表 5. 数据目录表 数据目录表位于可选头末尾,包含16个数据目录项,每个项描述一个重要数据结构的位置和大小。 5.1 导出表 描述模块(.dll)中的导出函数,支持按名称和序号两种导出方式。 5.2 导入表 描述PE文件依赖的模块和函数,包含: INT (Import Name Table) :导入名称表 IAT (Import Address Table) :导入地址表 IAT在加载前与INT相同,加载后被填充为实际函数地址。 5.3 重定位表 解决模块基址变化时的地址修正问题,包含需要重定位的位置信息。 6. 节表与节操作 6.1 节表结构(IMAGE_ SECTION_ HEADER) 每个节表项40字节,描述一个节的属性: Name :节名称 VirtualSize :节在内存中的实际大小 VirtualAddress :节的RVA SizeOfRawData :节在文件中的大小 PointerToRawData :节在文件中的偏移 Characteristics :节属性(如可读、可写、可执行) 6.2 地址转换示例 将VA转换为FOA的步骤: 计算RVA = VA - ImageBase 确定RVA所属的节 计算节RVA与FOA的差值 FOA = RVA - 差值 6.3 节操作技术 空白区添加代码 :利用节内对齐填充空间 扩大节 :修改节大小属性,增加文件数据 新增节 : 在节表后添加新节表项 修正NumberOfSections和SizeOfImage 在文件末尾添加节数据 合并节 :将多个节合并为一个 7. 实验与工具 推荐工具: LordPE:查看和编辑PE文件结构 010 Editor:二进制文件编辑 IDA Pro:反汇编分析 8. 参考 《逆向工程核心原理》 滴水逆向教程 Microsoft PE/COFF规范 通过深入理解PE文件结构,可以更好地进行软件分析、漏洞挖掘和逆向工程工作。