標籤:blog http os 使用 檔案 2014 log 代碼 c
基礎知識
一、虛擬位址和位移量轉換
由於Windows程式是運行在386保護模式下,在保護模式下,程式訪問儲存空間所使用的邏輯地址稱為虛擬位址(Virual Address,VA)。與真實位址模式下的分段地址類似,虛擬位址也可寫成"段:位移量"的形式,這裡的段是指段選取器。
檔案執行時將被映像到指定記憶體位址中,這個初始記憶體位址稱為基址(imageBase)。在Windows NT中,預設的值是10000h;對於DLLs,預設值為400000h。在Windows 9x中,10000h不能用來裝入32位的執行檔案,因為該地址處於所有進程共用的線性地址地區,因此Microsoft將Win32可執行檔的預設基地址改變為400000h。
相對虛擬位址(Relative Virual Address,RVA)表示此段代碼在記憶體中相對於基地址的位移。即:相對虛擬位址(RVA)=虛擬位址(VA)-基址(imageBase)。
檔案中的地址與記憶體中表示不同,它是用位移量(File offset)來表示的。
在SoftICE和W32Dasm下顯示的地址值是記憶體位址(memory offset),或稱之為虛擬位址(Virual Address,VA)。而十六進位工具裡,如:Hiew、Hex Workshop等顯示的地址就是檔案地址,稱之為位移量(File offset) 或物理地址(RAW offset)。
在實際操作時,使用 RVA-Offset之類的轉換器很容易查出字串RVA和位移量的值。
以Pc_offset(光碟片\tools\offset)此工具為例說說如何將SoftICE下看到的虛擬位址(Virual Address,VA)轉換成十六進位工具裡的位移量(File offset),運行該軟體開啟記事本程式,在Memory Address(記憶體位址)輸入虛擬位址(Virual Address,VA)的值:40117D,點擊"Do it"按鈕將顯示己轉換成檔案位移量(File offset),一所示。
(圖一)記憶體虛擬位址轉換成檔案位移量
虛擬位址和位移量轉換