PE格式第三講擴展,VA,RVA,FA(RAW),模塊地址的概念


          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/
版權所有,歡迎保留原文鏈接進行轉載:)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM