2014-07-18 75 views

回答

5

要應用修正,一個增量被計算爲,其中圖像實際上是 加載底座的 首選基址之間的差,和。

的基本思路是,做一些地址鏈接地址信息時,我們必須知道

  1. 什麼內存必須改變(「偏移」字段)
  2. 所需要的價值爲它的搬遷( 「Δ」值)
  3. 重定位的數據和增量值的部分要使用的(「類型」字段)

這裏是「類型」字段的一些可能的值

  • HIGH - 三角的低位字添加到值在「偏移」
  • HIGHLOW - - 增量的較高字(16位)的16位值在「偏移」
  • LOW添加添加完整增量在32位值「偏移」

換句話說,HIGHLOW類型告訴程序,它在做從這個搬遷塊*頁面偏移「偏移」修復行動,那有一個雙字需要修改爲了有正確的工作可執行文件。

*全部搬遷條目被分成塊,每塊有其條目應用於

假設你已經在你的代碼該指令的頁面:

section .data 
message: "Hello World!", 0 

section .code 
... 
mov eax, message 
... 

運行彙編程序並立即運行反彙編程序。現在,你的代碼看起來是這樣的:

mov eax, dword [0x702000] 

現在很好奇爲什麼會0x700000,當你看看文件轉儲,您將看到

ImageBase:  0x00700000 

現在你明白哪裏這個號碼來來自並且您準備好運行可執行文件。 將可執行文件加載到內存併爲其創建地址空間的加載程序發現,內存0x700000不可用,並且需要將該文件放在其他位置。它決定0xf00000將會正常並在那裏複製文件內容。

但是,您的程序僅與0x700000上的數據鏈接,鏈接器無法知道其輸出將被重新定位。正因爲如此,裝載機必須發揮它的魔力。它

  1. 計算增量值 - 舊地址(圖像庫)是0x700000但它希望0xf00000(優選地址)。它從另一箇中減去一個並得到0x800000
  2. 進入文件.reloc部分
  3. 檢查是否還有其他頁面(4KB數據)需要重新定位。如果不是,則繼續調用文件的入口點。 4.對於 每搬遷當前頁面,它
  4. 獲得在搬遷數據偏移
  5. 增加delta值(方式與類型字段狀態)
  6. 地方在搬遷新值偏移
  7. 繼續在步驟3上

還有更多類型的重定位條目,其中一些是特定於體系結構的。要查看完整列表,請閱讀「Microsoft可移植可執行文件和通用目標文件格式,部分6.6.2。修復類型」

2

您在這裏看到的是Microsoft Windows可執行文件中「基本重定位表」的內容。

基於Windows的DLL文件重定位表是必需的,它們對於可執行文件是可選的;它們包含有關地址信息在EXE/DLL文件中的位置的信息,當內存中的DLL文件的實際地址已知時(將DLL加載到內存中時),必須更新該文件。 Windows使用此表中存儲的信息來更新地址信息。

該表支持不同類型的地址,而命名是特定於Microsoft的:ABSOLUTE(= dummy),HIGH,LOW,HIGHLOW,HIGHADJ和MIPS_JMPADDR。

常量的全名是「IMAGE_REL_BASED_HIGHLOW」。

「ABSOLUTE」類型通常是插入的虛擬條目,以確保表的各部分長度爲4(或8)個字節的倍數。

在x86 CPU上,只使用「HIGHLOW」類型:它告訴Windows有關文件中絕對(32位)地址的位置。

一些背景資料:

在你的榜樣「圖像庫」可以爲0x20000000這意味着EXE/DLL文件已編制被加載到地址0x2000.0000。在地址0x200113B5(0x20000000 + 0x11000 + 0x3B5)和0x200113C1處有絕對地址。

假設位於0x200113B5的存儲器包含值0x20,該值是程序中函數或變量的地址。

也許無法使用地址0x20000000處的內存,Windows決定將該DLL加載到0x50000000的內存中。然後0x20必須替換爲0x50。

Windows使用基址重定位表中的信息來查找必須替換的所有地址。

相關問題