IMAGE_FILE_HEADER这个结构的定义如下:
typedef struct _IMAGE_FILE_HEADER {
00h WORD Machine; //运行平台
02h WORD NumberOfSections;
//区块数目
06h DWORD TimeDateStamp;
//文件日期时间戳
0Ah DWORD PointerToSymbolTable;
//指向符号表
0Eh DWORD NumberOfSymbols;
//符号表中的符号数量
12h WORD SizeOfOptionalHeader;
//映像可选头结构的大小 224
14h WORD Characteristics;
//文件特征值
} IMAGE_FILE_HEADER, *
PIMAGE_FILE_HEADER;
这个结构体表明一个PE文件的基本特征属性,也是一个PE文件的入口
Machine域说明这个pe文件在什么CPU上运行,具体如下:
#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_POWERPC 0x01F0
// IBM PowerPC Little-Endian
#define IMAGE_FILE_MACHINE_SH3 0x01a2
// SH3 little-endian
#define IMAGE_FILE_MACHINE_SH3E 0x01a4
// SH3E little-endian
#define IMAGE_FILE_MACHINE_SH4 0x01a6
// SH4 little-endian
#define IMAGE_FILE_MACHINE_ARM 0x01c0
// ARM Little-Endian
#define IMAGE_FILE_MACHINE_THUMB 0x01c2
#define IMAGE_FILE_MACHINE_IA64 0x0200
// Intel 64
#define IMAGE_FILE_MACHINE_MIPS16 0x0266
// MIPS
#define IMAGE_FILE_MACHINE_MIPSFPU 0x0366
// MIPS
#define IMAGE_FILE_MACHINE_MIPSFPU16 0x0466
// MIPS
#define IMAGE_FILE_MACHINE_ALPHA64 0x0284
// ALPHA64
#define IMAGE_FILE_MACHINE_AXP64 IMAGE_FILE_MACHINE_ALPHA64
NumberOfSections
pe文件中区块的数量.
TimeDateStamp
文件日期时间戳,指这个pe文件生成的时间,它的值是从1969年12月31日16:00:00以来的秒数.
PointerToSymbolTable
Coff调试符号表的偏移地址.
NumberOfSymbols
Coff符号表中符号的个数. 这个域和前个域在release版本的程序里是0.
SizeOfOptionalHeader
IMAGE_OPTIONAL_HEADER32结构的大小(即多少字节).我们接着就要提到这个结构了.事实上,pe文件的大部分重要的域都在IMAGE_OPTIONAL_HEADER结构里.
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.
转载于:https://www.cnblogs.com/IMyLife/p/4826076.html
相关资源:JAVA上百实例源码以及开源项目