如果想要理解PE文件与虚拟内存之间的映射关系,首先要理解一些概念:
1.文件偏移地址(file offset) PE文件数据在硬盘中存放的地址就叫做文件偏移地址。用winhex程序查看文件时的offset就是文件偏移地址了。文件偏移地址就是指文件在磁盘上存放时相对于文件开头的偏移。
2.装载基址(image base) 装载基址就是指pe文件装入内存时的基地址,一般情况下,EXE文件的装载基址都是0x00400000,但是也可以更改的,尤其是dll文件。
3.虚拟内存地址(virtual address,VA) 虚拟内存地址就是指pe文件被装入内存之后的地址。
4.相对虚拟地址(relative virtual address ,RVA) 相对虚拟地址指的是没有加算装载基址情况下的内存地址。
然而虚拟内存地址和装载基址和相对虚拟地址之间的关系如下
虚拟内存地址(VA)=装载基址(image base)+相对虚拟地址(RVA)
下面是我偷来的一张图片
不难看出,PE文件映射到虚拟内存变化很大很大。
在这里还有说明一下文件偏移的第一个字节是从0x00000000处开始的,而虚拟内存地址是从装载基址处开始的,也是就是从0x00400000处开始。
由于操作系统在装载pe文件的时候还是按照pe文件中的各种数据结构来映射的,所以文件偏移地址与相对虚拟地址还是有一定的相似之处的,他们之间的差异是由于数据单位存放位置不同而造成的。
pe文件的数据一般都是按照0x200字节为基本单位进行组织存放的,当一个数据区段不够0x200的时候,没有用到的空间用