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文件由四个主要部分组成:
- DOS头:保持对DOS系统的兼容,并定位真正的PE头
- NT头:包含PE文件标识、PE文件头和可选头
- 节表:描述PE文件后续节的属性
- 节:实际包含代码、数据等内容,每个节有独立的内存权限
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的步骤:
- 计算RVA = VA - ImageBase
- 确定RVA所属的节
- 计算节RVA与FOA的差值
- FOA = RVA - 差值
6.3 节操作技术
- 空白区添加代码:利用节内对齐填充空间
- 扩大节:修改节大小属性,增加文件数据
- 新增节:
- 在节表后添加新节表项
- 修正NumberOfSections和SizeOfImage
- 在文件末尾添加节数据
- 合并节:将多个节合并为一个
7. 实验与工具
推荐工具:
- LordPE:查看和编辑PE文件结构
- 010 Editor:二进制文件编辑
- IDA Pro:反汇编分析
8. 参考
- 《逆向工程核心原理》
- 滴水逆向教程
- Microsoft PE/COFF规范
通过深入理解PE文件结构,可以更好地进行软件分析、漏洞挖掘和逆向工程工作。