RVA與FOA的轉換

2022-10-11 12:18:09 字數 1443 閱讀 7081

我們執行程式可以看見相應的值,那麼我們可以是否可以在檔案中直接搜尋對應的值然後修改呢?這種方法沒有毛病,但是檔案中也許會存在很多個0x12345678,你無法準確的知道哪乙個才是全域性變數;那麼,又是否可以通過已經給出的這個位址0x42ba30直接去尋找呢?當然也是不行的,因為在之前章節的學習中我們了解到,pe檔案有2種狀態(動靜態),在這2種狀態下,檔案的對齊方式會發生變化,所以當前的位址是pe檔案執行時(動態)的位址,你需要轉換成在磁碟上(靜態)的位址。

這兩種狀態的位址相互轉換,我們可以稱之為rva與foa的轉換rva就是相對虛擬位址(執行時的位置)foa就是檔案偏移地

址(磁碟靜態的位置);從rva轉換到foa,就是從檔案執行時(動態)的位址轉換成在磁碟上(靜態)的位址,按如下公式可以

進行轉換:

第一步:rva位址由記憶體位址減去imagebase位址(pe檔案在記憶體中的開始位置是由擴充套件pe頭中的imagebase決定);

第二部判斷rva位址是否位於pe頭中:

a.如果是,那麼rva等於foa;

b.如果不是,判斷rva在哪個節

i. 當滿足rva位址大於等於節.virtualaddress和rva位址小於等於.virtualaddress加上當前節記憶體對齊後的大小,就表示rva位址在該節中。

ii. rva位址減去節.virtualaddress等於差值,foa位址就是根據.pointertorawdata加上差值。

在一些較老的編譯器中,編譯出來的檔案會區分檔案對齊、記憶體對齊,但是在現在的編譯器編譯出來的程式,

檔案對齊與記憶體對齊時完全一樣的,所以我們不用費這麼大的周折,我們只需要算出rva的值就可以得出foa

的值。例如,在當前程式中就是這樣,根據0x42ba30-0x400000(imagebase)得出0x2ba30,其是rva,也是foa,直

接使用winhex開啟找到:

可以直接修改它然後儲存執行,這時候你就會發現全域性變數的值已經發生了改變:

RVA與FOA的轉換

1.pe程式加載入記憶體後頭的位址與檔案中一致,但對齊方式 偏移 不同 2.結構體 typedef struct image section header misc dword virtualaddress 節區的rva位址 dword sizeofrawdata 在檔案中對齊後的尺寸 dword ...

PE檔案學習 RVA與FOA轉換

當我們的pe檔案沒有被裝載到記憶體中的時候,它是以什麼樣的儲存方式在磁碟中儲存呢?當被裝載到記憶體之後,pe檔案的內容又是什麼樣的光景呢?今天我們說的重點就是rva和foa的轉換,之前我們已經知道pe檔案在磁碟檔案中的對齊粒度是0x200,在記憶體中的對齊粒度是0x1000,我們來看一張 windo...

PE檔案結構 RVA與FOA的轉換

如果有初始值,初始值是存在pe檔案中的。在檔案中和在記憶體中的對齊方式不一樣。有些情況下記憶體對齊和檔案對齊一樣的也需要計算才能找到對應的位置!記憶體中展開從imagebase 擴充套件pe頭中 開始,然後依次對齊。rva 相對虛擬位址 記憶體中的位址 imagebase foa file offs...