PE檔案格式學習(十三):載入配置表
阿新 • • 發佈:2018-11-08
1.介紹
載入配置表早期是用於描述當PE檔案頭或PE可選頭無法描述或者因為太大而無法描述的各種功能。
後來以XP及以後的系統主要是為了儲存SEH控制代碼,稱為安全結構化異常處理程式列表,如果SEH異常處理沒有經過註冊,在載入配置表中沒有控制代碼,這個異常處理就不會被執行。
具體的例子就不演示了,看起來只要是正規編寫的程式都會在表中註冊,因此都可以執行。
據微軟官方說明,這個載入配置表的作用是為了防止“x86異常處理程式劫持”的漏洞。因為年代久遠就無從考據了。
2.欄位解析
offset | Size | Field | Description |
---|---|---|---|
0 | 4 | Characteristics | 屬性,當前沒使用 |
4 | 4 | TimeDateStamp | 時間 |
8 | 2 | MajorVersion | 主版本號 |
10 | 2 | MinorVersion | 子版本號 |
12 | 4 | GlobalFlagsClear | 啟動時清除全域性標誌 |
16 | 4 | GlobalFlagsSet | 啟動是設定全域性標誌 |
20 | 4 | 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 | 4 | ProcessHeapFlags | 程序堆疊標誌 |
52/76 | 2 | CSDVersion | CSD版本 |
54/78 | 2 | 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 | 4 | 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