iczelion pe tutcn4

 

PE教程4: Optional Header

我們已經學習了關於 DOS header PE header 中部分成員的知識。這裏是 PE header 中最後、最大或許也是最重要的成員,optional header

回顧一下,optional header 結構是 IMAGE_NT_HEADERS 中的最後成員。包含了PE文件的邏輯分佈信息。該結構共有31個域,一些是很關鍵,另一些不太常用。這裏只介紹那些真正有用的域。

這兒有個關於PE文件格式的常用術語: RVA
RVA
代表相對虛擬地址。 知道什麼是虛擬地址嗎?相對那些簡單的概念而言,RVA有些晦澀。簡言之,RVA是虛擬空間中到參考點的一段距離。我打賭您肯定熟悉文件偏移量: RVA就是類似文件偏移量的東西。當然它是相對虛擬空間裏的一個地址,而不是文件頭部。舉例說明,如果PE文件裝入虛擬地址(VA)空間的400000h處,且進程從虛址401000h開始執行,我們可以說進程執行起始地址在RVA 1000h。每個RVA都是相對於模塊的起始VA的。
爲什麼PE文件格式要用到RVA呢? 這是爲了減少PE裝載器的負擔。因爲每個模塊多有可能被重載到任何虛擬地址空間,如果讓PE裝載器修正每個重定位項,這肯定是個夢魘。相反,如果所有重定位項都使用RVA,那麼PE裝載器就不必操心那些東西了: 它只要將整個模塊重定位到新的起始VA。這就象相對路徑和絕對路徑的概念: RVA類似相對路徑,VA就象絕對路徑。

Field Meanings
AddressOfEntryPoint PE裝載器準備運行的PE文件的第一個指令的RVA。若您要改變整個執行的流程,可以將該值指定到新的RVA,這樣新RVA處的指令首先被執行。
ImageBase PE文件的優先裝載地址。比如,如果該值是400000h,PE裝載器將嘗試把文件裝到虛擬地址空間的400000h處。字眼"優先"表示若該地址區域已被其他模塊佔用,那PE裝載器會選用其他空閒地址。
SectionAlignment 內存中節對齊的粒度。例如,如果該值是4096 (1000h),那麼每節的起始地址必須是4096的倍數。若第一節從401000h開始且大小是10個字節,則下一節必定從402000h開始,即使401000h和402000h之間還有很多空間沒被使用。
FileAlignment

文件中節對齊的粒度。例如,如果該值是(200h),,那麼每節的起始地址必須是512的倍數。若第一節從文件偏移量200h開始且大小是10個字節,則下一節必定位於偏移量400h: 即使偏移量512和1024之間還有很多空間沒被使用/定義。

MajorSubsystemVersion
MinorSubsystemVersion
win32子系統版本。若PE文件是專門爲Win32設計的,該子系統版本必定是4.0否則對話框不會有3維立體感。
SizeOfImage 內存中整個PE映像體的尺寸。它是所有頭和節經過節對齊處理後的大小。
SizeOfHeaders 所有頭+節表的大小,也就等於文件尺寸減去文件中所有節的尺寸。可以以此值作爲PE文件第一節的文件偏移量。
Subsystem NT用來識別PE文件屬於哪個子系統。 對於大多數Win32程序,只有兩類值: Windows GUI 和 Windows CUI (控制檯)。
DataDirectory IMAGE_DATA_DIRECTORY 結構數組。每個結構給出一個重要數據結構的RVA,比如引入地址表等。

翻譯:iamgufeng [Iczelion's Win32 Assembly Homepage][LuoYunBin's Win32 ASM Page]

 

發佈了74 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章