PE教程4: Optional Header

看雪資料發表於2015-11-15

 

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就象絕對路徑。

FieldMeanings
AddressOfEntryPointPE裝載器準備執行的PE檔案的第一個指令的RVA。若您要改變整個執行的流程,可以將該值指定到新的RVA,這樣新RVA處的指令首先被執行。
imageBasePE檔案的優先裝載地址。比如,如果該值是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檔案第一節的檔案偏移量。
SubsystemNT用來識別PE檔案屬於哪個子系統。 對於大多數Win32程式,只有兩類值: Windows GUI 和 Windows CUI (控制檯)。
DataDirectoryIMAGE_DATA_DIRECTORY 結構陣列。每個結構給出一個重要資料結構的RVA,比如引入地址表等。

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

 

相關文章