- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
IMAGE_FILE_HEADER 介绍
- IMAGE_FILE_HEADER 是 PE 文件核心结构 IMAGE_NT_HEADERS 的一部分,它和可选头 (IMAGE_OPTIONAL_HEADER) 一起定义了文件的总体布局和属性。
- IMAGE_FILE_HEADER 提供了有关文件物理布局和基本属性的信息,比如文件适用的处理器架构、节数目等。
IMAGE_FILE_HEADER 结构
typedef struct _IMAGE_FILE_HEADER {
WORD Machine; // 目标平台架构
WORD NumberOfSections; // 文件中的节数目
DWORD TimeDateStamp; // 文件的时间戳(编译时间)
DWORD PointerToSymbolTable; // 符号表指针(调试使用)
DWORD NumberOfSymbols; // 符号表中的符号数量(调试使用)
WORD SizeOfOptionalHeader; // 可选头的大小(IMAGE_OPTIONAL_HEADER 的大小)
WORD Characteristics; // 文件属性标志
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
核心字段解析
Machine(目标平台架构)
- 定义: 指明此 PE 文件的目标运行平台处理器架构。
- 值:
- IMAGE_FILE_MACHINE_I386 0x014C: Intel x86 (32位处理器)。
- IMAGE_FILE_MACHINE_IA64 0x0200: Intel Itanium (IA64)。
NumberOfSections(节数目)
- 定义: 文件中包含的节数量。
- 作用:
- 每个节的信息由 IMAGE_SECTION_HEADER 结构表示。
- 从 NumberOfSections 可计算出文件的整体存储布局。
- 文件中的节包括 .text、.data、.rdata、.bss 等。
TimeDateStamp(时间戳)
- 定义: 编译文件时的时间戳,是一个从1970年1月1日开始按秒计数的值(Epoch Time)。
- 作用:
- 用于记录文件的创建时间。
PointerToSymbolTable(符号表指针)
- 定义: 指向符号表的地址(绝对文件偏移值),主要用于调试用途。
- 特点:
- 在现代 Windows 应用中通常为 0,因为如今的调试符号存储在 PDB 文件中,而非 PE 文件。
NumberOfSymbols(符号数目)
- 定义: 指明符号表中符号的数量。
- 特点:
- 在调试符号表为空时,此字段一般设置为 0。
- 针对老旧(COFF)格式,符号表仍然包含调试符号的数据指针。
SizeOfOptionalHeader(可选头的大小)
- 定义: 指 IMAGE_OPTIONAL_HEADER 的大小。
- 值:
- 对于 PE32 格式(32 位)文件,此值通常是 0x00E0(224 字节)。
- 对于 PE32+ 格式(64 位)文件,此值通常是 0x00F0(240 字节)。
Characteristics(文件属性标志)
- 定义: 指定文件的整体属性,是按位标志集合。
- 常见标志值:
- #define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // 文件是可执行文件
- #define IMAGE_FILE_DLL 0x2000 // 文件是一个 DLL
- #define IMAGE_FILE_32BIT_MACHINE 0x0100 // 运行在 32 位机器上
IMAGE_FILE_HEADER 位置
- PE 文件的物理结构:
- IMAGE_FILE_HEADER 紧随 IMAGE_NT_HEADERS.Signature ("PE\0\0") 字段之后。
- 通过 IMAGE_DOS_HEADER.e_lfanew 获取 NT 头的起始地址,从而定位 IMAGE_FILE_HEADER。
- 文件偏移计算示例:
-
文件偏移关系: +----------------+ | IMAGE_DOS_HEADER | +----------------+ <- e_lfanew 指向 | "PE\0\0" | | IMAGE_FILE_HEADER | +----------------+ | IMAGE_OPTIONAL_HEADER | +----------------+