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字节

PixPin_2026-06-28_14-04-02

数据目录 (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)

无变化

posted @ 2026-07-18 13:11  书与兔子  阅读(13)  评论(0)    收藏  举报