PE重定位表解析

2021-10-09 06:46:49 字數 1152 閱讀 9950

在模組被載入到記憶體中,如果該模組沒有裝載到期待的位置,裡面以固定形式而不是以偏移形式硬編碼的位址就需要修正,這樣程式才能被正確載入。

例如:call 401203。這個在編譯器編譯的時候將call後面的函式位址以硬編碼的形式固定住,那麼一旦模組不是被載入到40000的基址,而是被載入到100000,則這條函式呼叫指令就不能正確找到函式,這時候就需要修正這個401203為1001203才可以。這就需要重定位表了

可選pe頭中資料目錄項的第6個結構就是重定位表。

注意:如果想在檔案中找到重定位表,需要將rva(記憶體偏移)轉為foa(檔案偏移)。不懂朋友可以去看看我上幾篇的文章

重定位表的前8個位元組為virtualaddress和sizeofblock,後面跟著是具體的需要修正的資料。virtualaddress是統一的偏移。

例如:需要修正的位址記憶體偏移為0x80010。那麼一般的virtualaddress為0x80000,後面data存的資料為0x10。這樣好處是:

1、可以以頁對齊,加快搜素速度。

2、節省記憶體空間。

注意:1、 data的大小為2位元組,其中高4位為3代表該位置資料需要修正。

2、當前這乙個塊的資料,data的低12位的值+virtualaddress 才是需要修復的資料的rva。

3、當前塊的總大小具體項的數量 = (sizeofblock - 8)/2

bool relocation

(char

* filebuffer)

//實際存的數量需要減去頭部的8位元組

dword sizeblock = relocation->sizeofblock -8;

for(

int i =

0; i < sizeblock /

2; i++)}

relocation =

(pimage_base_relocation)((

char

*)relocation + relocation->sizeofblock);}

return true;

}

PE 重定位表

參考文章 重定位表 relocation table 用於在程式載入到記憶體中時,進行記憶體位址的修正。為什麼要進行記憶體位址的修正?我們舉個例子來說 test.exe可執行程式需要三個動態鏈結庫dll a.dll,b.dll,c.dll 假設test.exe的imagebase為400000h,而...

PE檔案解析之資源表解析

根據pe檔案格式我們可以快速找到目錄表陣列位置,在目錄表陣列中我們可以找到資源表在 我們看出資源表位置為0x4000,大小為0xb20。資源表所對應資料結構為image resource directory typedef struct image resource directory image ...

PE檔案結構詳解(六)重定位

前面兩篇 pe檔案結構詳解 四 pe匯入表 和 pe檔案結構詳解 五 延遲匯入表 在這裡,ie的iexplorer.exe匯入了kernel32.dll的getcommandlinea函式,可以看到這是個間接call,00401004這個位址的記憶體裡儲存了目的位址,根據圖中顯示的符號資訊可知,00...