加载配置信息最初最用在Windows NT操作系统中,作为文件头部的延伸部分,后来被用作异常处理。加载配置信息表中存放了基于结构化异常处理(SEH)技术的各项异常句柄。当程序运行发生异常后,操作系统会根据异常处理类别对异常进行分发处理,并依据这些句柄实施程序流程的转向,保证系统能从异常中全身而退。
何为加载配置信息
加载配置信息结构是PE中定义的一种基本数据类型,最初仅用于Windows NT操作系统,定义一些供Windows NT操作系统加载PE时用到的一些附加信息。后来该部分含义发生了变化。不再定义加载用的配置信息,而是被专门用来定义基于SEH技术的相关数据。
如果PE中的该部分表中没有对应的异常类别处理函数句柄,操作系统将会调用其内核模式的异常分发函数终止应用程序的运行。这种安全设置主要是为了阻止因异常句柄导致的溢出被恶意程序利用,从而造成对系统的破坏。
通常情况下,连接器会提供一个默认的加载配置信息结构,该结构包含了预留的SEH数据。如果用户代码中提供了该结构,则必须由用户来完成设置新的预留SEH字段,否则连接器不会讲SEH数据加入到加载配置信息中。
Windows 结构化异常处理
就是说SEH的原理和调用
具体参考http://blog.csdn.net/u013761036/article/details/54234212
由于我个人功力还是不够,不管是书中还是上面的都还没理解透,
只是简单的知道这是具体写程序的时候捕获异常的时候是怎么处理的。
Windows 异常分类
由于SEH使用了与硬件平台如果的数据指针,所以在不同的硬件平台上,SEH的实现方法是不同的。在X86平台上的SEH处理框架中,把异常分为两大类:
硬异常(系统异常)和软异常(程序自己抛出的异常)
1.硬异常,即系统异常,可以细分为三类:
(1)故障异常:因执行指令失败引起,比如除以0引发的异常,一起eip指向了不可执行的页面等。这一类异常是系统异常中最常见的。此类异常有一个共同点,那就是发生异常时自动压入栈的是失败指令的地址,而不是它的吓一跳指令地址,这样做的原因是:当从异常遍历过程返回时,可以重新执行一遍这条指令。
(2)陷阱异常:发生这类异常通常是因为执行了自陷指令,如使用指令”INT 3”而引发的异常。这一类异常的返回地址是自陷指令的下一条指令所在的地址。
(3)终止异常:硬件或者其他不可恢复的因素导致的异常等。通常只能重启。
2.软异常,所谓软异常,就是以函数调用的手段累模拟一次异常,即通过Windows提供的API函数RaiseException,执行函数引发软异常,实际上,在高级语言的异常处理模型中的大部分抛出异常的操作,最终都是对RaiseException函数的调用。
然后就是各种对SEH的使用啥的,之前总结过就不说了。但是在书上看到了一个概念区分,就是区分 中断和异常,异常可以理解成是程序内部的自发行为,中断则是外部导致的被动行为,所以我个人对 缺页中断的这个词的理解是,缺页异常导致的中断。
PE中的加载配置信息
这本书讲的是PE结构,自然这个才是他要说的重点,分析一个EXE的结构:
通过PE数据目录表定位到加载配置信息;然后,分析该部分数据对应的数据结构;最后,通过一个实例分析,描述了数据结构中每个字段与提取的字节码之间一一对应的关系。
加载配置信息定位
加载配置数据为数据目录注册的数据类型之一,其描述信息处于数据目录第11个目录项中。
为了避免SEH框架缓冲区溢出执行用户代码导致安全隐患,自XP系统以后的大部分系统中PE文件,如常见的记事本程序、kernel32.dll、user32.dll等都附加了加载配置信息。通常情况下,操作系统的加载器会根据数据目录表中定义的大小,来判断加载配置信息的类别。为了保持对Windows XP操作系统和以前的操作系统的兼容,通常此处的大小为64字节,即0x40。
加载配置信息目录IMAGE_LOAD_CONFIG_DIRECTORY
头文件里的定义:
加载配置信息实例分析
书上是直接分析的例子的一个文件,不知道位什么我编译出来的表没有信息。
各位读者可自行下载电子版或翻书查看调试。
书中介绍说掌握这章可用于热补丁,而且我隐约感觉掌握这章对后面需要学习驱动编写的时候有很大帮助。
参考文章:https://blog.csdn.net/u013761036/article/details/55001282