實務小撇步
如果你想親自觀察PE檔案結構,推薦使用以下工具:
CFF Explorer: 功能強大,適合修改 PE 檔案的欄位。
用 PE 檔案格式與 MS-DOS 標頭做討論:
PE 標頭(NT Headers)是 PE 檔案的核心,它接在 MS-DOS Stub 之後,包含了作業系統載入與執行檔案所需的關鍵資訊。在 C 語言的標頭檔中,這個結構被定義為 IMAGE_NT_HEADERS。
一、 PE 標頭的組成結構
IMAGE_NT_HEADERS 由以下三個主要部分組成:
- Signature (簽章):
- 大小:4 位元組。
- 內容:固定為 0x00004550(ASCII 為 "PE\0\0")。
- 作用:用來確認這是一個有效的 PE 格式檔案。
- File Header (檔案標頭):
- 對應結構為 IMAGE_FILE_HEADER。
- 包含檔案的基本實體屬性,例如目標機器架構、區段數量等。
- Optional Header (選擇性標頭):
- 對應結構為 IMAGE_OPTIONAL_HEADER。
- 雖名稱為「選擇性」,但對於執行檔而言是必備的。它定義了程式如何載入記憶體、進入點(Entry Point)位址以及作業系統版本要求等。
二、 File Header (IMAGE_FILE_HEADER) 的關鍵欄位
此部分大小固定為 20 位元組,重要欄位如下:
- Machine:標示此檔案執行的處理器架構(例如
0x8664代表 x64,0x014c代表 x86)。 - NumberOfSections:檔案中區段(Sections)的總數。
- TimeDateStamp:檔案編譯的時間戳記(從 1970/1/1 算起的秒數)。
- SizeOfOptional Header:緊接著的 Optional Header 的大小(在 32 位元與 64 位元系統中長度不同)。
- Characteristics:檔案屬性標籤(例如是否為 DLL、是否為可執行檔、是否去除了除錯資訊等)。
三、 Optional Header (IMAGE_OPTIONAL_HEADER) 的關鍵欄位
這是 PE 標頭中最複雜且資訊量最大的部分:
- Magic:用來區分檔案是 32 位元(
0x10B)還是 64 位元(0x20B,即 PE32+)。 - AddressOfEntryPoint:程式執行的起始位址 (OEP)。當程式啟動時,CPU 會跳轉到這個位址開始執行程式碼。
- ImageBase:檔案在記憶體中的優先載入位址。通常 .exe 預設為
0x00400000。 - SectionAlignment & FileAlignment:
- SectionAlignment:區段在記憶體中的對齊單位(通常為 4KB,即 0x1000)。
- FileAlignment:區段在磁碟檔案中的對齊單位(通常為 512 位元組,即 0x200)。
- SizeOfImage:檔案載入記憶體後所佔用的總空間大小。
- Subsystem:標示程式的介面類型(例如
2代表 GUI 視窗程式,3代表 Console 控制台程式)。 - DataDirectory (資料目錄):
- 這是一個包含 16 個結構的陣列,定義了重要數據的位置,如 Import Table (匯入表)、Export Table (匯出表) 與 Resource Table (資源表)。
總結
如果說 MS-DOS 標頭是 PE 檔案的「入口」,那麼 NT Headers 就是「指揮中心」。
- Signature 確保身分正確。
- File Header 說明硬體規格。
- Optional Header 則規劃了程式載入記憶體後的佈局與行為。
























