#???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