WIN32汇编第9课.docx
- 文档编号:25831940
- 上传时间:2023-06-15
- 格式:DOCX
- 页数:9
- 大小:309.98KB
WIN32汇编第9课.docx
《WIN32汇编第9课.docx》由会员分享,可在线阅读,更多相关《WIN32汇编第9课.docx(9页珍藏版)》请在冰豆网上搜索。
WIN32汇编第9课
WIN32汇编-第9课
2012年12月20日星期四
15:
45
1.异常的传递流程
Debugger->SHE->->Debugger->Filter->WindowsOS
要点:
1.每次异常由应用程序接管前,先由调试器接管
2.调试器处理INT3异常以后是返回到INT3后一条指令处
2.再谈C++try...catch机制
catch块中可以访问main中的局部变量,而catch块是函数调用的形式,如图1
图1
这里没有传参,而catch中可以访问main的局部变量i,原理是什么呢?
这是由于异常节点里面多了个附加参数ebp,catch块就可以通过ebp来访问main的局部变量了.
异常节点结构体附加参数可以自定义,如图2
图2
用该结构实现访问异常发生函数的局部变量,如图3
图3
异常回调函数中就可以访问局部变量了,如图4
图4
调试情况如图5
图5
3.UnWinding(异常展开)
xp下的异常链表的节点是在栈中的.
①异常展开:
删除当前节点之前的所有节点(包括当前异常链表节点),并清理申请的资源
②退出前展开:
OS删除SEH链所有节点
C++中的捕获异常,fun2发生异常,fun2不处理,异常交给fun1,fun1处理完异常以后,直接就会执行fun1中catch块之后的代码,不会再回到fun2了,如图6
图6
同理汇编实现展开操作:
fun1中调fun2,如图7
图7
fun2中发生异常,fun2的异常回调函数里面处理不了,异常传递给SEH链中的前一个节点即fun1的异常处理回调,如图8
图8
这个时候的情况相当于上面C++中异常的情况,不会再回到fun2中了,但是这个时候fun2的异常链表中对应的节点项还没有删除掉,如图9
图9
如果这个时候fun1中有异常发生的话,那么这个时候应该fun2异常回调节点在表头,所以它会得到调用,这样明显是不合理的(对应上面的
C++的异常例子可知),所以这个时候就异常展开就派上用场了,如图10
图10
调用RtlUnwind函数可以完成展开操作
参数一,EXCEPTION_REGISTRATION的指针,表示对当前回调函数之后的所有其他回调函数进行展开操作,RtlUnwind函数调用每个被展开的回调函数时,异常标志中会含有EXCEPTION_UNWINDING标志位,如果这个参数指定为NULL的话,表示对SEH链上所有的回调函数进行展开操作,这时所有回调函数参数中的异常标志在带有EXCEPTION_UNWINDING
(2)标志位的同时也带有EXCEPTION_UNWINDING_FOR_EXIT(4)标志位,这种方式的展开称为退出前展开(ExitUnwind).
根据参数1的含义,可知RtlUnwind,会首先向fun2的异常回调发送展开异常(异常码:
0x0c0000027),而且异常标志位EXCEPTION_UNWINDING,也就是2.
如图11:
图11
然后就是RtlUnwind执行完毕了,就会返回到调用RtlUnwind之后的一条语句,如图12
图12
异常回调以后就会返回到线程环境修复的EIP所指的地址出了,如图13
图13
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WIN32 汇编