1. PE文件头结构解析
在Windows平台上,可执行文件、动态链接库(DLL)等都以PE(Portable Executable)格式存储。理解PE文件结构对于软件逆向分析、安全研究和系统开发都至关重要。PE文件头作为整个文件的"导航地图",包含了加载和执行程序所需的所有关键信息。
1.1 双重视角下的PE结构
从不同视角看PE文件会得到不同的结构认知:
32位系统视角的PE结构:
- DOS头(IMAGE_DOS_HEADER)
- DOS存根(DOS Stub)
- PE文件头(IMAGE_NT_HEADERS)
- 签名(Signature)
- 文件头(File Header)
- 可选头(Optional Header)
- 节表(Section Table)
- 节数据(Section Data)
关键点:DOS Stub虽然在现代系统中已无实际作用,但绝对不能删除。因为DOS头中的e_lfanew字段(偏移0x3C处)指向PE文件头的起始位置,删除DOS Stub会导致这个指针失效。
程序员视角的PE结构更关注功能划分:
- 头部信息区(Headers)
- 数据目录区(Data Directories)
- 代码节(.text)
- 数据节(.data)
- 资源节(.rsrc)
- 导入表/导出表等特殊节
数据目录项位于可选头(Optional Header)的末尾部分,包含了导入表、导出表、资源表等关键数据结构的地址信息。
1.2 核心数据结构详解
IMAGE_DOS_HEADER(DOS头):
c复制typedef struct _IMAGE_DOS_HEADER {
WORD e_magic; // "MZ"签名
// ...其他DOS相关字段...
LONG e_lfanew; // 指向PE文件头的偏移
} IMAGE_DOS_HEADER;
IMAGE_NT_HEADERS(PE文件头):
c复制typedef struct _IMAGE_NT_HEADERS {
DWORD Signature; // "PE\0\0"
IMAGE_FILE_HE
