PE文件结构(1) 概述
PE文件种类如下表所示:
| 种类 | 主扩展名 |
|---|---|
| 可执行系列 | EXE, SCR |
| 库系列 | DLL, OCX, CPL, DRV |
| 驱动程序系列 | SYS, VXD |
| 对象文件系列 | OBJ |
1.基本文件结构
关于PE文件结构,图是倒着的,不过不影响阅读

其中DOS头和PE头(NT头)一起构成PE文件头
对应这张图片,解析一个PE文件大概是这样的

我们的讲解主要分为以下的部分:
- DOS Header (MZ头 和 Stub)
- NT Header
- Section Header:描述Section信息
- 导入表 ImportDescriptor
- 导出表 ExportDir
在此之前必须介绍一些基本概念:
2.PE文件中的地址
VA (Virtual Address,虚拟地址)指进程虚拟内存的绝对地址
RVA(Relative Virtual Address,相对虚拟地址)指从某个基准未知(Image Base)开始的相对地址
满足 RVA + Image Base = VA
FOA(File Offset Address,文件偏移地址)指文件在磁盘上存放时相对文件开头的偏移地址
关于虚拟内存机制可以参考windows虚拟内存管理 - 云+社区 - 腾讯云 (tencent.com)
总之简单理解为进程独立拥有很大一块虚拟内存,常常是超出实际物理内存的,在32位机上是4GB,进程的寻址是基于虚拟内存技术的
3.PE文件的两种对齐
内存对齐:
windows系统下对于内存的管理以”页“为单位,所以PE文件加载到内存中时一般以页的大小为单位进行对齐,其好处显而易见
32位系统页的大小为1000h
64位系统页的大小为2000h
文件对齐:
PE文件在磁盘中遵循磁盘的对齐要求,通常以一个物理扇区的大小作为对齐的最小单位,即200h
由于文件在磁盘中的对齐粒度小于内存对齐粒度,所以文件加载到内存中时文件尺寸会增大许多,有大量空字节被填入空隙中
4.涉及的数据目录结构
稍后会逐一进行解析(并不是很想都写所以大概只有重要的几个)
| IMAGE_DIRECTORY_ENTRY_EXPORT | 0 | 导出表 |
| IMAGE_DIRECTORY_ENTRY_IMPORT | 1 | 导入表 |
| IMAGE_DIRECTORY_ENTRY_RESOURCE | 2 | 资源表 |
| IMAGE_DIRECTORY_ENTRY_EXCEPTION | 3 | 异常表 |
| IMAGE_DIRECTORY_ENTRY_SECURITY | 4 | 安全证书表 |
| IMAGE_DIRECTORY_ENTRY_BASERELOC | 5 | 基址重定位表 |
| IMAGE_DIRECTORY_ENTRY_DEBUG | 6 | 调试表 |
| IMAGE_DIRECTORY_ENTRY_ARCHITECTURE | 7 | 版权信息 |
| IMAGE_DIRECTORY_ENTRY_GLOBALPTR | 8 | 全局指针 |
| IMAGE_DIRECTORY_ENTRY_TLS | 9 | TLS表 |
| IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG | 10 | 加载配置表 |
| IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT | 11 | 绑定导入表 |
| IMAGE_DIRECTORY_ENTRY_IAT | 12 | IAT表 |
| IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT | 13 | 延迟导入表 |
| IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR | 14 | COM描述符表 |
| 15 | 保留 |
5.节的概念
section,存放不同类型的数据,不同的节拥有不同的访问权限,可以避免许多非法操作
节是PE文件中存放用户数据和代码的基本单元,用户可以定义自己的节,大多数情况只需要使用已经定义的几个常用section声明
.text - 不多说了,就是保存代码的节
.data - 保存数据的节,这个对应C语言中以初始化的全局变量数据
.rdata - 保存常量数据的节
.bss - (Block Start with Symbol)这个section对应C程序中的全局未初始化变量
.idata - 保存程序导入表(Import Table)的节。IT、ILT以及IAT也常常被保存在.rdata中,考虑到安全的因素,将IAT放在不可写的.rdata里以防止IAT被恶意更改从而造成程序的安全隐患
.edata - 保存导处表的(Export Table)的节
.reloc - 保存重定位数据的
.rsrc - 保存程序资源的。实际上这个节储存.resx文件编译后的结果
.textbss - 和微软Incremental Linking(增量链接)特性相关的
// 来源:PE文件格式系列(一)——探究PE文件常见Section作用 - 死亡的飞翔 - 博客园 (cnblogs.com)
