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

猜你喜欢

转载自www.cnblogs.com/tutucoo/p/9927498.html