紧跟着PE文件头的,是一个叫做PE可选头(Optional Header)的数据结构。这个数据结构被叫做可选头是因为某些PE格式文件,比如目标文件(.OBJ)没有这个数据结构。但是对于一个可执行文件或动态链接库来说,这个数据结构是必须的。可选头由4部分组成,
第一部分是一个PE可选头签名。通过检查这个签名,我们可以知道这是一个32位的可选头还是64位的可选头。我们现在只介绍32位的可选头。 对于32位的PE文件来说,这个签名是0x10b
紧跟签名的第二部分是一个标准COFF标准数据。再接下来的第三部分是Windows对COFF头所做的一些扩展。最后一部分是PE文件中一些重要数据结构(导入表,导出表等)的索引。
在WINNT.h中,我们可以看到这个可选头的C语法声明:
typedef struct _IMAGE_OPTIONAL_HEADER {
//
// Standard fields.
//
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
//
// NT additional fields.
//
DWORD 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;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
下面我们来看下这里最主要的几个字段。
Field | Description |
Magic | 一般 为 0x10b |
SizeOfCode | 代 码 段大 小 |
SizeOfInitializedData | 初始化的数据大 小 |
SizeOfUninitializedData | 未初始化数据大 小 |
AddressOfEntryPoint | 程序入口点 . |
BaseOfCode | 代 码 段在文件中的起始位 置 |
Field | Description |
ImageBase | 文件基地址 ,必须 64K 对齐 . 假如应用程序被加载到这个地址,就不需要重定位了。 |
Win32VersionValue | Reserved, must be zero. |
Subsystem | 运行该程序需要的环境子系统 |
DllCharacteristics | DLL 属性 |
SizeOfStackReserve | 默认堆栈大小 |
SizeOfHeapReserve | 默认堆大小 |
NumberOfRvaAndSizes | 数据目录表大小。(下一篇会描述) |
环境子系统常量定义
Constant | Value | Description |
IMAGE_SUBSYSTEM_UNKNOWN | 0 | 未知子系统 |
IMAGE_SUBSYSTEM_NATIVE | 1 | Windows 驱动程序 |
IMAGE_SUBSYSTEM_WINDOWS_GUI | 2 | WIN32 GUI |
IMAGE_SUBSYSTEM_WINDOWS_CUI | 3 | WIN32 控制台 |
IMAGE_SUBSYSTEM_POSIX_CUI | 7 | POSIX |
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI | 9 | Windows CE |
IMAGE_SUBSYSTEM_XBOX | 14 | XBOX |