WEB开发网
开发学院网络安全黑客技术 SEH in ASM 研究(一) 阅读

SEH in ASM 研究(一)

 2007-01-14 20:14:54 来源:WEB开发网   
核心提示: 4.如果这些例程均选择不处理异常,如果程序处于被调试状态,操作系统仍会再次挂起程序通知debugger.5.如果程序未处于被调试状态或者debugger没有能够处理,并且你调用SetUnhandledExceptionFilter安装了最后异常处理例程的话,系统转向对它的调用.6.如果你没

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

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

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

7.不过在终结之前,系统仍然对发生异常的线程异常处理句柄来一次展开,这是线程异常处理例程最后清理的机会. 如果你看了上面的步骤一头雾水的话,别着急,化点时间慢慢理解或者进入下一部分实例操作.

二.初步实战演习:

安装异常处理句柄.

有两种类型的异常处理句柄,一种是final型的,这是在你的异常未能得到线程相关处理例程处理操作系统在即将关闭程序之前会 回调的例程,这个例程是进程相关的而不是线程相关的,因此无论是哪个线程发生异常未能被处理,都会调用这个例程.

I. 见下面的例子1:

;//================================例子1---final型的异常处理=================
;// ex. 1,by Hume,2001,just copy make your own hd.h and compile&link
;//========================================================================
.386
.model flat, stdcall
option casemap :none ; case sensitive
include hd.h     ;//相关的头文件,你自己维护一个吧
;//============================
.data
szCap  db "By Hume[AfO],2001...",0
szMsgOK db "OK,the exceptoin was handled by final handler!",0
szMsgERR1 db "It would never Get here!",0
buff  db 200 dup(0)
.code
_start:
;//========prog begin====================
  lea  eax,Final_Handler
  invoke  SetUnhandledExceptionFilter,eax ;//调用SetUnhandledExceptionFilter来安装final SEH
                         ;//原型很简单SetUnhandledExceptionFilter proto
                         ;//pTopLevelExceptionFilter:DWORD
    xor  ecx,ecx
    mov  eax,200  
    cdq
  div  ecx
                         ;//以下永远不会被执行
    invoke  MessageBox,NULL,addr szMsgERR1,addr szCap,MB_OK+MB_ICONEXCLAMATION
    invoke  ExitProcess,NULL
   
;//============================
Final_Handler:
  invoke  MessageBox,NULL,addr szMsgOK,addr szCap,MB_OK+MB_ICONEXCLAMATION
  mov  eax,EXCEPTION_EXECUTE_HANDLER    ;//==1 这时不出现非法操作的讨厌对话框
  ;mov  eax,EXCEPTION_CONTINUE_SEARCH  ;//==0 出现,这时是调用系统默认的异常处理过程,程序被终结了
  ;mov  eax,EXCEPTION_CONTINUE_EXECUTION ;//==-1 不断出现对话框,你将陷入死循环,可别怪我
  ret                   ;因为我们并没有修复ecx,所以不断产生异常,然后不断调用这个例程
;//=============================Prog Ends==============
end _start
COMMENT $
 简单来解释几句,windows根据你的异常处理程序的返回值来决定如何进一步处理
    EXCEPTION_EXECUTE_HANDLER      equ 1  表示我已经处理了异常,可以优雅地结束了
    EXCEPTION_CONTINUE_SEARCH      equ 0  表示我不处理,其他人来吧,于是windows调用默认的处理程序
                           显示一个错误框,并结束
    EXCEPTION_CONTINUE_EXECUTION    equ -1 表示错误已经被修复,请从异常发生处继续执行你可以试着让程序返回0和-1然后编译程序,就会理解我所有苍白无力的语言...
$
;//========================================================================

II.另一种是per_Thread Exception Handler->线程相关的异常处理,通常每个线程初始化准备好运行时fs指向一个TIB结构

上一页  1 2 3 4 5 6 7  下一页

Tags:SEH in ASM

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接