Windows PE文件结构
Windows PE文件结构
Dos头 | |
NT头 | PE签名 |
PE文件头 | |
PE可选头 | |
数据目录表 | |
节表 | IMAGE_SECTION_HEADER → .text |
IMAGE_SECTION_HEADER → .data | |
IMAGE_SECTION_HEADER → .edata | |
IMAGE_SECTION_HEADER → .reloc | |
…. | |
节 | .text |
.data | |
.edata | |
.reloc | |
…. | |
Dos头
Dos头中目前有意义的值只有两个
1 | |
直接通过 e_lfanew 寻址到NT头, 其他数据无意义
NT头
1 | |
标准PE头
包含文件基础信息
1 | |
扩展PE头
包含程序运行时详细信息, 例如入口点, 基地址
1 | |
重要字段:
| 字段 | 描述 | 备注 |
|---|---|---|
Magic | 魔术数字 | 32位为 0x10B, 64位为 0x20B |
MajorLinkerVersion | 链接器主版本号 | |
MinorLinkerVersion | 链接器次版本号 | |
SizeOfCode | 代码节大小 | 如果有多个已初始化的数据节,则为所有此类节的总和 |
SizeOfInitializedData | 已初始化的数据节大小 | 如果有多个已初始化的数据节,则为所有此类节的总和 |
SizeOfUninitializedData | 未初始化的数据节大小 | 如果有多个未初始化的数据节,则为所有此类节的总和 |
AddressOfEntryPoint | 入口点 | 对于可执行文件,这是起始地址。 对于设备驱动程序,这是初始化函数的地址。DLL可选, 没有为0, 要与ImageBase相加得到实际地址 |
BaseOfCode | 代码节基址 | 指向代码部分开头(相对于镜像基)的指针。 |
ImageBase | 镜像基址 | DLL 的默认值为 0x10000000。 应用程序的默认值为 0x00400000 |
SectionAlignment | 内存中加载的节的对齐方式 | |
FileAlignment | 镜像文件中各部分的原始数据的对齐方式 | |
SizeOfImage | 镜像的大小 | 包括所有标头。 必须是 SectionAlignment 的倍数。在内存中整个PE文件映射的大小 |
SizeOfHeaders | 头部大小 | 以下项的组合大小,舍入为 FileAlignment 成员中指定的值的倍数。 1. IMAGE_DOS_HEADER 的e_lfanew成员 2. 4 字节签名 3. IMAGE_FILE_HEADER 的大小 4. 可选标头的大小 5. 所有节标题的大小 |
CheckSum | 校验和 | 以下文件在加载时进行验证:所有驱动程序、在启动时加载的任何 DLL,以及加载到关键系统进程中的任何 DLL。 |
SizeOfStackReserve | 要为堆栈保留的字节数 | |
SizeOfStackCommit | 要为堆栈提交的字节数 | |
SizeOfHeapReserve | 要为堆保留的字节数 | |
SizeOfHeapCommit | 要为堆提交的字节数 | |
NumberOfRvaAndSizes | 数据目录表的项数 | 可选标头的其余部分的目录条目数。 每个条目描述位置和大小。 |
DataDirectory | 数据目录表 | 指向数据目录中第一个 IMAGE_DATA_DIRECTORY 结构的指针。 |