这一部分把 PE 头结构继续推进到“能写解析框架”。核心是:从文件缓冲区出发,安全地找到 DOS 头、NT 头、可选头、节表,并能在 RVA、VA、FOA 之间转换。

1、内容范围

小节 内容 复盘点
02.5 - 03.1 PE 解析工具框架 控制台初始化、用户指令、二进制写入、DOS/NT 定位
03.2 - 04.4 NT / OptionalHeader FileHeader、Magic、ImageBase、RVA、OEP、Alignment、SizeOfImage
04.5 - 05.5 SECTION 节区 节区定位、属性、对齐、RVA_TO_FOA、文件/内存状态转换

2、解析框架

PE 解析工具建议先拆成这些模块:

模块 作用
文件读取 把 PE 文件读入缓冲区
头部校验 检查 MZ、PE 签名和边界
结构定位 定位 DOS、NT、Optional、Section
地址换算 RVA、VA、FOA 互转
指令交互 输入命令查看字段
日志输出 记录错误和解析结果

3、边界检查

PE 文件可能损坏、被压缩、被修改,解析时不能盲信字段。

检查 说明
文件大小 结构体读取不能越界
e_lfanew 必须落在文件范围内
NT 签名 是否为 PE\0\0
节数量 节表大小是否合理
对齐值 FileAlignment/SectionAlignment 是否可信

4、OptionalHeader 关键字段

字段 复盘意义
Magic 判断 PE32 / PE32+
ImageBase 首选加载基址
AddressOfEntryPoint 入口点 RVA
SectionAlignment 内存对齐
FileAlignment 文件对齐
SizeOfImage 映像内存大小
SizeOfHeaders 头部文件大小
DataDirectory 数据目录数组入口

5、节区结构

节表描述每个节在文件和内存中的位置。

字段 含义
Name 节名
VirtualAddress 节在内存中的 RVA
VirtualSize 节在内存中的实际大小
PointerToRawData 节在文件中的偏移
SizeOfRawData 节在文件中的大小
Characteristics 读写执行等属性

6、RVA、VA、FOA

概念 公式
VA ImageBase + RVA
RVA VA - ImageBase
FOA 文件偏移,需要通过节表换算

RVA 转 FOA 的核心:

1
FOA = RVA - Section.VirtualAddress + Section.PointerToRawData

前提是先找到 RVA 落在哪个节区。

7、节区属性

属性 复盘意义
可读 数据可读取
可写 数据可修改
可执行 代码可执行
代码节 常见 .text
数据节 常见 .data.rdata

安全分析时,可写可执行节、异常节名、节区大小不匹配都值得关注。

8、学习检查清单

检查项 状态
能安全定位 DOS 头、NT 头和节表 待复盘
能解释 ImageBaseOEPSizeOfImage 待复盘
能用节表完成 RVA 到 FOA 转换 待复盘
能说明文件状态和内存状态为什么不同 待复盘
能识别可疑节区属性组合 待复盘