www.350.vip:二进制文件概述,相对虚拟地址解释

www.350.vip 1

|  .rdata  00002000   000000F6  00000600  00000200  40000040|

  内存管理器可以使进程在实际只有512MB物理内存的情况下使进程“认为”自己拥有4GB内存(其中包括代码,
栈空间,资源区,动态链接库等)。

FileOffset = VA – ImageBase – VRk = 00401325 – 00400000 – C00 = 725

  默认情况下:一般PE文件的0字节
=》虚拟内存0x00400000位置,即所谓的装载地址。

|  .rsrc   00004000   000003A0  00000A00  00000400  C0000040|

  那么就可以计算出:

 

  按上表,比如计算虚拟内存中0x00404141处的一条指令,要换算出该指令在文件中的偏移量:

源文档 <>

PE文件:

文件虚拟偏移地址和文件物理偏移地址的计算公式如下:

  (4).相对虚拟地址(Relative Virtual
Address,RVA):内存地址相对于映射基址(即装载基址)的偏移量。

如VA = 00401000 (虚拟地址)

  PE(Portable
Executable)是win32平台下可执行遵守的数据格式。平时常见的比如*.exe和*.dll都是PE文件。

 

www.350.vip 2

 

 

VRk = VOffset – ROffset = 00001000 – 00000400 = C00 (得出文件虚拟地址和文件物理址之间的VRk值)

www.350.vip 3


确地说,RVA就是当PE文件被装载到内存中后,某个数据的位置相对于文件头的偏移量。举个例子,如果Windows装载器将一个PE文件装入
00400000h处的内存中,而某个节中的某个数据被装入0040xxxxh处,那么这个数据的RVA就是(0040xxxxh-
00400000h)=xxxxh,反过来说,将RVA的值加上文件被装载的基地址,就可以找到数据在内存中的实际地址。

  可理解为: 实际 = 基点 + 位移.

+———+———+———+———+———+———+

  装载PE文件时,文件偏移地址(磁盘上)与RVA(内存上)有很大一致性(操作系统会尽量保持PE中各数据结构),那同样会有细微差异,由文件数据和内存数据的存放单位不同造成。

RVA是相对虚拟地址(Relative Virtual
Address)的缩写,顾名思义,它是一个“相对”地址,也可以说是“偏移量”,PE文件的各种数据结构中涉及到地址的字段大部分都是以RVA表示的。

  在PE文件中,以磁盘数据标准存放(我们知道硬盘以一个section为基本单位,即512byte),0x200字节,当一个数据节不足0x200字节时填充0x00;

|  .data   00003000   0000018E  00000800  00000200  C0000040|

  Windows内存:1.物理内存层面;2.虚拟内存层面。

+———+———+———+———+———+———+

        VA = Image Base + RVA;

ImageBase = 00400000 (基地址)

PE文件与虚拟内存之间的映射

如VA = 00401325,则:

  (1).文件偏移地址(File Offset):数据在PE文件中的地址,在磁盘上存放时相对于文件开头的偏移。

|  Name     VOffset    VSize    ROffset    RSize      Flags |

      文件偏移量 = 0x00404141 – 0x00400000(默认的Image
Base)-(0x1000 – 0x400)(代码存于.text文件中) = 0x3541

>>>>>>FileOffsetToVa( 文件偏移地址转虚拟地址)

  运行时操作系统会按PE文件的约定定位资源并装载入内存。可执行文件
——>拆分——>若干数据节<——不同的资源。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注