PE文件結構
a, DOS Header(TImageDosHeader) 其中
-- _lfanew 指向 【c】
-- e_magic 爲 MZ
b, Dos stub 用於不支持PE的操作系統,顯示錯誤提示如“This program requires Windows”,不定長
c, PE Header(TImageNtHeaders)
-- PE 標誌 (TImageNtHeaders.Signature) 必須等於 IMAGE_NT_SIGNATURE,即 PE/0/0
-- PE 基本信息 (TImageFileHeader)
其中 NumberOfSections 決定了【d】中元素的數目
TimeDateStamp 爲文件創建的時間
-- PE 可選頭 (TImageOptionalHeader)
其中 SizeOfHeaders 是 【a】+【b】+【c】+【d】的總空間
DataDirectory 是IMAGE_DATA_DIRECTORY結構的數組,每個結構給出了一個重要數據結 構的
RVA,如引入地址表、導出地址表等。例如
TImageImportDescriptor = packed record
OriginalFirstThunk: DWord;
TimeDateStamp : DWord;
ForwarderChain : DWord;
DLLName : DWord;
FirstThunk : DWord;
end;
end;
d, 節表 (array of TImageSectionHeader)
--
e ....
各個節
=========== 關於節===================
★ PE文件的真正內容劃分成塊,稱之爲sections(節)。每節是一塊擁有共同屬性的數據,比如代碼/數據、讀/寫、導入/導出等。我們
可以把PE文件想像成一邏輯磁盤,PE header 是磁盤的boot扇區,而sections就是各種文件,每種文件自然就有不同屬性,如只讀、系統、隱
藏、文檔等。節的劃分是基於各組數據的共同屬性,而不是邏輯概念。重要的不是數據/代碼是如何使用的,如果PE文件中的數據/代碼擁有相
同屬性,它們就能被歸入同一節中。
=========== 關於節===================
參考書目:
1, Delphi下深入Windows核心編程
2, 編程高手箴言