连载13:IMAGE_FILE_HEADER 字段解释

回顾 IMAGE_FILE_HEADER 数据结构

上篇文章已经给出了 IMAGE_FILE_HEADER 的定义,这里再次回顾一下该数据结构,其数据结构的定义如下:

//
// File header format.
//

typedef struct _IMAGE_FILE_HEADER {
    WORD    Machine;
    WORD    NumberOfSections;
    DWORD   TimeDateStamp;
    DWORD   PointerToSymbolTable;
    DWORD   NumberOfSymbols;
    WORD    SizeOfOptionalHeader;
    WORD    Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

#define IMAGE_SIZEOF_FILE_HEADER             20

该定义在 winnt.h 文件中,且该数据结构的大小为 20 个字节,该数据结构的大小在 winnt.h 中由宏给出了定义。

下面对它的字段进行一个解释

IMAGE_FILE_HEADER 数据结构解释

IMAGE_FILE_HEADER 结构体中的字段实际能用到的一共由 4 个,分别是:MachineNumberOfSectionsSizeOfOptionalHeaderCharacteristics

  • Machine:该文件的目标 CPU 类型。在 winnt.h 文件中定义一些相关的宏,但是常见就两个,如下:
#define IMAGE_FILE_MACHINE_UNKNOWN           0
#define IMAGE_FILE_MACHINE_I386              0x014c  // Intel 386.
#define IMAGE_FILE_MACHINE_R3000             0x0162  // MIPS little-endian, 0x160 big-endian
……
#define IMAGE_FILE_MACHINE_POWERPCFP         0x01f1
#define IMAGE_FILE_MACHINE_IA64              0x0200  // Intel 64
……

常见的两个分别是 IMAGE_FILE_MACHINE_I386IMAGE_FILE_MACHINE_IA64

IMAGE_FILE_MACHINE_I386 表示该可执行程序为 Intel 32 位兼容平台
IMAGE_FILE_MACHINE_IA64 表示该可执行程序为 Intel 64 位兼容平台

  • NumberOfSections:表示该文件的节区数
  • SizeOfOptionalHeader:表示在 IMAGE_FILE_HEADER 后面的 IMAGE_OPTIONAL_HEADER 结构体的大小,该结构体分为 32 位和 64 位 两个版本,因此结构体的大小会有所不同。这样的设计也是为了保证向后的兼容。
  • Characteristics:指定该文件的类型,毕竟 PE 文件的类型也很多,比如 EXE 和 DLL 虽然都是 PE 文件,但是它们还是有区别的。因此,需要用具体的文件属性来进行区分类型。该字段在 winnt.h 中有响应的宏定义,定义如下:
#define IMAGE_FILE_RELOCS_STRIPPED           0x0001  // Relocation info stripped from file.
#define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002  // File is executable  (i.e. no unresolved external references).
#define IMAGE_FILE_LINE_NUMS_STRIPPED        0x0004  // Line nunbers stripped from file.
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED       0x0008  // Local symbols stripped from file.
#define IMAGE_FILE_AGGRESIVE_WS_TRIM         0x0010  // Aggressively trim working set
#define IMAGE_FILE_LARGE_ADDRESS_AWARE       0x0020  // App can handle >2gb addresses
#define IMAGE_FILE_BYTES_REVERSED_LO         0x0080  // Bytes of machine word are reversed.
#define IMAGE_FILE_32BIT_MACHINE             0x0100  // 32 bit word machine.
#define IMAGE_FILE_DEBUG_STRIPPED            0x0200  // Debugging info stripped from file in .DBG file
#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP   0x0400  // If Image is on removable media, copy and run from the swap file.
#define IMAGE_FILE_NET_RUN_FROM_SWAP         0x0800  // If Image is on Net, copy and run from the swap file.
#define IMAGE_FILE_SYSTEM                    0x1000  // System File.
#define IMAGE_FILE_DLL                       0x2000  // File is a DLL.
#define IMAGE_FILE_UP_SYSTEM_ONLY            0x4000  // File should only be run on a UP machine
#define IMAGE_FILE_BYTES_REVERSED_HI         0x8000  // Bytes of machine word are reversed.

其中,常见的有 IMAGE_FILE_RELOCS_STRIPPEDIMAGE_FILE_EXECUTABLE_IMAGEIMAGE_FILE_SYSTEMIMAGE_FILE_DLLIMAGE_FILE_32BIT_MACHINE

IMAGE_FILE_RELOCS_STRIPPED:文件中不存在重定位信息
IMAGE_FILE_EXECUTABLE_IMAGE:文件可执行
IMAGE_FILE_SYSTEM:系统文件
IMAGE_FILE_DLL:DLL 文件
IMAGE_FILE_32BIT_MACHINE:目标平台为 32 位平台

Characteristics 通常是由若干个宏 或运算 后的值

本篇文章把 IMAGE_FILE_HEADER 进行了解释,关于 IMAGE_FILE_HEADER 结构体在 PE 文件中的具体分析在下篇文章中进行介绍。



微信中搜索 “码农UP2U” 关注我的公众号吧!!!

你可能感兴趣的:(连载13:IMAGE_FILE_HEADER 字段解释)