26-5

讲讲 Windows 平台的 PE 文件结构

PE 文件的双重性质

PE 文件的结构可以看作是DOS 文件PE 文件的结合体。这种设计是为了保持与旧版 DOS 操作系统的兼容性。当你双击一个 PE 文件时,操作系统首先会将其作为一个 DOS 程序处理

PE 文件主要由以下几个核心部分组成:

  1. DOS 头部 (DOS Header)
  2. DOS Stub (DOS 存根)
  3. NT 头部 (NT Header)
  4. 可选头部 (Optional Header)
  5. 节表 (Section Table)
  6. 节 (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