PE 与 PE32+ 的比较
64位 程序的PE结构 相较于 32位 PE程序变化很小
DOS 头 (IMAGE_DOS_HEADER)
大小(64字节)
PE32+相对于PE无变化;
关键结构
e_magic = 0x5A4D ('MZ')
e_lfanew = 指向 NT 头在文件中的偏移(RVA 偏移,但这里是文件偏移)
NT 头 (IMAGE_NT_HEADERS)
NT头分为文件头(IMAGE_FILE_HEADER)和可选头(IMAGE_OPTIONAL_HEADER32 / 64)
文件头 (IMAGE_FILE_HEADER) 无变化
需要区分的点
Machine = 0x14c (x86), 0x8664 (x64) 可以根据这个判断程序是32位还是64位
SizeOfOptionalHeader = 0xE0(PE32),0xF0(PE32+)
可选头 (IMAGE_OPTIONAL_HEADER32 / 64) 核心差异
移除BaseOfDate结构
Magic = 0x10b(PE32),0x20b(PE32+)
ImageBase SizeOfStackReserve SizeOfStackCommit SizeOfHeapReserve SizeOfHeapCommit
宽度变化: DWORD -> QWORD(ULONGLONG)
其他指针/地址相关字段 4字节->8字节

数据目录 (Data Directories)
对于 16 个数据目录
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress; // RVA
DWORD Size;
} IMAGE_DATA_DIRECTORY;
注意:在 PE32+ 中,目录里的 VirtualAddress 仍然是 32 位 RVA,因为 RVA 始终是 32 位(即使 64 位地址,在文件中的相对偏移仍用 32 位表示,因为实际加载时由基址 + 偏移组成)
节表与节 (Section)
无变化

浙公网安备 33010602011771号