SEH的奇妙世界深度解析安全编程中的异常处理
SEH的奇妙世界:深度解析安全编程中的异常处理
SEH的基本概念与工作原理
SEH(Structured Exception Handling)是一种在Windows操作系统中使用的异常处理机制,它允许程序员通过try-catch语句来捕获和处理运行时错误,如访问-violation、integer division by zero等。SEH主要由两个结构体组成:EXCEPTION_RECORD和CONTEXT,这些结构体包含了异常发生时的一系列信息,例如异常代码、指向当前执行指令的指针以及调用堆栈帧等。
SEH过渡记录(SEH Kempston)
在Windows中,函数可以嵌套地调用其他函数,并且每个函数都有自己的局部变量存储空间。当一个函数抛出一个未被catch到的异常时,该异常会沿着当前调用的链表向上传递直到找到合适的catch块。这种机制称为SEH Kempston,因为它类似于Kempston railway station上的列车从站间相互连接并最终抵达目的地。这一过程是通过设置正确的FPTR_DATA来实现,每个线程都维护了一个链表,其中包含所有可能会捕获其下游任何线程产生的非同步异步C++例外点。
异常逃逸分析
异常逃逸分析是一种静态分析技术,它能够帮助开发者了解哪些对象可能会“逃逸”出某个方法或构造器,并因此需要特殊对待。在C#中,对象通常不会直接“逃逸”,因为它们总是在垃圾回收器管理之下。但在C++或者COM接口中,如果没有正确地释放资源,那么内存泄漏就很容易发生。为了防止这样的情况,我们需要确保当我们抛出或传递控制权给另一个线程时,我们已经清理了所有不再需要的地方。
SEH与RtlRaiseException()
RtlRaiseException是一个低级API,可以用来制造任意类型和代码值的一个硬件生成特权级别抛出的无效参数状态条件码及有效地址单元保护违规事件。如果你想模拟硬件引发的一些特定类型的问题,比如页面故障,你可以利用这个功能。例如,如果你想要测试你的应用程序如何响应虚拟内存访问问题,你可以调用RtlRaiseException以触发此类错误,然后观察你的应用程序是如何反应并修复这个问题。
使用SEh进行逆向工程
反汇编师经常使用SEh作为一种手段去跟踪和理解软件行为。在逆向工程领域,反汇编工具通常会提供一些额外的手段来获取关于进程执行路径上各个点的情况信息。这包括但不限于能否跳转到某处、是否能够继续执行、是否存在可控输入等,以便更好地理解目标软件内部工作原理。此外,由于反汇编工具本身就是基于CPU指令集,所以他们必须知道CPU寄存器内容,以及目前正在执行什么样的代码,而这些信息正是靠exception handling 来获取。