你的位置:首页 > 操作系统

[操作系统][PE格式分析] 4.IMAGE_FILE_HEADER


源代码如下:

typedef struct _IMAGE_FILE_HEADER {+04h  WORD     Machine;       // 运行平台+06h  WORD     NumberOfSections;   // 文件的区块数目+08h  DWORD     TimeDateStamp;    // 文件创建日期和时间+0Ch  DWORD     PointerToSymbolTable; // 指向符号表(主要用于调试)+10h  DWORD     NumberOfSymbols;   // 符号表中符号个数(同上)+14h  WORD     SizeOfOptionalHeader; // IMAGE_OPTIONAL_HEADER32 结构大小+16h  WORD     Characteristics;   // 文件属性} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

Machine字段

常用的有:

宏定义平台及相关意义数值
IMAGE_FILE_MACHINE_I386x86、Intel 3860x014c
IMAGE_FILE_MACHINE_IA64Intel Itanium、Intel 640x0200
IMAGE_FILE_MACHINE_AMD64x64、AMD64 (K8)0x8664

可以取值如下,摘取自源代码:

#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_R4000       0x0166 // MIPS little-endian#define IMAGE_FILE_MACHINE_R10000      0x0168 // MIPS little-endian#define IMAGE_FILE_MACHINE_WCEMIPSV2     0x0169 // MIPS little-endian WCE v2#define IMAGE_FILE_MACHINE_ALPHA       0x0184 // Alpha_AXP#define IMAGE_FILE_MACHINE_SH3        0x01a2 // SH3 little-endian#define IMAGE_FILE_MACHINE_SH3DSP      0x01a3#define IMAGE_FILE_MACHINE_SH3E       0x01a4 // SH3E little-endian#define IMAGE_FILE_MACHINE_SH4        0x01a6 // SH4 little-endian#define IMAGE_FILE_MACHINE_SH5        0x01a8 // SH5#define IMAGE_FILE_MACHINE_ARM        0x01c0 // ARM Little-Endian#define IMAGE_FILE_MACHINE_THUMB       0x01c2 // ARM Thumb/Thumb-2 Little-Endian#define IMAGE_FILE_MACHINE_ARMNT       0x01c4 // ARM Thumb-2 Little-Endian#define IMAGE_FILE_MACHINE_AM33       0x01d3#define IMAGE_FILE_MACHINE_POWERPC      0x01F0 // IBM PowerPC Little-Endian#define IMAGE_FILE_MACHINE_POWERPCFP     0x01f1#define IMAGE_FILE_MACHINE_IA64       0x0200 // Intel 64#define IMAGE_FILE_MACHINE_MIPS16      0x0266 // MIPS#define IMAGE_FILE_MACHINE_ALPHA64      0x0284 // ALPHA64#define IMAGE_FILE_MACHINE_MIPSFPU      0x0366 // MIPS#define IMAGE_FILE_MACHINE_MIPSFPU16     0x0466 // MIPS#define IMAGE_FILE_MACHINE_AXP64       IMAGE_FILE_MACHINE_ALPHA64#define IMAGE_FILE_MACHINE_TRICORE      0x0520 // Infineon#define IMAGE_FILE_MACHINE_CEF        0x0CEF#define IMAGE_FILE_MACHINE_EBC        0x0EBC // EFI Byte Code#define IMAGE_FILE_MACHINE_AMD64       0x8664 // AMD64 (K8)#define IMAGE_FILE_MACHINE_M32R       0x9041 // M32R little-endian#define IMAGE_FILE_MACHINE_CEE        0xC0EE

实例图片:

实例3

另外一个例子:

实例3

NumberOfSections
    pe文件中区块的数量。紧跟在本结构的后面的。
TimeDateStamp
    文件日期时间戳,指这个pe文件生成的时间,它的值是从1969年12月31日16:00:00以来的秒数.
PointerToSymbolTable
    Coff调试符号表的偏移地址。
NumberOfSymbols
    Coff符号表中符号的个数. 这个域和前个域在release版本的程序里是0。
SizeOfOptionalHeader
    IMAGE_OPTIONAL_HEADER32结构的大小(即多少字节).我们接着就要提到这个结构了.事实上,pe文件的大部分重要的域都在IMAGE_OPTIONAL_HEADER结构里。(对于32位PE文件,这个值通常是00E0h;对于64位PE32+文件,这个值通常是00F0h )。
Characteristics
    这个域描述pe文件的一些属性信息,比如是否可执行,是否是一个动态连接库等.具体定义如下:

#define IMAGE_FILE_RELOCS_STRIPPED      0x0001 // 重定位信息被移除,文件必须加载先前的基地址#define IMAGE_FILE_EXECUTABLE_IMAGE     0x0002 // 文件可执行#define IMAGE_FILE_LINE_NUMS_STRIPPED    0x0004 // 行号被移除#define IMAGE_FILE_LOCAL_SYMS_STRIPPED    0x0008 // 符号被移除#define IMAGE_FILE_AGGRESIVE_WS_TRIM     0x0010 // Agressively trim working set#define IMAGE_FILE_LARGE_ADDRESS_AWARE    0x0020 // 程序能处理大于2G的地址#define IMAGE_FILE_BYTES_REVERSED_LO     0x0080 // Bytes of machine word are reversed.#define IMAGE_FILE_32BIT_MACHINE       0x0100 // 32位机器#define IMAGE_FILE_DEBUG_STRIPPED      0x0200 // .dbg文件的调试信息被移除#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP  0x0400 // 如果在移动介质中,拷到交换文件中运行#define IMAGE_FILE_NET_RUN_FROM_SWAP     0x0800 // 如果在网络中,拷到交换文件中运行#define IMAGE_FILE_SYSTEM          0x1000 // 系统文件#define IMAGE_FILE_DLL            0x2000 // 文件是一个dll#define IMAGE_FILE_UP_SYSTEM_ONLY      0x4000 // 文件只能运行在单处理器上#define IMAGE_FILE_BYTES_REVERSED_HI     0x8000 // Bytes of machine word are reversed.