Windows安全之PE結構(七)之重定位表(Relocation Table)結構分析
什麼是重定位呢.. 是把我們一些地址,重新定位的意思。 我們都知道每個程序在windows系統中 都有自己4GB的虛擬空間, 可是如果在WIN系統只有.EXE這樣一種PE文件的話。真是沒有重定位的重要性存在,可是事實有動態鏈接庫.DLL檔 , DLL檔本身自己是沒有一個虛擬空間,而他是需要被加載到不同的.EXE的私有空間中, 當加載後 有什麼基址是需要重定位呢? 就是DLL中的一些牽涉到直接尋址的一些指令 就需要進行重定位處理 直接尋址: 簡單意義就是在匯編代碼中 看到有 [XXXXXXX] 的語句 基本上都需要重定位 間接尋址: 這是額外知識, 匯編語言可以把一個地址存入eax 然後透過eax去尋址,這個eax就不需要重定位了 那重定位 究竟需要什麼呢?? 首先一定是需要重定位的地方 然後就是重定位的結果 如下圖 dec dword ptr [100030000] push dword ptr [10003000] mov eax, dword ptr[10003000] 這三個地址是需要進行重定位的,因為這是反匯編.dll檔後的靜態地址,加載後這個地址就不一樣了 假如加載後 dll在exe檔中的虛擬基地址是0x20000000 那0x20000000h - 0x10000000h = 0x10000000 這裡0x20000000是假設加載dll模塊到exe的虛擬空間後,他的基址是0x20000000 他如 預設DLL的基址 相差了10000000H 那我們就需要把dll中所有的直接尋址 後移10000000H 以上面的例子就是 dec dword ptr [200030000] push dword ptr [20003000] mov eax, dword ptr[20003000] 可是我們怎麼知道重定位表有多少個內容需要重定位呢?? 整個.reloc區塊就如下圖 IMAGE_BASE_RELOCATION STRUCT VirtualAddress DWORD ? ;重定位表的rva SizeOfBlock DWORD ? ;重定位表的大小 TypeOffset WORD ? ;每一項佔一個字(兩個byte) IMAGE_BASE...