(转)RVA-相对虚拟地址解释
RVA是相對(duì)虛擬地址(Relative Virtual Address)的縮寫(xiě),顧名思義,它是一個(gè)“相對(duì)”地址,也可以說(shuō)是“偏移量”,PE文件的各種數(shù)據(jù)結(jié)構(gòu)中涉及到地址的字段大部分都是以RVA表示的。
準(zhǔn) 確地說(shuō),RVA就是當(dāng)PE文件被裝載到內(nèi)存中后,某個(gè)數(shù)據(jù)的位置相對(duì)于文件頭的偏移量。舉個(gè)例子,如果Windows裝載器將一個(gè)PE文件裝入 00400000h處的內(nèi)存中,而某個(gè)節(jié)中的某個(gè)數(shù)據(jù)被裝入0040xxxxh處,那么這個(gè)數(shù)據(jù)的RVA就是(0040xxxxh- 00400000h)=xxxxh,反過(guò)來(lái)說(shuō),將RVA的值加上文件被裝載的基地址,就可以找到數(shù)據(jù)在內(nèi)存中的實(shí)際地址。
PE文件中出現(xiàn)RVA的 概念是因?yàn)镻E的內(nèi)存映像和磁盤文件映像是不同的,同一數(shù)據(jù)相對(duì)于文件頭的偏移量在內(nèi)存中和在磁盤文件中可能是不同的,為了提高效率,PE文件頭中使用的 都是內(nèi)存映像中的偏移量,也就是RVA。從圖17.3中也可以得到另一個(gè)結(jié)論,那就是RVA僅僅是對(duì)于處于節(jié)中的數(shù)據(jù)而言的,對(duì)于文件頭和節(jié)表來(lái)說(shuō)無(wú)所謂 RVA和文件偏移,因?yàn)樗鼈冊(cè)诒挥成涞絻?nèi)存中后不管是大小還是偏移都不會(huì)有任何改變。
2、匯編中虛擬地址(VRA)與文件偏移地址(FileOffset)的相互轉(zhuǎn)換:
+---------+---------+---------+---------+---------+---------+
|段名稱虛擬地址虛擬大小物理地址物理大小標(biāo)志|
+---------+---------+---------+---------+---------+---------+
|NameVOffsetVSizeROffsetRSizeFlags|
+---------+---------+---------+---------+---------+---------+
|.text0000100000000092000004000000020060000020|
|.rdata00002000000000F6000006000000020040000040|
|.data000030000000018E0000080000000200C0000040|
|.rsrc00004000000003A000000A0000000400C0000040|
+---------+---------+---------+---------+---------+---------+
文件虛擬偏移地址和文件物理偏移地址的計(jì)算公式如下:
>>>>>>>VaToFileOffset(虛擬地址轉(zhuǎn)文件偏移地址)
如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(文件偏移地址轉(zhuǎn)虛擬地址)
如FileOffset=435(文件偏移地址)
VA=FileOffset+ImageBase+VRk=435+00400000+C00=00401035(虛擬地址)
源文檔 <http://blog.csdn.net/xuexi1028/article/details/6948591>
紙上得來(lái)終覺(jué)淺,絕知此事要躬行
總結(jié)
以上是生活随笔為你收集整理的(转)RVA-相对虚拟地址解释的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用软链接的方式迁移Docker
- 下一篇: 【线性代数】零空间矩阵