Window PE
11 12 月, 2021
/
What is PE ?
PE 為 Portable Executable 的縮寫,為 ” 可執行(Executable)程式或動態連結函式庫(Dynamic link library)的文件格式 “。
常見的常見的EXE、DLL、OCX、SYS、COM都是PE檔案。
PE 結構
PE 結構可以分為幾個部分:
- DOS header
- NT Header (PE Header)
- Section Header (Section Table)
- Section Data
DOS Header
- IMAGE_DOS_HEADER
- 開頭必為 “MZ” 字串,為 4D 5A”,為”可執行檔案”的標記。
- 主要用處為確保PE file 在 DOS 模式下也可執行。
- 大小大概為 40h bytes。
DOS Stub
若是程式在 DOS 下無法執行便會跳出這邊的錯誤訊息:"This Program cannot be run in DOS mode"。
e_lfanew
- 最後一個欄位
- 是用來指向 PE Header 的指標。
- 若為 0 則代表該檔案是一個 DOS 檔案 。
NT Header
- IMAGE_NT_HEADER
- 其結構主要為 “PE Signature “、 ” File Header ” 和 ” Optional header ” 組成。
PE Signature
用於驗證是否有效 ,必永遠等於 “PE\x00\x00” 字串
File Header
組譯器所產生的 COFF 檔案的 header
- Machine :機械碼,通常為 x86 、64 或 ARM。
- NumberOfSections :記錄區塊數量,用於指向Section 陣列時使用
- TimeDataStamp :編譯時間
- SizeOfOptionaHeader :Optional 標頭大小,用於確認檔案大小
- Characteristics :所有PE的屬性,確認是否為32 bit 、DLL模組 、是否可以執行、是否具有重新定向資訊等等
Optinoal Header
編譯之後由連接器補上的資訊,確保能夠正確裝載程式
- ImageBase :紀錄PE模組的預設位置,確認一開始檔案放置的位置。
- SizeOfImage :動態執行時所需空間。
- SizeOfHeaders :Header的空間大小)
- AddressOfEntryPoint :程式執行的入口點。
- FileAlignment :用於靜態區段的對齊,簡單來說就是靜態檔案區段的最小值,在32bit 為 0x200。
- SectionAlignment :動態檔案的對齊,簡單來說就是動態檔案區段的最小值,在32bit 為 0x1000。
- DataDirectory :記錄所需資料的起點和大小。
Section Header
NT Header 的結尾就是Section Header 的起點。
Section Header 為陣列形式
- PointerToRawData :目前區段的靜態檔案偏移量,會指向 Section data 的位置,取得資料時用。
- SizeOfRawData :該 Section data 的大小,用於確認該 Section 的起點和終點。
- VirtualAddress :要寫入的位置,放進映像位址的”相對偏移量”。
- VirtualSize :要寫入的大小
- Characteristics :資訊紀錄,記錄資料的狀況,如可寫、可讀、可執行……
Section
- .data :已初始化的數據
- .idata:import 的文件名表
- .edata:export 的文件名表
- .rdata:read only 的初始數據
- .reloc:重定位表訊息
- .rsrc:資源
- .text:exe 或 dll 的可執行程式碼
PE 結構圖片
- 一個 Section 的 終點為PointerToRawData + SizeofRawData
- 整個程式大小為 為 [ ( DOS Header + NT Header + Section Header) 對齊 File Alignment ] + 各個區段對齊之後的大小