1. PE文件头概述
PE(Portable Executable)文件头是Windows操作系统可执行文件的核心数据结构,它定义了程序在内存中的布局、依赖关系以及执行入口等关键信息。作为Windows平台逆向工程和程序分析的基石,理解PE文件头结构对于安全研究人员、系统开发者和恶意代码分析师来说都是必备技能。
我第一次接触PE文件头是在分析一个软件兼容性问题时,当时发现某些程序在特定系统版本上无法正常运行。通过手动解析PE头中的子系统版本字段,最终定位到是程序要求的Windows版本过高导致。这个经历让我深刻认识到,即使是在高级语言开发盛行的今天,底层二进制结构的知识依然具有不可替代的价值。
2. PE文件基本结构解析
2.1 DOS头(IMAGE_DOS_HEADER)
每个PE文件都以传统的DOS头开始,这是为了向后兼容MS-DOS系统。这个64字节的结构体有两个关键字段需要特别注意:
c复制typedef struct _IMAGE_DOS_HEADER {
WORD e_magic; // "MZ"签名
LONG e_lfanew; // PE头偏移地址
} IMAGE_DOS_HEADER;
实际分析时,我常用以下方法快速验证DOS头:
- 用十六进制编辑器查看文件开头两个字节应为"4D 5A"(MZ)
- 偏移0x3C处的4字节值指向PE头起始位置
- 这个偏移值通常在0x80-0x100之间,过大可能异常
注意:现代PE文件虽然保留DOS头,但其中的DOS存根程序通常只是个简单提示。某些恶意软件会利用这个区域隐藏数据,分析时不要轻易跳过。
2.2 PE签名(PE Signature)
从e_lfanew指向的位置开始,是PE文件的真正起点。这里首先是4字节的PE签名"PE\0\0"(50 45 00 00),用于标识这是一个有效的PE文件。在逆向分析工具开发中,我遇到过几个常见陷阱:
- 某些加壳程序会动态重建这个签名,静态分析时可能看不到
- 内存转储的文件可能缺少这部分签名,需要手动修复
- PE签名后的两个字节在32/64位系统中含义不同
2.3 文件头(IMAGE_FILE_HEADER)
紧接PE签名的是20字节的标准COFF文件头
