基址重定位表

2021-10-09 04:37:20 字數 2164 閱讀 9279

向程序的虛擬記憶體載入pe檔案(exe/dll/sys)時,問價會被載入到pe頭的imagebase所指的位址處,若載入的時dll(sys)檔案,且在imagebase位置處已經載入了其他dll檔案,那麼pe裝載器就會將其載入到其他未被占用的空間,這就是pe檔案的重定位。

ex:a.dll被載入到test.exe程序的10000000位址處,此後,b.dll試圖載入到相同位址(10000000)時,pe裝載器將b.dll載入到另乙個尚未被占用的位址(3c000000)處。

建立好程序後,exe檔案會首先被載入到記憶體,所以在exe中無須考慮重定位的問題,但是windows vista之後的版本引入了aslr安全機制,每次exe檔案都會被載入到隨機位址,這樣大大增強了系統的安全性。

可以看到notepad.exe的imagebase為01000000.

使用ollydbg開啟notepad.exe,在aslr機制作用下,程式被載入到00c80000位址處,從圖中指令可以看到,斷點處的程序的記憶體位址以硬編碼形式存在,位址c810fc、c81100是.text節區的iat區域,位址c8c0a4是.data節區的全域性變數,每當ollydbg中重啟notepad.exe,位址值就隨載入位址的不同而改變。硬編碼在程式中記憶體位址隨當前載入位址變化而改變處理過程就是pe重定位。

無法載入到imagebase位址時,若未進行過pe重定位處理,應用程式就不能正常執行。

基本的操作原理

其中最關鍵的是查詢硬編碼位址的位置,查詢過程中會用到pe檔案內部的relocationtable(重定位表),它是記錄硬編碼位址偏移的列表。

基址重定位表位址位於pe頭的datadirectory陣列的第6個元素(陣列索引為5)。

基址重定位表羅列了硬編碼位址的偏移,讀取這張表就能獲得準確的硬編碼位址偏移,基址重定位表是image_base_relocation結構體陣列。

typedef struct _image_base_relocation  image_base_relocation;

typedef image_base_relocation unaligned * pimage_base_relocation;

sizeofblock:表示該分組儲存了幾項重定位項。

typeoffset:這個域有兩個含義,大家都知道,頁內偏移用12位就可以表示,剩下的高4位用來表示重定位的型別。而事實上,windows只用了一種型別image_rel_based_highlow 數值是 3。

基址重定位分析方法

查詢程式中的硬編碼位址的偏移可以通過基址重定位表查到,使用上面求得rva 1420,使用peview檢視rva 1420位址中的內容。

讀取值後,減去imagebase值(va -> rva)

010010c4 - 010000000 = 000010c4

加上實際載入位址(rva -> va)

000010c4 + 00c80000 = 00c810c4

對於程式內硬編碼的位址,pe裝載器都做如上處理,根據實際載入的記憶體位址修正後,將得到的值覆蓋到同一位置。對乙個image_base_relocation結構體的所有typeoffset都重複上述過程,且對於rva 1000~2000位址區域對應的所有硬編碼位址都要進行pe重定位處理,若typeoffset值為0,則表明乙個image_base_relocation結構體結束。

對重定位表**現的所有image_base_relocation結構體都重複上述處理後,就完成了對程序記憶體區域相應的所有硬編碼位址的pe重定位,重定位表以null結構體結束。

第16章 基址重定位 2

pe重定位 使得硬編碼在程式中的記憶體位址隨當前載入位址的變化而變化就是pe重定位.若不新增重定位,而載入時記憶體位址被占用,則會出現 記憶體位址引用錯誤 使得程式異常終止.pe重定位的操作原理 查詢硬編碼位址需要用到重定位表 relocation table 它是記錄硬編碼位址偏移的列表.是pe檔...

PE 重定位表

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

7 重定位表

一種重定位方法 g dwvar dd call f pop ebx sub ebx,offset b 執行時的 eip減去編譯時的 eip,算出偏移 mov eax,ebx offset g dwvar dll和 fixed no 選項都會產生重定位表 一般會多出乙個.reloc的節 typedef...