PE文件地址和虚拟内存地址之间的映射关系
(1)文件偏移地址(File Offset)
数据在PE 文件中的地址叫文件偏移地址,这是文件在磁盘上存放时相对于文件开头的偏移。
(2)装载基址(Image Base)
PE 装入内存时的基地址。默认情况下,EXE 文件在内存中的基地址是0x00400000,DLL文件是0x10000000。这些位置可以通过修改编译选项更改。
(3)虚拟内存地址(Virtual Address,VA)
PE 文件中的指令被装入内存后的地址。
(4)相对虚拟地址(Relative Virtual Address,RVA)
相对虚拟地址是内存地址相对于映射基址的偏移量。
虚拟内存地址、映射基址、相对虚拟内存地址三者之间有如下关系。
VA= Image Base+ RVA
PS:文件偏移是相对于文件开始处0 字节的偏移,RVA(相对虚拟地址)则是相对于装载基址
知识点:
(1)PE 文件中的数据按照磁盘数据标准存放,以0x200 字节为基本单位进行组织。当一
个数据节(section)不足0x200 字节时,不足的地方将被0x00 填充;当一个数据节超过0x200
字节时,下一个0x200 块将分配给这个节使用。因此PE 数据节的大小永远是0x200 的整数倍。(512B[字节])
(2)当代码装入内存后,将按照内存数据标准存放,并以0x1000 字节为基本单位进行组
织。类似的,不足将被补全,若超出将分配下一个0x1000 为其所用。因此,内存中的节总是(4k)
0x1000 的整数倍。
(
3)0x00400000处的偏移。由于操作系统在进行装载时“基本”上保持PE中的各种数据结构,所以文件偏移地址和RVA有很大的一致性。
之所以说“基本”上一致是因为还有一些细微的差异。这些差异是由于文件数据的存放单
位与内存数据存放单位不同而造成的。