欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]异常处理流程(三) SEH链的安装

[原创]异常处理流程(三) SEH链的安装

异常处理函数可以是自定义的函数,系统有一个默认的函数,但我们可以自定义一个异常处理函数,让它来处理。但是得先安装自定义函数才能使用。怎么安装呢?

调试器:OllyDbg

环境:win7 64位真机


看到FS寄存器里是7efdd000,在数据窗口跟随FS[0],里面的是0018ffc4,如下图所示。

0018ffc4明显是一个堆栈地址,就在堆栈窗口中跟随 0018ffc4,堆栈注释那里显示SHE链尾部,如下图所示。


可见,SEH处理程序的尾部都存储于堆栈中。

它的下一行是0018ffc4,里面的内容是77A45845。右边注释了 “SE处理程序”,如上图所示,这里就是系统默认的异常处理函数的开始。可见,SEH处理程序的首地址也存储于堆栈中。并且首尾相邻。

那么我们自己的SEH呢?这里没有。

打开一个新程序,它安装了处理程序。有一处注释“SE处理程序安装”,是

Push smartmou.004066d8

这里是作者写的异常处理函数的入口是4066d8,如下图,


我们把它入栈,堆栈注释:“入口地址”。

接下来执行  mov eax FS[0]

FS[0]里是一个堆栈地址,根据上一个例子的经验,该堆栈地址存储着SEH处理程序的尾部,我们把这个堆栈地址里的值赋值给eax。

再执行Push eax,也就是将尾部内容入栈

然后是Mov FS[0] esp

用堆栈最顶端的四字节数据覆盖FS[0]。

本来FS[0]里是 18FFC4 ,相当于在FS[0]处做了备份。还记得 18FFC4 指向哪里吗?它指向默认异常处理程序的尾部。

覆盖后, FS[0] 中不再储存链尾部的地址,而被当前ESP所覆盖。那么当前ESP指向哪里呢?当前是18FF74,它指向18FFC4,如果再讲18FFC4作为指针,它指向下一个SEH的入口。如图所示


至此,异常处理程序安装完毕。如果有异常触发,首先会调用用户自定义的异常处理函数。如果这个函数执行完后,没有解决问题,就会根据 18FFC4 找到以后默认的异常处理方法的链尾,接着去执行默认。所以这个链的本质是一个链表。在 OD的主界面点击查看-SHE链,这个界面可以查看SHE链,但是得安装完成才能看到。这三行代码执行完毕,就能看到安装好的SEH链。如图所示。


这四行代码可以用SetUnhandledExceptionFilter来代替,对于该函数,SEH就是它的首地址就是它的参数。

观察程序能否正常执行异常处理流程。

安装完成后我们故意制造一个异常,并 在SEH链上设置断点。 

选项-调试设置-只忽略在kernal32里的异常,F9运行,停在人为异常代码。

在调试器里按下shift+f9,的确会断在SEH链这。

注:shift+f9和调试选项里勾选忽略异常,效果是一样的,按下shift+f9就相当于在调试选项的忽略异常那里打了一次勾。按下以后就把异常交给系统默认流程了,就是提示出错,并且退出程序


注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功