在Win32平臺上(包括Windows 95/98/ME/NT/2000/XP/2003/CE),可執行文件是PE(Portable Executable)格式。PE文件使用的是一個平面地址空間,所有代碼和數據都被合并在一起,組成一個很大的結構。文件的內容被分割為不同的區塊(Section,又稱區段、節等),塊中包含代碼或數據。
剛接觸這塊的朋友只需要簡單了解一下PE格式,更具體的PE格式請參考脫殼基礎知識入門(2006年版) PE相關名詞解釋如下:
1.入口點(Entry Point)
程序在執行時的第一行代碼的地址應該就是這個值。
2.文件偏移地址(File Offset)
PE文件在磁盤上儲存時,各數據的地址稱文件偏移地址(File Offset)。用十六進制工具(例如Hex Workshop、WinHex等)打開文件顯示的地址就是文件偏移地址。
3.虛擬地址(Virtual Address,VA)
由于Windows程序是運行在386保護模式下,在保護模式下,程序訪問存儲器所使用的邏輯地址稱為虛擬地址(Virual Address,VA)。與實地址模式下的分段地址類似,虛擬地址也可寫成"段:偏移量"的形式,這里的段是指段選擇器。
4.基地址(ImageBase)
文件執行時將被映像到指定內存地址中,這個初始內存地址稱為基址(ImageBase)。在Windows NT中,缺省的值是10000h;對于DLLs,缺省值為400000h。在Windows 9x中,10000h不能用來裝入32位的執行文件,因為該地址處于所有進程共享的線性地址區域,因此Microsoft將Win32可執行文件的缺省基地址改變為400000h。
5.相對虛擬地址
相對虛擬地址(Relative Virual Address,RVA)表示此段代碼在內存中相對于基地址的偏移。即:相對虛擬地址(RVA)=虛擬地址(VA)-基址(ImageBase)。
4.2 虛擬地址和偏移量轉換
在OllyDBG,IDA和W32Dasm下顯示的地址值是虛擬地址(Virual Address,VA)。而十六進制工具里,如:Hiew、Hex Workshop等顯示的地址就是文件地址,稱之為偏移量(File offset) 。
其轉換原理是因為PE文件在磁盤上的數據結構與在內存中的結構是一致的,如下圖: