1 基本概念 下表描述了贯穿于本文中的一些概念: 名称 描述 地址 是“虚拟地址”而不是“物理地址”
为什么不是“物理地址”呢
因为数据在内存的位置经常在变,这样可以节省内存开支、避开错误的内存位置等的优势
同时用户并不需要知道具体的“真实地址”,因为系统自己会为程序准备好内存空间的(只要内存足够大) 镜像文件 包含以EXE 文件为代表的“可执行文件”、以DLL 文件为代表的“动态链接库”
为什么用“镜像”
这是因为他们常常被直接“复制”到内存,有“镜像”的某种意思
看来西方人挺有想象力的哦^0^ RVA 英文全称Relatively Virtual Address
偏移(又称“相对虚拟地址”)
相对镜像基址的偏移
节 节是PE 文件中代码或数据的基本单元
原则上讲,节只分为“代码节”和“数据节”
VA 英文全称Virtual Address
基址 2 概览 x86 都是32 位的,IA-64 都是64 位的
64 位Windows 需要做的只是修改 PE 格式的少数几个域
这种新的格式被称为PE32+
它并没有增加任何新域,仅从 PE 格式中删除了一个域
其余的改变就是简单地把某些域从 32 位扩展到 64 位
在大部分情况下,你都能写出同时适用于32 位和 64 位PE 文件的代码
EXE 文件与 DLL 文件的区别完全是语义上的
它们使用的是相同的PE 格式
惟一的不同在于一个位,这个位用来指示文件应该作为EXE 还是DLL
甚至 DLL 文件的扩展名也完全也是人为的
你可以给 DLL 一个完全不同的扩展名,例如
OCX 控件和控制面板小程序(
CPL)都是DLL
图1 解释了Microsoft PE 可执行文件格式: PE 文件总体上分为“头”和“节”
“头”是“节”的描述、简化、说明,“节”是“头”的具体化
3 文件头 PE 文件的头分为DOS 头、NT