IMO,这应该成立:
rva = raw - imagebase
图中不是这种情况,为什么?
入口点 RVA、入口点原始地址和映像基地址没有这种关系。
图像基址是“图像在内存中加载时的第一个字节的首选地址”。换句话说,假设没有冲突,它是加载图像时的虚拟地址。如果加载图像时存在地址冲突(例如,另一个图像已经加载到重叠范围内),则将为该图像选择一个新的基地址。
RVA 是相对虚拟地址。它是“相对的”,因为它在实际加载图像时发生了变化。它是基地址未知时的地址(例如,未加载图像时)。加载映像后,RVA 将成为虚拟地址 (VA),即虚拟内存中的实际地址。
原始与 RVA 的区别是由于对齐。有节对齐(节加载到内存时的对齐)以及文件对齐(节中原始数据的对齐)。这里的节对齐是 0x1000,而文件对齐是 0x200。
入口点RVA用于确定加载图像时入口点的VA(即入口点将位于虚拟地址EntryPoint (rva) + ImageBase
)。入口点原始地址是入口点所在文件的偏移量。
该文档对对齐有很好的解释。