PE格式第三講擴展,VA,RVA,FA的概念

做者:IBinary
出處:http://www.cnblogs.com/iBinary/
版權全部,歡迎保留原文連接進行轉載:)優化

一丶VA概念

VA (virtual Address) 虛擬地址的意思 ,好比隨便打開一個PE,找下它的虛擬地址spa

這邊都是.3d

二丶模塊地址(image Base)

模塊地址,就是exe加載到內存的時候,所在的地址,blog

好比MZ位置,在那個位置,那麼對應模塊地址就是這個位置內存

在OD中的內存中查看就是PE頭get

三丶RVA(relative Virtual Address) 相對虛擬地址偏移

假設咱們找一個虛擬地址二進制

VA = 0X4001200   (虛擬地址)im

那麼算出他的相對偏移總結

那麼咱們就要看他屬於內存中那個節區了img

能夠看出,是在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/
版權全部,歡迎保留原文連接進行轉載:)

堅持兩字,簡單,輕便,可是真正的執行起來確實須要很長很長時間.當你把堅持兩字當作你要走的路,那麼你總會成功.

相關文章
相關標籤/搜索