PE文件RVA-VA-Offset

#???Name?????Virt?Size???RVA???????Phys?Size??Phys?Off???Flags

--??--------?---------??---------??---------??---------??---------

01??.text?????0000CCC0???00001000???0000CE00???00000600???60000020?[]

02??.data000046280000E00000002C000000D400C0000040?[]

03??.rsrc?????000003C8???00013000???00000400???00010000???40000040?[]

對于變量A來說:

File_Offset???就是磁盤文件中A的位置。

File_Offset?=?VA?-?ImageBase?-?VRk?=?RVA?-?VRk

ImageBase?????就是文件加載到內(nèi)存的起始位置。

ImageBase?=?VA?-?RVA

多為:0x00400000,0x01000000

EntryPoint????就是.text的VA地址。

VA????就是內(nèi)存映像中A的位置,即A的地址。

VA?=?ImageBase?+?FileOffset?+?VRk?=?ImageBase?+?RVA

RVA???就是內(nèi)存映像中A的位置與文件映射基址的差。

RVA?=?VA?-?ImageBase?=?File_Offset?+?VRk

PS:?VA??就好比是“某一時刻”,例如:九點到校上課。

RVA?就好比是“某一時間段”,例如:七點起床后,過兩個小時到校上課。

VA??是絕對的,一旦確定便不可更改。九點到校遲一秒鐘也不行。

RVA?是系相對的,雖然說過兩個小時到校上課,但是如果我七點起床,便是九點上課。

而如果我八點起床,便是十點上課了。

VRk??就是文件映射到內(nèi)存后,每一節(jié)之間填充的00的個數(shù)。

由于要進行對齊,所以文件加載到內(nèi)存后每一節(jié)之間要填充大量00

因此文件中A的位置會變化。由于各個文件頭與各個節(jié)大小不變,所以:

VRk?=?RVA?-?File_Offset?=?<填充的00的個數(shù)>

最終,我們計算:

由FileOffset到RVA/VA:

ImageBase????=?00400000

A?FileOffset?=?00000450

RVA?=?FileOffset(A)?+?(?RVA(.data)?-?FileOffset(.data)?)

=?FileOffset(A)?+??VRk

=?0000D450?+?(?0000E000?-?0000D400?)

=?0000D450?+?C00

=?0000E050

VA??=?RVA?+?ImageBase?=?0000E050?+?00400000?=?0040E050

由RVA/VA到FileOffset:

RVA?=?0000E050???/???VA?=?0040E050???/???ImageBase?=?00400000

FileOffset?=?RVA(A)?-?RVk

=?RVA(A)?-?(?RVA(.data)?-?FileOffset(.data)?)

=?0000E050?-?(?0000E000?-?0000D400?)

=?0000E050?-?C00

=?0000D450

轉(zhuǎn)載鏈接 : http://www.xuebuyuan.com/1469971.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容