PE/ELF 文件结构解析
PE(Portable Executable)和 ELF(Executable and Linkable Format)分别是 Windows 和 Linux 下的可执行文件格式。深入理解这两种文件结构是逆向工程的基本功。
一、PE 文件结构
PE 文件源自 COFF(Common Object File Format),是 Windows 操作系统的可执行文件标准。PE 文件从 DOS 头部(DOS Header)开始,包含 e_magic 标志(MZ)和指向 PE 头的偏移。PE 头包括 Signature(PE\0\0)、COFF Header(Machine、NumberOfSections、TimeDateStamp 等)和 Optional Header(入口点、镜像基址、节对齐等)。节表(Section Table)描述每个节的名称、虚拟地址、原始数据位置和属性。
二、PE 重要数据结构
数据目录表位于 Optional Header 末尾,列出导入表(Import Table)、导出表(Export Table)、资源(Resource)、基址重定位(Base Relocation)、异常处理、安全证书等关键数据结构的地址和大小。导入表描述 DLL 依赖和导入函数,是逆向分析的重要入口点。导出表标识 DLL 对外提供的函数。资源目录包含图标、对话框、字符串表、版本信息等。
三、ELF 文件结构
ELF 是 Linux 和大多数 Unix 系统的标准可执行文件格式,也用于目标文件(.o)和共享库(.so)。ELF 文件头部(ELF Header)标识文件类型、架构、入口点、节头表和程序头表的位置。节头表(Section Header Table)描述所有节的名称、类型、地址和大小。程序头表(Program Header Table)定义进程加载时的段映射,对可执行文件和共享库是必需的。
四、ELF 关键节区
.text 节包含程序代码;.data 和 .bss 存储已初始化和未初始化的全局变量;.rodata 存储只读常量(字符串字面量、跳转表)。.plt(过程链接表)和 .got(全局偏移表)实现动态链接和延迟绑定。对逆向分析而言,.symtab/.dynsym(符号表)和 .strtab/.dynstr(字符串表)提供了函数名和变量名的关键线索。
五、加载与执行
Windows 加载器读取 PE 文件后,根据 Optional Header 中的镜像基址和节表将各节映射到虚拟内存,解析导入表加载所需 DLL 并填充 IAT。Linux 加载器根据 ELF 的程序头表将文件段映射到内存,处理动态链接器路径(.interp),由动态链接器(ld-linux.so)完成共享库加载和符号解析。ASLR 启用时,加载器在随机化地址加载镜像,相关节区的重定位信息会修正地址引用。
六、逆向分析要点
分析 PE 文件时重点关注:入口点(EntryPoint)指示程序开始执行的位置;导入表揭示程序使用的系统 API;资源节可能包含内嵌配置和附加有效载荷;TLS 回调表在执行入口点前执行代码。分析 ELF 文件时关注:INIT/INI_ARRAY 和 FINI/FINI_ARRAY 节段包含构造和析构函数;GOT/PLT 追踪动态函数调用路径;通过 readelf -s 导出符号表快速定位库函数。