连载17:可选头 —— IMAGE_OPTIONAL_HEADER

可选头同样是 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” 关注我的公众号吧!!!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容