PE格式第三講擴展,VA,RVA,FA的概念
作者:IBinary
出處:http://www.cnblogs.com/iBinary/
版權所有,歡迎保留原文鏈接進行轉載:)
一丶VA概念
VA (virtual Address) 虛擬地址的意思 ,比如隨便打開一個PE,找下它的虛擬地址
這邊都是.
二丶模塊地址(image Base)
模塊地址,就是exe加載到內存的時候,所在的地址,
比如MZ位置,在那個位置,那么對應模塊地址就是這個位置
在OD中的內存中查看就是PE頭
三丶RVA(relative Virtual Address) 相對虛擬地址偏移
假設我們找一個虛擬地址
VA = 0X4001200 (虛擬地址)
那么算出他的相對偏移
那么我們就要看他屬於內存中那個節區了
可以看出,是在401000 ~ 41500之間,那么我們就用401000即可.
RVA = VA - 401000 得出的就是相對於虛擬地址的偏移
簡化
RVA = 401200 - 401000 = 200(RVA) 那么偏移就是200了
四丶FA(RAW)(File Address) 或者叫做 FOA (File Ofseet Address)
FA就是文件中的地址.
那么這個要看我們的節表了
節表(就是那個區)上面我們看了是.text 也就是代碼區,正好是屬於第一個節表,那么看第一個節表中的PointerToRawData成員即可.
五丶VAtoRaw(虛擬地址,轉化為文件偏移位置,就是虛擬地址的代碼,在文件那個偏移位置存儲)
首先你要明白 RVA 怎么計算,FA怎么看.
我們隨便找一個PE文件(我用最小的標准PE)
我要找40101A虛擬地址,在文件中的位置.
思路:
1.獲得虛擬地址(VA) 現在是40101A
2.查看屬於哪個節區表(點擊內存查看,OllyDbg)
大於401000,小於402000,所以節區屬於代碼區,也就是.text這個區域
3.算出RVA(相對虛擬地址偏移)
RVA = VA - 內存中節區地址
代入得到:
RVA = 40101A - 401000
RVA = 1A (相對虛擬地址偏移是1A)
4.RVA + 文件中的(相同節表,比如上面是.text,那么文件中看的節表就是.text這個節表)節表中的PointerToRawData成員記錄的大小 得出虛擬地址在文件中的偏移
1A + (文件中節表的偏移) = 實際虛擬地址在文件偏移記錄的代碼地址.
1A + 200 = 21A (虛擬地址在文件中的偏移)
200要查看節表,還記得上面我們算RVA的時候嗎,找的是內存中節區的地址,而這個地址正好是.text代碼區
那么在文件中我們也要找到這個位置.,節表是第一個,第一個就是,而表中存放的文件偏移就是200
那么現在去文件中的21A位置查看一下,看看是否是我們虛擬地址的代碼.
正是我們要找的地址,那么由此可以得出物理地址的代碼位置,在文件中存放的偏移在哪里.
總結:
其實很簡單,首先看屬於哪個節表的, 那么先算出RVA的值,然后讓RVA + 文件中相同節表中的成員(PointRawData) 那么最終就是虛擬地址代碼,在文件偏移的位置.
舉個例子
VA = 401456
RVA = 401456 - (.text的位置當然這個你得自己看,可能不是,這里默認是了)401000 = 456
FA = 456 + (文件中節表中的PointRawData,我假設是200,這里具體看PE中怎么存儲的)200 = 656(十六進制)
那么這個656文件偏移處,記錄的就是 虛擬地址(VA)401456的二進制代碼.
沒優化過的公式
VA = 401234
Image Bae = 400000
RVA = 401234 - 400000 = 1234
VPK = (內存中節區首地址 - image base) - 文件中節區的偏移地址(PointerToRawData 字段)
(401000 - 400000 ) - 400(這個值自己看文件,不一定是400)= 1000 - 400 = C00(vpk);
FA = RVA - VPK = 1234 - C00 = 634
例子:
已經知道VA = 401456
計算FA位置
RVA = 401456 - 00400000 = 1456
VPK = (401000 - 400000) - 文件中PointerToRawData 字段
= 1000 - 400 = C00
FA = RVA - VPK
= 1456- C00 = 856
優化的公式
FA = VA - 內存中節區地址 + 文件PointerToRawData 字段
列如VA = 401596
當然,節區你要看內存,上面已經說了怎么看.(怎么看節區表)
401596 - 401000 + 400
= 596 + 400
= 996 (FA)
如果按照上面的公式,我們再來計算一遍
VA = 401596
IMAGEbase = 400000
RVA = (虛擬地址 - 模塊地址)
=401596 - 400000
= 1596
VPK = (節區表首地址- 模塊地址) - 節表中的文件PointerToRawData 字段
= 401000 - 40000 - 400
= 1000 - 400
= C00 (vpk)
FA = RVA - VPK
= 1596 - C00
= 996
四丶文件偏移,轉為虛擬地址
首先計算文件偏移,我們需要知道文件的位置
比如
1.你要知道一個文件位置, (隨便哪個都行,把它轉換為內存虛擬地址)
2.我們要知道 文件偏移位置的大小,(也就是上面說的節表中的 PointerToRawData 字段)
3.我們要知道你給的文件位置屬於哪個區,這個是根據 上面計算出來FA的首地址的出來的
已經知道FA = 996
計算公式為
VA = FA +imagebase(模塊首地址) + VPK
VPK的值就是你要計算的
VPK = (內存中的節區表 - 模塊地址) - PointerToRawData字段
代入公式得
VA = 996 + 40000 + (401000 - 400000 - 400)
= 40996 + C00
= 41596 (虛擬地址位置)
如果不懂請下方評論.
作者:IBinary
出處:http://www.cnblogs.com/iBinary/
版權所有,歡迎保留原文鏈接進行轉載:)