首页
社区
课程
招聘
[求助]关于结构化异常代码的问题??
发表于: 2009-4-24 16:17 3151

[求助]关于结构化异常代码的问题??

2009-4-24 16:17
3151
我在一本书上看见这样的花指令很是不解??
push入口点
mov eax,dword ptr fs:[0]
push eax
mov dword ptr fs:[0],esp
nop
vxcall 134543
谁能给我解释下每一句的意思吗??怎么构成异常的,尤其是最后一句是什么意思??异常完了自动跳到入口点吗??
请高手指教还有
od中的F9和shift+f9的区别是什么??

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
2
SEH的机制,是一个SEH记录的链表,每个记录都有一个异常处理函数指针,链表的头由FS:[0]指示。

当发生异常时,操作系统将会顺着SEH链表,依次调用其中的异常处理函数,如果异常处理函数返回EXCEPTION_CONTINUE_EXECUTION,系统认为异常已经被处理过了,系统会重新调度发生异常的线程开始运行;如果一个异常处理函数返回EXCEPTION_CONTINUE_SEARCH,系统认为这个函数没有处理异常,它就取出链表中下一个记录,并重复上面的过程,直到有一个异常处理函数处理过了所发生的异常(重新调试线程运行),或者直到所有的异常处理函数都被调用过了(则调用UnhandledExceptionFilter)

要理解f9与shift+f9的区别,你需要了解ring3调试器的原理。

ring3调试器的本质就是被调试进程的异常发生时,调试器会获得两次处理异常的机会,一次叫FirstChance,另一次叫LastChance。FirstChance是在进程自身的异常处理函数被调用之前,而LastChance是在进程自身所有的SEH处理程序之后。

也就是说调试器本质上相当于在正常的SEH链表的头和尾各插入一个节点。

F9表示异常已经被处理了,也就是用DBG_CONTINUE 为参数调用ContinueDebugEvent()了,相当于SEH处理程序返回EXCEPTION_CONTINUE_EXECUTION;相反Shift+F9则是用DBG_EXCEPTION_NOT_HANDLED来调用ContinueDebugEvent()了,相当于EXCEPTION_CONTINUE_SEARCH。
2009-4-24 22:54
0
游客
登录 | 注册 方可回帖
返回
//