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]