PE头部是真正用来装载Win32程序的头部,PE头的定义为IMAGE_NT_HEADERS,该结构体包含PE标识符、文件头与可选头这三部分。
该头部具有32位和64位之分。
32位的PE文件格式,IMAGE_NT_HEADERS32定义如下:
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature; //位置在e_lfanew上
IMAGE_FILE_HEADER FileHeader; //e_lfanew + 0x4 文件头结构体
IMAGE_OPTIONAL_HEADER32 OptionalHeader; //e_lfanew + 0x18 可选头结构体
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
该结构体中的Signature就是PE标识符,该部分占四个字节,在Winnt.h头文件中的宏定义为:
#define IMAGE_NT_SIGNATURE 0x50450000 // PE00
在PE头中,除了IMAGE_NT_HEADERS 以外,还有两个重要的结构体,分别是IMAGE_FILE_HEADER(文件头) 和 IMAGE_OPTIONAL_HEADER32(可选头)。
IMAGE_FILE_HEADER(文件头)
该结构体是IMAGE_NT_HEADERS中的第一个结构体,该结构体紧接在PE标识符的后面。该结构体大小为20个字节。
typedef struct _IMAGE_FILE_HEADER {
WORD Machine; //位置为 e_lfanew + 0x4 //该字段表示可执行文件的目标CPU类型
WORD NumberOfSections; //e_lfanew + 0x6 //