1. 程式人生 > >PE檔案格式學習(十三):載入配置表

PE檔案格式學習(十三):載入配置表

1.介紹

載入配置表早期是用於描述當PE檔案頭或PE可選頭無法描述或者因為太大而無法描述的各種功能。
後來以XP及以後的系統主要是為了儲存SEH控制代碼,稱為安全結構化異常處理程式列表,如果SEH異常處理沒有經過註冊,在載入配置表中沒有控制代碼,這個異常處理就不會被執行。
具體的例子就不演示了,看起來只要是正規編寫的程式都會在表中註冊,因此都可以執行。
據微軟官方說明,這個載入配置表的作用是為了防止“x86異常處理程式劫持”的漏洞。因為年代久遠就無從考據了。

2.欄位解析

image.png

offset Size Field Description
Characteristics  屬性,當前沒使用
TimeDateStamp  時間 
MajorVersion  主版本號
10  MinorVersion  子版本號
12  GlobalFlagsClear  啟動時清除全域性標誌
16  GlobalFlagsSet  啟動是設定全域性標誌
20  CriticalSectionDefaultTimeout  程式關鍵部分預設超時值
24  4/8  DeCommitFreeBlockThreshold  返回系統前必須釋放的記憶體,以位元組為單位
28/32  4/8  DeCommitTotalFreeThreshold  總共釋放的記憶體
32/40  4/8  LockPrefixTable  預加鎖表
36/48  4/8  MaximumAllocationSize  最大配置體積
40/56  4/8  VirtualMemoryThreshold  最大虛擬記憶體尺寸
44/64  4/8  ProcessAffinityMask  程序內部掩碼
48/72  ProcessHeapFlags  程序堆疊標誌
52/76  CSDVersion  CSD版本
54/78  Reserved  保留,必須為0
56/80  4/8  EditList  保留
60/88  4/8  SecurityCookie  指向VisualC++或GS實現的Cookie指標
64/96  4/8  SEHandlerTable  SEH控制代碼列表
68/104  4/8  SEHandlerCount  SEH數
72/112  4/8  GuardCFCheckFunctionPointer  儲存Control Flow Guard檢查功能指標的VA。
76/120  4/8  GuardCFDispatchFunctionPointer 儲存Control Flow Guard排程功能指標的VA。
80/128  4/8  GuardCFFunctionTable  影象中每個Control Flow Guard功能的RVA排序表的VA。
84/136  4/8  GuardCFFunctionCount  上表中唯一的RVA數量。
88/144  GuardFlags  Control Flow Guard相關標誌。 
92/148  12  CodeIntegrity  程式碼完整性資訊。
104/160 4/8  GuardAddressTakenIatEntryTable  儲存控制流保護地址採用IAT表的VA。
108/168 4/8  GuardAddressTakenIatEntryCount 上表中唯一的RVA數量。
112/176 4/8  GuardLongJumpTargetTable  儲存Control Flow Guard跳遠目標表的VA。
116/184 4/8  GuardLongJumpTargetCount  上表中唯一的RVA數量。 

GuardFlags欄位包含以下一個或多個標誌和子欄位的組合:

  • 模組使用系統提供的支援執行控制流完整性檢查.#define IMAGE_GUARD_CF_INSTRUMENTED 0x00000100
  • 模組執行控制流程並寫入完整性檢查.#define IMAGE_GUARD_CFW_INSTRUMENTED 0x00000200
  • 模組包含有效的控制流目標元資料.#define IMAGE_GUARD_CF_FUNCTION_TABLE_PRESENT 0x00000400
  • 模組不使用/ GS安全cookie.#define IMAGE_GUARD_SECURITY_COOKIE_UNUSED 0x00000800
  • 模組支援只讀延遲載入IAT.#define IMAGE_GUARD_PROTECT_DELAYLOAD_IAT 0x00001000
  • 延遲載入匯入表在其自己的.didat部分(其中沒有其他內容)可以自由重新保護.#define IMAGE_GUARD_DELAYLOAD_IAT_IN_ITS_OWN_SECTION 0x00002000
  • 模組包含抑制的匯出資訊。這也推斷出IAT表所採用的地址也存在於載入配置中.#define IMAGE_GUARD_CF_EXPORT_SUPPRESSION_INFO_PRESENT 0x00004000
  • 模組可以抑制匯出.#define IMAGE_GUARD_CF_ENABLE_EXPORT_SUPPRESSION 0x00008000
  • 模組包含長跳轉目標資訊.#define IMAGE_GUARD_CF_LONGJUMP_TABLE_PRESENT 0x00010000
  • 包含Control Flow Guard功能表條目步長的子欄位的掩碼(即每個表條目的附加位元組數).#define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_MASK 0xF0000000

此外,Windows SDK winnt.h標頭定義此巨集用於右移GuardFlags值以右對齊Control Flow Guard功能表步長的位數:

#define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_SHIFT 28