VA&RVA 和 RVA to RAW

VA&RVA

VA指的是进程虚拟内存的绝对地址,RVA(Relative Virtual Address,相对虚拟地址)指从某个基准位置(ImageBase)开始的相对地址。VA与RVA满足下面的换算关系。

RVA + ImageBase = VA

PE(Portable Executable)头部信息大多以RVA形式存在。原因在于,PE文件(主要是DLL)加载到进程虚拟内存的特定位置时,该位置可能已经加载了其它PE文件(DLL,Dynamic Linked Library)。此时必须通过重定位(Relocation)将其加载到其它空白的位置,若PE头信息使用的是VA,则无法正常访问。因此,使用RVA来定位信息,即使发生了重定位,只要相对于基准位置的相对地址没有变化,就能正常访问到指定信息,不会出现任何问题。

提示:

32 位 Widows OS 中,各进程分配有 4GB 的虚拟内存,因此,进程中 VA 值的范围是 0000 0000 ~ FFFF FFFF。

RVA to RAW

PE文件加载到内存时,每个节区都要能准确完成内存地址与文件偏移间的映射。这种映射一般称为 RVA to RAW,方法如下:

  1. 查找RVA所在节区。
  2. 使用简单的公式计算文件偏移(RVA)。

根据IMAGE_SECTION_HEADER结构体,换算公式如下:

RAW - PointerToRawData = RVA - VirtualAddress

进而得:

RAW = RVA - VirtualAddress + PointerToRawData

Preference

逆向工程核心原理 \(P_{92}\) \(P_{104}\)

就这这个帖子理解 RVA、VA、RAW、偏移量

猜你喜欢

转载自www.cnblogs.com/doctorx/p/9834702.html