脫殼入門 關於重定位表的重建

2022-06-14 15:27:09 字數 1757 閱讀 7545

對於脫dll檔案的殼時需要注意對重定位表的操作,在重建重定位表的時候需要注意殼**是否對原程式中需要重定位的資料進行了加密。也就是在dump檔案時不能單純的nop過殼的重定位**,因為有可能重定位資料被加密了。如果直接nop過此殼的重定位處理**,那麼dump的檔案中的需要重定位的資料是錯誤的。

按照正常的思路在獲取oep後,我們需要找到殼的重定位**處。

直接nop過殼的重定位**

到達殼的重定位**處,將修正重定位資料的指令直接nop去。

然後我們執行程式來到oep跳轉處

這是我們檢視對應函式真正入口處的**,發現需要重定位的資料並沒有被重定位。

但是我們發現其重定位資料的位址有點怪。因為程式預設的載入基位址為0x400000,正常的話如果沒有重定位其需要重定位的資料的位址應該為0x400000+,而這裡我們發現其位址並不是這樣的(實際是被殼加密過的)。

接著重建輸入表,重定位表。

做完這些之後我們獲得了最終的dll,用od載入後我們來到oep處,然而我們發現其重定位的位址並不是 「基位址+」 的形式。

是不是重定位表沒用被windows載入器使用呢,我們計算一下。根據重定位資料的原理,在沒有重定位的時候(也就是我們nop去殼的重定位**)獲得的oep處第乙個需要重定位資料的位址為0x689d0000,而我們在重建了重定位表後oep第乙個需要重定位資料的位址為0x687f0000,而此時程式載入基位址為0x220000。 0x689d0000 - 0x400000 + 0x220000 正好等於 0x687f0000。說明重定位表發揮作用了,如果我們直接執行程式將出錯因為重定位資料位址不正確會訪問到無效的位址。

錯誤原因

這是因為我們忽略了殼**會對重定位資料位址進行加密,直接nop去了修正重定位資料位址的**導致的。

找到oep後,接著找到殼重定位**處。

經過分析其在修正重定位位址時會把(實際的載入基位址 + **段rva)通過esi給eax,我們為了恢復被加密的重定位資料位址只需將esi改為(預設的基位址0x400000 + **段rva)即可。

接著執行程式到oep處,發現此時需要重定位資料的形式變為 「0x400000+」的形式,解密成功。

接著dump程式,重建輸入表和重定位表。

在進行dll檔案脫殼時,dump程式的時候不能一味的直接跳過殼的重定位**,需要考慮原程式的重定位資料位址是否被殼加密。

基址重定位表

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

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...