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
2
3
4
typedef struct _IMAGE_DOS_HEADER {
0x00 WORD e_magic; // 魔术数字
0x3c LONG e_lfanew; // NT头地址
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

直接通过 e_lfanew 寻址到NT头, 其他数据无意义

NT头

1
2
3
4
5
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature; // PE签名
IMAGE_FILE_HEADER FileHeader; // PE文件头
IMAGE_OPTIONAL_HEADER32 OptionalHeader; // PE可选头
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

标准PE头

包含文件基础信息

1
2
3
4
5
6
7
8
9
typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections; // 节数量
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader; // PE可选头大小
WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

扩展PE头

包含程序运行时详细信息, 例如入口点, 基地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
typedef struct _IMAGE_OPTIONAL_HEADER64 {
WORD Magic; // 魔术数字
BYTE MajorLinkerVersion; // 链接器主版本号
BYTE MinorLinkerVersion; // 链接器次版本号
DWORD SizeOfCode; // 代码节大小
DWORD SizeOfInitializedData; // 已初始化的数据节大小
DWORD SizeOfUninitializedData; // 未初始化的数据节大小
DWORD AddressOfEntryPoint; // 入口点
DWORD BaseOfCode; // 指向代码部分开头(相对于镜像基)的指针。
ULONGLONG ImageBase; // 镜像基地址
DWORD SectionAlignment; // 内存中加载的节的对齐方式
DWORD FileAlignment; // 镜像文件中各部分的原始数据的对齐方式
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage; // 镜像的大小
DWORD SizeOfHeaders; // 头部大小
DWORD CheckSum; // 校验和
WORD Subsystem;
WORD DllCharacteristics;
ULONGLONG SizeOfStackReserve; // 要为堆栈保留的字节数
ULONGLONG SizeOfStackCommit; // 要为堆栈提交的字节数
ULONGLONG SizeOfHeapReserve; // 要为堆保留的字节数
ULONGLONG SizeOfHeapCommit; // 要为堆提交的字节数
DWORD LoaderFlags; // 加载器标志
DWORD NumberOfRvaAndSizes; // 数据目录表的项数
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; // 数据目录表
} IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;

重要字段:

字段描述备注

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 结构的指针。


Windows PE文件结构
https://simonkimi.githubio.io/2026/02/26/Windows-PE文件结构/
作者
simonkimi
发布于
2026年2月26日
许可协议