RVA與FOA的轉換

2021-10-04 13:46:33 字數 879 閱讀 2668

1.pe程式加載入記憶體後頭的位址與檔案中一致,但對齊方式(偏移)不同

2.結構體:

typedef struct _image_section_header  misc;

dword virtualaddress; //節區的rva位址

dword sizeofrawdata; //在檔案中對齊後的尺寸

dword pointertorawdata; //在檔案中的偏移

dword pointertorelocations;

dword pointertolinenumbers;

word numberofrelocations;

word numberoflinenumbers;

dword characteristics; //節的屬性

} image_section_header, *pimage_section_header;

3.rva到foa的轉換:

<1>得到rva的值:記憶體位址-imagebase

<2>判斷rva是否位於pe頭中,如果是:foa == rva

<3>判斷rva屬於哪個節:

rva >= 節.virtualaddress

rva <= 節.virtualaddress

差值= rva - 節.virtualaddress

<4>foa = 節.pointertorawdata + 差值

RVA與FOA的轉換

我們執行程式可以看見相應的值,那麼我們可以是否可以在檔案中直接搜尋對應的值然後修改呢?這種方法沒有毛病,但是檔案中也許會存在很多個0x12345678,你無法準確的知道哪乙個才是全域性變數 那麼,又是否可以通過已經給出的這個位址0x42ba30直接去尋找呢?當然也是不行的,因為在之前章節的學習中我們...

PE檔案學習 RVA與FOA轉換

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

PE檔案結構 RVA與FOA的轉換

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