1. PE文件格式入门:从MZ签名到内存映射
第一次用十六进制编辑器打开一个.exe文件时,看到开头的"MZ"两个字母,我以为是某个程序员的签名。后来才知道这是PE文件的身份证——每个Windows可执行程序都带着这个标记开始它的征程。PE文件就像个精心设计的俄罗斯套娃,外层是DOS头,往里拆才能见到真正的PE头。
用010 Editor打开一个简单的HelloWorld.exe,从偏移0x0开始的前64字节就是DOS头。关键字段是最后4字节的e_lfanew,它指向PE头的起始位置。我习惯用快捷键Ctrl+G直接跳转到这个偏移量,那里必定藏着"PE\0\0"的魔法标记。这个设计保留了DOS时代的兼容性,就像现代建筑保留着古代的地基。
理解PE文件最烧脑的就是地址转换。文件躺在磁盘上是按文件偏移地址(FOA)排列的,加载到内存后则按相对虚拟地址(RVA)和虚拟地址(VA)组织。三者的关系就像:
- FOA:书本的页码(物理位置)
- RVA:章节编号(逻辑位置)
- VA:图书馆的索书号(全局位置)
手动计算时记住这个公式:VA = ImageBase + RVA。在32位程序里,ImageBase默认是0x400000,就像所有程序都约定从同一个虚拟起点开始布局。用PEditor查看节表时,会看到每个节的PointerToRawData(FOA)和VirtualAddress(RVA),它们之间的转换需要对齐值(SectionAlignment和FileAlignment)参与计算。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解剖PE头:藏在字节里的操作系统指令
PE头就像程序的体检报告,前20个字节的FileHeader记录着基础信息。用WinHex查看Characteristics字段时,0x010F表示这是个可执行的32位程序,而DLL会显示0x210E。这里有个坑:某些病毒会修改这个标记来伪装文件类型,我在分析恶意软件时就遇到过把EXE改成DOC的案例。
OptionalHeader才是真正的精华区,它告诉加载器如何布置内存。关键字段包括:
- AddressOfEntryPoint:程序入口的RVA
- ImageBase:首选加载地址
- SectionAlignment/FileAlignment:内存与磁盘的对齐值
特别要注意DataDirectory数组
