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