紧跟着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 |
本文深入解析PE文件格式中的可选头结构,包括其组成、字段含义及作用,并介绍了环境子系统的定义。
1515

被折叠的 条评论
为什么被折叠?



