本文章内容大部分来自于对《0day安全:软件漏洞分析技术(第二版)》的整理

PE 文件概述

PE 文件是 Windows 可执行文件的格式,PE 文件按照一定的规定,将代码,数据(程序定义的变量和常量),程序资源(图片等)按照一定的格式存储在一个文件中,方便系统运行程序的时候将代码加载到内存中。如果没有这种规定的格式,程序在内存中的加载将会相当混乱,计算机系统将很难对程序进行管理。

PE 文件格式

PE 将程序中的不同的部分分成若干个数据节,代码和数据等分别存储在不同的节中。一个标准的的PE文件的格式如下:

Windows 虚拟内存机制

Windows 的内存可以分成两个层面:物理内存和虚拟内存。物理内存较为复杂,需要进入 Windows 内核级别 ring0 才能看到。

Intel的x86处理器是通过Ring级别来进行访问控制的,级别共分4层,RING0, RING1, RING2, RING3。Windows 只使用其中的两个级别RING0 和 RING3。RING0 层拥有最高的权限,RING3 层拥有最低的权限。

所以在用户模式下,我们用调试器看到的内存地址都是虚拟内存。

Windows 让所有的进程都“相信”自己拥有独立的 4GB 内存(32位计算机),但是实际的物理内存可能只有 512 MB,所以为了让所有内存中的程序都有调用 4GB 内存的能力,Windows 的程序员设计了虚拟内存管理器

https://i.loli.net/2021/02/05/XAh5wMZfTCWQyD3.png

虽然每个内存中的程序(也就是进程)能调度 4GB的内存,但是由于本身一个程序并不会时时刻刻使用全部的 4GB 内存,所以只要将内存合理调配,物理内存是可以存下全部的进程的。就像一个银行可能本身拥有的钞票会小于所有用户的账户上的钞票,但是银行仍然能够正常运转。

PE 文件与虚拟内存之间的映射

1. 文件偏移地址(File Offset)

数据在 PE 文件中的地址叫文件偏移地址,这个地址是文件在硬盘上存放时相对于文件开头的偏移

2. 装载地址(Image Base)