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>
