首页
社区
课程
招聘
[求助]关于筛选器异常处理的疑问
发表于: 2011-5-8 13:50 4276

[求助]关于筛选器异常处理的疑问

2011-5-8 13:50
4276
在《riijj Crackme (3)的详解》中  作者在Crackme中使用了SetUnhandledExceptionFilter函数设置了筛选器异常处理函数 保护程序不被调试
00401CE9   . C3              RETN
00401CEA   . 8B65 E8         MOV ESP,DWORD PTR SS:[EBP-18]
00401CED   . 68 40194000     PUSH riijj_cr.00401940                   ; /pTopLevelFilter = riijj_cr.00401940             <-------筛子函数地址
00401CF2     FF15 48504000   CALL DWORD PTR DS:[<&KERNEL32.SetUnhandl>;  KERNEL32.SetUnhandledExceptionFilter       <------设置筛选器
00401CF8   . 6A 0F           PUSH 0F                     
00401CFA   . E8 18050000     CALL riijj_cr.00402217
我的疑问是:
在有调试器的情况下 我在设置筛选器的这一行下了断点,程序在几次异常以后停在了这里  这说明在有调试器的情况下 程序设置了筛选器异常处理函数
但是同时我在筛子函数里面也下了断点,我继续Shift+F9运行程序,程序为什么没有断在筛子函数里面,我知道这意味着在有调试器的情况下没有执行筛子处理函数,所以程序走向了死亡。
在一篇帖子里面我看到下面介绍:

发生异常时系统的处理顺序(by Jeremy Gordon):

    1.系统首先判断异常是否应发送给目标程序的异常处理例程,如果决定应该发送,并且目标程序正在被调试,则系统
    挂起程序并向调试器发送EXCEPTION_DEBUG_EVENT消息.呵呵,这不是正好可以用来探测调试器的存在吗?

    2.如果你的程序没有被调试或者调试器未能处理异常,系统就会继续查找你是否安装了线程相关的异常处理例程,如果
    你安装了线程相关的异常处理例程,系统就把异常发送给你的程序seh处理例程,交由其处理.

    3.每个线程相关的异常处理例程可以处理或者不处理这个异常,如果他不处理并且安装了多个线程相关的异常处理例程,
        可交由链起来的其他例程处理.

    4.如果这些例程均选择不处理异常,如果程序处于被调试状态,操作系统仍会再次挂起程序通知debugger.

    5.如果程序未处于被调试状态或者debugger没有能够处理,并且你调用SetUnhandledExceptionFilter安装了最后异
    常处理例程的话,系统转向对它的调用.

    6.如果你没有安装最后异常处理例程或者他没有处理这个异常,系统会调用默认的系统处理程序,通常显示一个对话框,
    你可以选择关闭或者最后将其附加到调试器上的调试按钮.如果没有调试器能被附加于其上或者调试器也处理不了,系统
    就调用ExitProcess终结程序.

    7.不过在终结之前,系统仍然对发生异常的线程异常处理句柄来一次展开,这是线程异常处理例程最后清理的机会.

看上面第五句话:
5.如果程序未处于被调试状态或者debugger没有能够处理,并且你调用SetUnhandledExceptionFilter安装了最后异
    常处理例程的话,系统转向对它的调用.
我忽略了异常,并且也设置了SetUnhandledExceptionFilter安装了最后异
    常处理例程,可是为什么系统没有调用筛子处理例程处理异常呢???????

请知道的大侠回答我一下

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
貌似是 上面第五句说的不确切,我调试了下带有最后异常处理的程序,系统不调用最后异常函数  实际情况应该是系统先告知调试器 若调试器也不处理 系统就结束进程
2011-5-14 17:47
0
游客
登录 | 注册 方可回帖
返回