PE 檔案,  Research & Study,  Window

Window PE

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 結構圖片

PE 結構
  • 一個 Section 的 終點為PointerToRawData + SizeofRawData
  • 整個程式大小為 為 [ ( DOS Header  + NT Header + Section Header)  對齊 File Alignment  ] + 各個區段對齊之後的大小

留下一個回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *