【发布时间】:2010-09-19 22:04:50
【问题描述】:
IMO,这应该成立:
rva = raw - imagebase
图中不是这样,为什么?
【问题讨论】:
IMO,这应该成立:
rva = raw - imagebase
图中不是这样,为什么?
【问题讨论】:
入口点RVA、入口点原始地址和图像基地址没有这种关系。
图像基址是“图像在内存中加载时第一个字节的首选地址”。换句话说,假设没有冲突,它是加载图像时的虚拟地址。如果加载图像时发生地址冲突(例如,另一个图像已经加载到重叠范围内),则会为该图像选择一个新的基地址。
RVA 是相对虚拟地址。它是“相对的”,因为它在实际加载图像时发生了变化。它是基地址未知时的地址(例如,未加载图像时)。加载映像后,RVA 将成为虚拟地址 (VA),即虚拟内存中的实际地址。
原始与 RVA 的区别在于对齐。有节对齐(节加载到内存时的对齐)以及文件对齐(节中原始数据的对齐)。这里的节对齐是0x1000,而文件对齐是0x200。
入口点RVA用于确定加载图像时入口点的VA(即入口点将位于虚拟地址EntryPoint (rva) + ImageBase)。入口点原始地址是入口点所在文件的偏移量。
This document 对对齐有很好的解释。
【讨论】:
offset into the file where the entry point is located是什么意思,你能详细说明一下吗?
EntryPoint (rva)应该是根据EntryPoint (raw)计算的,对吗?
Entry Point (rva) + ImageBase(如果由于另一个DLL已经在该地址加载而导致加载冲突,则图像基址可以从DLL中指定的默认值更改) .