(轉)RVA-相對虛擬地址解釋


RVA是相對虛擬地址(Relative Virtual Address)的縮寫,顧名思義,它是一個“相對”地址,也可以說是“偏移量”,PE文件的各種數據結構中涉及到地址的字段大部分都是以RVA表示的。

准 確地說,RVA就是當PE文件被裝載到內存中后,某個數據的位置相對於文件頭的偏移量。舉個例子,如果Windows裝載器將一個PE文件裝入 00400000h處的內存中,而某個節中的某個數據被裝入0040xxxxh處,那么這個數據的RVA就是(0040xxxxh- 00400000h)=xxxxh,反過來說,將RVA的值加上文件被裝載的基地址,就可以找到數據在內存中的實際地址。

PE文件中出現RVA的 概念是因為PE的內存映像和磁盤文件映像是不同的,同一數據相對於文件頭的偏移量在內存中和在磁盤文件中可能是不同的,為了提高效率,PE文件頭中使用的 都是內存映像中的偏移量,也就是RVA。從圖17.3中也可以得到另一個結論,那就是RVA僅僅是對於處於節中的數據而言的,對於文件頭和節表來說無所謂 RVA和文件偏移,因為它們在被映射到內存中后不管是大小還是偏移都不會有任何改變。

 

2、匯編中虛擬地址(VRA)與文件偏移地址(FileOffset)的相互轉換:

+---------+---------+---------+---------+---------+---------+

|  段名稱   虛擬地址  虛擬大小  物理地址  物理大小   標志   |

+---------+---------+---------+---------+---------+---------+

|  Name     VOffset    VSize    ROffset    RSize      Flags |

+---------+---------+---------+---------+---------+---------+

|  .text   00001000   00000092  00000400  00000200  60000020|

|  .rdata  00002000   000000F6  00000600  00000200  40000040|

|  .data   00003000   0000018E  00000800  00000200  C0000040|

|  .rsrc   00004000   000003A0  00000A00  00000400  C0000040|

+---------+---------+---------+---------+---------+---------+

文件虛擬偏移地址和文件物理偏移地址的計算公式如下:

 

>>>>>>>VaToFileOffset( 虛擬地址轉文件偏移地址)

如VA = 00401000 (虛擬地址)

ImageBase = 00400000 (基地址)

VRk = VOffset - ROffset = 00001000 - 00000400 = C00 (得出文件虛擬地址和文件物理址之間的VRk值)

FileOffset = VA - ImageBase - VRk = 00401000 - 00400000 - C00 = 400(文件物理地址的偏移地址)

 

如VA = 00401325,則:

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

 

>>>>>>FileOffsetToVa( 文件偏移地址轉虛擬地址)

如FileOffset = 435(文件偏移地址)

VA = FileOffset + ImageBase + VRk = 435 + 00400000 + C00 = 00401035(虛擬地址)

 

源文檔 <http://blog.csdn.net/xuexi1028/article/details/6948591>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM