这一部分把 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 是否可信 |
| 字段 |
复盘意义 |
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 头和节表 |
待复盘 |
能解释 ImageBase、OEP、SizeOfImage |
待复盘 |
| 能用节表完成 RVA 到 FOA 转换 |
待复盘 |
| 能说明文件状态和内存状态为什么不同 |
待复盘 |
| 能识别可疑节区属性组合 |
待复盘 |