做者:IBinary
出處:http://www.cnblogs.com/iBinary/
版權全部,歡迎保留原文連接進行轉載:)優化
VA (virtual Address) 虛擬地址的意思 ,好比隨便打開一個PE,找下它的虛擬地址spa
這邊都是.3d
模塊地址,就是exe加載到內存的時候,所在的地址,blog
好比MZ位置,在那個位置,那麼對應模塊地址就是這個位置內存
在OD中的內存中查看就是PE頭get
假設咱們找一個虛擬地址二進制
VA = 0X4001200 (虛擬地址)im
那麼算出他的相對偏移總結
那麼咱們就要看他屬於內存中那個節區了img
能夠看出,是在401000 ~ 41500之間,那麼咱們就用401000便可.
RVA = VA - 401000 得出的就是相對於虛擬地址的偏移
簡化
RVA = 401200 - 401000 = 200(RVA) 那麼偏移就是200了
FA就是文件中的地址.
那麼這個要看咱們的節表了
節表(就是那個區)上面咱們看了是.text 也就是代碼區,正好是屬於第一個節表,那麼看第一個節表中的PointerToRawData成員便可.
首先你要明白 RVA 怎麼計算,FA怎麼看.
咱們隨便找一個PE文件(我用最小的標準PE)
我要找40101A虛擬地址,在文件中的位置.
思路:
大於401000,小於402000,因此節區屬於代碼區,也就是.text這個區域
RVA = VA - 內存中節區地址
代入獲得:
RVA = 40101A - 401000
RVA = 1A (相對虛擬地址偏移是1A)
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/
版權全部,歡迎保留原文連接進行轉載:)
堅持兩字,簡單,輕便,可是真正的執行起來確實須要很長很長時間.當你把堅持兩字當作你要走的路,那麼你總會成功.