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