相对虚拟地址解释,二进制文件概述

《软件漏洞分析技术》笔记

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

PE文件:


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

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

PE文件中出现RVA的
概念是因为PE的内存映像和磁盘文件映像是不同的,同一数据相对于文件头的偏移量在内存中和在磁盘文件中可能是不同的,为了提高效率,PE文件头中使用的
都是内存映像中的偏移量,也就是RVA。从图17.3中也可以得到另一个结论,那就是RVA仅仅是对于处于节中的数据而言的,对于文件头和节表来说无所谓
RVA和文件偏移,因为它们在被映射到内存中后不管是大小还是偏移都不会有任何改变。

  可执行文件:包含二进制代码,字符串,菜单,图标,位图字体等。

 

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

2、汇编中虚拟地址(VRA)与文件偏移地址(FileOffset)的相互转换:

  典型PE文件通常包含:.text(编译器产生,存放二进制代码,
反汇编和调试的对象)、.data(初始化数据块)、.idata(使用的外来函数如动态链接库与文件信息)、.rsrc(存放程序资源),还包括其他如.reloc、.edata、.tls、.rdata等。

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

虚拟内存:

|  段名称   虚拟地址  虚拟大小  物理地址  物理大小   标志   |

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

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

  物理内存通常内核级别ring0才能看到;通常用户模式下看见的为Windows用户态内存映射机制下的虚拟内存。

|  Name     VOffset    VSize    ROffset    RSize      Flags |

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

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

必赢官网 1

|  .text   00001000   00000092  00000400  00000200  60000020|

  这种情况和实际生活中银行相似,你需要用的钱其实并不等于你拥有的财富,银行实际存有的金额数小于所有储户的财富和。

|  .rdata  00002000   000000F6  00000600  00000200  40000040|

  那万一有用户需要取出超出实际金额数怎么办,操作系统原理中有“虚拟内存”概念,
即在这种情况下有时会将“部分硬盘空间”暂时作为内存使用。(两者“虚拟内存“概念对象不一,不宜混淆)

|  .data   00003000   0000018E  00000800  00000200  C0000040|

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

|  .rsrc   00004000   000003A0  00000A00  00000400  C0000040|

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

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

  (2).装载基址(Image Base):PE装入内存时的基地址。默认EXE文件在内存中的基地址为0x00400000,DLL为0x10000000。当然位置可由编译选项更改。

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

  (3).虚拟内存地址(Virtual
Address,VA):PE文件中的指令被装入内存后的地址。

 

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

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

  VA、Image Base、RVA之间关系:

如VA = 00401000 (虚拟地址)

        VA = Image Base + RVA;

ImageBase = 00400000 (基地址)

发表评论

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