PE文件种类如下表所示:

种类 主扩展名
可执行系列 EXE, SCR
库系列 DLL, OCX, CPL, DRV
驱动程序系列 SYS, VXD
对象文件系列 OBJ

1.基本文件结构

关于PE文件结构,图是倒着的,不过不影响阅读

img

其中DOS头和PE头(NT头)一起构成PE文件头

img

对应这张图片,解析一个PE文件大概是这样的

image-20201108010858890

我们的讲解主要分为以下的部分:

  1. DOS Header (MZ头 和 Stub)
  2. NT Header
  3. Section Header:描述Section信息
  4. 导入表 ImportDescriptor
  5. 导出表 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)