回顾 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 个,分别是:Machine、NumberOfSections、SizeOfOptionalHeader 和 Characteristics。
- 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_I386 和 IMAGE_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_STRIPPED、IMAGE_FILE_EXECUTABLE_IMAGE、IMAGE_FILE_SYSTEM、IMAGE_FILE_DLL 和 IMAGE_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” 关注我的公众号吧!!!
网友评论