SEH示例2_4

来源:互联网 发布:matlab用数据拟合函数 编辑:程序博客网 时间:2024/04/28 22:58

;************************************************************************
;*项目名称:Thread SEH示例      *
;************************************************************************
;*代码名称:Thread SEH_2_4.asm      *
;*代码功能:使用esp取参数,没用函数定义格式    *
;*     采用修改异常处的寄存器regEsi值来修复异常,然后从异常处继续执行 *
;************************************************************************
;*代码作者:by lujue, 2006-10-30      *
;************************************************************************

;************************************************************************
;汇编模式定义
;************************************************************************
.386
.model flat,stdcall
option casemap:none

;************************************************************************
;头文件定义
;************************************************************************
  include windows.inc
  include user32.inc
  includelib user32.lib
  include kernel32.inc 
  includelib kernel32.lib 

;************************************************************************
;数据段定义
;************************************************************************     
.data
szCaption db "Thread SEH示例",0
szTextSEH db "We are in Thread Structured Exception Handler!",0
szTextOK db "修复了异常",0

;************************************************************************
;代码段
;************************************************************************  
.code
;********************************************************************
; 函数功能:异常处理回调函数:修改ESI使其指向合法 ,然后继续从异常处执行
;********************************************************************
perThread_Handler:     
 push ebp
 mov ebp,esp

 invoke   MessageBox,0,addr szTextSEH,addr szCaption,MB_OK

        mov     eax,[ebp+10h]   ; eax指向CONTEXT结构
        xor     ebx,ebx
        mov     [eax+4h],ebx      ; 对iDrx调试寄存器清零,使断点失效(反跟踪)
        mov     [eax+8h],ebx
        mov     [eax+0Ch],ebx
        mov     [eax+10h],ebx
 mov edx,00401001h   ;修改发生异常的指令的寄存器值,使其合法以继续执行
 mov [eax+0A0h],edx
       
 xor eax,eax           ; ExceptionContinueExecution equ 0,表示异常已经修复,从异常发生地址处继续执行
 mov esp,ebp
 pop ebp
        ret                   

;************************************************************************
;程序入口
;************************************************************************
_start:
 ;********************************************************************
 ; 在堆栈中构造一个 EXCEPTION_REGISTRATION 结构
 ;********************************************************************
        Assume FS:NOTHING
        push  offset perThread_Handler
        push  fs:[0]      
        mov   fs:[0],esp 

 ;********************************************************************
 ; 会引发异常的指令
 ;********************************************************************           
 mov   esi,0
 mov   eax,[esi]   ;异常返回后从异常发生处继续执行
                               
        invoke  MessageBox,0,addr szTextOK,addr szCaption,MB_OK 
 ;********************************************************************
 ; 恢复原来的 SEH 链
 ;********************************************************************
 pop     fs:[0]                     
        add     esp,4

 invoke  ExitProcess,NULL
end _start
 

原创粉丝点击