源代碼如下: typedef struct _IMAGE_FILE_HEADER { +04h WORD Machine; // 運行平臺 +06h WORD NumberOfSections; // 文件的區塊數目 +08h DWORD TimeDateStamp; // 文件創... ...
源代碼如下:
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_I386 | x86、Intel 386 | 0x014c |
IMAGE_FILE_MACHINE_IA64 | Intel Itanium、Intel 64 | 0x0200 |
IMAGE_FILE_MACHINE_AMD64 | x64、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
實例圖片:
另外一個例子:
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.