可选头同样是 NT 头中的一部分,而且是最重要的一部分。
0x0001 回顾 NT 头的数据结构
NT 头是 PE 文件真正的部分,而 DOS 头只是一个为了保持兼容的头。NT 头的数据结构如下:
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
从 NT 头的第三个字段可以看到有一个 IMAGE_OPTIONAL_HEADER32 类型的字段,这是对于 32 位的 Windows 平台而言的。对于 64 位的平台则有一个 64 位的数据结构,定义如下:
typedef struct _IMAGE_NT_HEADERS64 {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER64 OptionalHeader;
} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;
可以看到, IMAGE_NT_HEADERS 的名称后面也加了一个 64。
我们目前只介绍 IMAGE_OPTIONAL_HEADER32 这个字段。
0x0002 IMAGE_OPTIONAL_HEADER 结构体
IMAGE_OPTIONAL_HEADER 结构体通常被称为可选头,而这里的 可选 并非可以不存在。我认为之所以叫 可选头 是因为在其中的数据目录中,有的是可以存在的,而有的是可以不存在的。因此叫做 选项头 可能更贴切一些吧。
可选头的数据结构定义如下:
//
// Optional header format.
//
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;
对于可选头来说,其中的字段非常的多,它也是整个可执行文件被装在的关键,其中字段的含义在后面的文章中进行介绍。
微信中搜索 “码农UP2U” 关注我的公众号吧!!!