PE头解析

1. IMAGE_DOS_HEADER(DOS头结构体)

名称 作用 备注
e_magic DOS签名(4D5A) 必须有
e_lfanew 指向NT头的偏移 必须有

2. DosStub(DOS存根)

3. IMAGE_NT_HEADERS(NT头结构体)

3.1. IMAGE_FILE_HEADERS(文件头)

名称 作用 备注
Machine 对应CPU的machine码 必须有
NumberOfSections 指出文件中存在的节区数量 必须有
值一定要大于0
SizeOfOptionalHeader 指出IMAGE_OPTIONAL_HEADER32结构体的长度 必须有
CHaracteristics(结构体) 用于标识文件的属性,文件是否是可运行的形态、是否为DLL文件等信息,以bitOR形式组合起来 必须有
TimeDateStampA 记录编译器创建此文件的时间 不影响文件运行

3.2. IMAGE_OPTIONAL_HEADER (可选头)

名称 作用 备注
Magic 指定magic码 必须有
IMAGE_OPTIONAL_HEADER32 结构体时,Magic码为 10B
IMAGE_OPTIONAL_HEADER64 结构体时,Magic码为 20B
AddressOfEntryPoint 持有EP的RVA值
指出程序最先执行的代码起始地址
必须有,很重要
ImageBase 指出文件的优先装人地址 必须有
SectionAlignment 指定了节区在磁盘文件中的最小单位 必须有
FileAlignment 指定了节区在内存中的最小单位 必须有
SizeOfImage 指定了PEImage在虚拟内存中所占空间的大小 必须有
SizeOfHeader 指出整个PE头的大小 必须有
值也必须是FileAlignment的整数倍
第一节区所在位置与SizeOfHeader距文件开始偏移的量相同
Subsystem 区分系统驱动文件(*.sys)与普通的可执行文件(*.exe,*.dll) 必须有
NumberOfRvaAndSizes 指定DataDirectory数组的个数 必须有
DataDirectory(结构体数组) IMAGE_DATA_DIRECTORY结构体组成的数组,数组的每项都有被定义的值 必须有
里面包含重要的结构体,如导入导出表等

3.2.1. DataDirectory(结构体数组)

索引 名称 作用 是否必须
0 EXPORT Directory 导出表,存储 DLL 导出的函数信息
1 IMPORT Directory 导入表,存储 PE 文件所需的外部 DLL 及其函数信息
2 RESOURCE Directory 资源表,存储图标、字符串、对话框等资源
3 EXCEPTION Directory 异常表,存储异常处理相关信息
4 SECURITY Directory 安全表,存储数字签名和验证信息
5 BASERELOC Directory 重定位表,存储可执行文件在加载时所需的地址调整信息 否(除非使用了重定位)
6 DEBUG Directory 调试信息表,存储调试符号和相关数据
7 COPYRIGHT Directory 版权表,存储软件版权信息(已废弃)
8 GLOBALPTR Directory 全局指针表,提供特定平台的全局指针
9 TLS Directory 线程本地存储表,管理 TLS 变量 否(仅多线程程序需要)
A LOAD_CONFIG Directory 加载配置表,存储系统安全相关的配置信息
B BOUND_IMPORT Directory 绑定导入表,优化 DLL 导入过程
C IAT Directory 导入地址表,存储 DLL 函数的地址
D DELAY_IMPORT Directory 延迟导入表,支持 DLL 的延迟加载
E COM_DESCRIPTOR Directory COM 组件描述表,存储 .NET 相关信息 否(仅 .NET 相关程序需要)
F Reserved Directory 预留字段,无特殊用途

4. IMAGE_SECTION_HEADER(节区头)

SectionHeader 结构体组成的数组、有 .text .data .rsrc

4.1. SectionHeaders[?]

名称 作用 备注
VirtualAddress 指示该节加载到内存后的 起始地址(相对于ImageBase) VA=imagebase+RVA
PointerToRawData 表示 该节在磁盘文件中的物理偏移(相对于文件开头) 文件偏移
Name数组