.NET 框架將各種語言編譯為通用的 Microsoft Intermediate Language (MSIL/IL),再由 JIT 編譯器轉換為原生碼。編譯器同時產生中繼資料,描述型別定義、成員簽名與參考資訊。IL 與中繼資料封裝於可攜式執行檔 (PE) 中,本文聚焦托管 PE 的特殊結構。
標準 PE/COFF 標頭包含 DOS 標頭、PE 標誌、COFF 標頭與 PE 選擇性標頭。CLR 擴充了 PE 格式,在 PE 選擇性標頭的資料目錄中新增 CLR 標頭指標(如圖 1-4)。

圖 1-4 托管 PE 檔案格式
PE32 可跑 32/64 位元,PE32+ 僅限 64 位元。CLR 標頭包含執行階段版本、旗標、進入點、中繼資料位置/大小、資源、強名稱簽章等資訊(定義於 CorHdr.h,代碼清單 1-4)。
表 1-1 列出各欄位用途:MetaData 指向中繼資料區塊,Flags 標示純 IL/32BITREQUIRED 等,EntryPointToken/RVA 為進入點,Resources、StrongNameSignature、VTableFixups 等目錄支援資源、強名稱、虛擬表修正。


包含 Fixup 表,供載入器在基址衝突時調整位址。若 CLR 標頭標示純 IL (COMIMAGE_FLAGS_ILONLY),Windows XP 以上系統會忽略此區段。
托管 PE 中最大變動處,含中繼資料表、IL 碼、匯入表、CLR 標頭、非托管啟動存根、托管資源、強名稱雜湊、偵錯資料、非托管匯出存根(圖 1-6)。

圖 1-6 .text 區段通用結構
含資料常數、V 表、非托管匯出表、TLS 目錄結構。V 表用於將托管方法暴露給非托管代碼呼叫,槽位在執行期替換為方法位址或封送 thunk,故必須置於可寫區段。
傳統 PE 資源(圖示、字串表等),由 PE 標頭資源目錄指向。
位於 .text 區段連續儲存,CLR 標頭 Resources 目錄指向起始 RVA。中繼資料 ManifestResource 記錄資源名稱與偏移,資料前 4 位元組標示長度。
儲存 TLS 模板資料,目錄結構定義於 Winnt.h(代碼清單 1-6),RVA/大小在 PE 標頭第 10 個資料目錄。
作者:玄魂
出處:https://www.cnblogs.com/xuanhun/