讲讲 Windows 平台的 PE 文件结构
PE 文件的双重性质
PE 文件的结构可以看作是DOS 文件和 PE 文件的结合体。这种设计是为了保持与旧版 DOS 操作系统的兼容性。当你双击一个 PE 文件时,操作系统首先会将其作为一个 DOS 程序处理
PE 文件主要由以下几个核心部分组成:
- DOS 头部 (DOS Header)
- DOS Stub (DOS 存根)
- NT 头部 (NT Header)
- 可选头部 (Optional Header)
- 节表 (Section Table)
- 节 (Sections)
1. DOS 头部 (DOS Header)
这是 PE 文件的最前端,一个 IMAGE_DOS_HEADER
结构体
e_magic
:4 字节的魔数,固定为0x4D5A
(ASCII 字符 “MZ”)。这是识别 PE 文件的标志e_lfanew
:一个关键的字段,它是一个 4 字节的偏移量,指向 NT 头部的起始位置
2. DOS Stub (DOS 存根)
这是一个小型的 DOS 程序。当在 DOS 环境下执行这个文件时,它会打印一句经典的提示语:“This program cannot be run in DOS mode.”。它的唯一作用就是为了兼容性
3. NT 头部 (NT Header)
NT 头部是 PE 文件的真正核心,它是一个 IMAGE_NT_HEADERS
结构体,由三个部分组成:
Signature
:4 字节的签名,固定为0x50450000
(ASCII 字符 “PE