PE之文件结构

PE之文件结构
1)PE
PE(Portable Executable)是 Windows 操作系统下最核心的可执行文件格式,广泛应用于.exe、.dll、.sys 等各类程序文件,是系统将程序加载到内存并驱动CPU执行的关键标准。它包含文件运行所需的全部信息,从机器代码、初始化数据,到图标、字符串、对话框等资源,再到函数导入导出表等,均按固定结构规范组织。Windows加载器会先识别 PE 文件头,精准获取内存分配大小、程序入口点地址等关键参数,随后按预设流程将文件映射到进程虚拟内存,逐步完成地址重定位、加载依赖的动态链接库(DLL)等操作,最终引导CPU从指定入口点开始执行指令,保障程序在Windows环境下正常启动与运行。
2)常见的可执行文件扩展名
window:.exe, .dll, .sys
linux:.so, .out
macox:.app, .dylib
不同操作系统文件格式
window:PE
Linux/unix: ELF
macos: Mach-O
3)Windows下的PE文件基本结构
DOS头
NT头(IMAGE_NET_Header)
节区表(SectionTable)
各节数据(Sectiondata)
4)PE文件加载过程描述
1.启动加载流程:操作系统通过调用CreateProcess函数,启动对目标PE可执行文件的加载流程。
2.解析与校验文件结构:读取并解析PE文件的DOS头与NT头,验证文件格式的合法性与完整性,确认其为有效的PE可执行文件。
3.内存空间分配与映射:在进程地址空间中分配足够的内存,并将PE文件中的各个节(Section)按照其在头文件中定义的属性,映射到对应的内存地址。
4.开始执行程序:调用Entrypoint入口点开始信息PE程序。
5)动态链接和静态链接区别
静态链接
原理:在程序编译阶段,linker(链接器)会将程序依赖的所有库文件(如.lib、.a)中的代码和数据完整复制并合并到最终的可执行文件中。
特点:生成的可执行文件包含所有运行所需的代码,可独立运行,不依赖外部库文件。
优点:运行时无需加载外部依赖,启动速度快;不存在库文件缺失导致的运行错误。
缺点:可执行文件体积大(冗余代码多);若依赖库更新,需重新编译整个程序才能生效。
动态链接
原理:编译时仅在可执行文件中记录依赖库(如.dll、.so)的引用信息,程序运行时由操作系统的动态链接器(如Windows的ntdll.dll、Linux的ld.so)加载所需库文件并解析引用,实现代码共享。
特点:可执行文件体积小,依赖的库文件独立存储,多个程序可共享同一份库代码。
优点:节省磁盘和内存空间(库文件仅需存储/加载一次);库文件更新后无需重新编译主程序,便于维护和版本迭代。
缺点:运行时依赖外部库文件,若库缺失或版本不兼容会导致程序启动失败;启动时需额外加载库,可能增加轻微性能开销。
6)大端小端介绍
大端和小端是计算机存储多字节数据时的两种字节序规则,决定了数据的字节在内存地址中的排列顺序。
大端模式(Big-Endian)
大端模式遵循 “高位在前,低位在后” 的原则,即数据的高位字节(代表数值较大的部分)存储在内存的低地址处,而低位字节(代表数值较小的部分)则存储在内存的高地址处。以16位数据0x1234为例,其中0x12是高位字节,0x34是低位字节。在大端模式下,0x12会被存放在起始的低地址单元,0x34则紧随其后存放在相邻的高地址单元,内存中呈现为 “12 34” 的顺序。这种模式符合人类读写数值的习惯,直观易懂。
小端模式(Little-Endian)
小端模式则相反,遵循 “低位在前,高位在后” 的原则,即数据的低位字节存储在内存的低地址处,高位字节存储在高地址处。同样以0x1234为例,在小端模式下,低位字节0x34会被存放在低地址,高位字节0x12存放在高地址,内存中呈现为 “34 12” 的顺序。目前主流的 x86 架构处理器(如Intel、AMD的CPU)均采用小端模式,这种设计能让处理器在进行加减运算时更高效地处理低位字节的进位和借位。
7)总结
从DOS头到具体数据,PE文件的解析流程大致为:DOS头(e_lfanew)→NT头(Signature+FileHeader+OptionalHeader)→数据目录(DataDirectory)→各类表(导出/导入/重定位/资源等)→节区表→各节数据(代码、数据、资源等实际内容)
这些结构共同确保PE文件能被操作系统正确加载、链接和执行,是逆向工程、漏洞分析等领域的基础。如果需要某类表的更细节解析(如导入表的工作流程),可以进一步说明。解析中需注意大小端:PE结构多按小端存储(如x86环境),数据读取需匹配字节序,确保解析准确。这些结构是系统加载执行及逆向分析的基础,保障文件正常运行。
