Thread SEH示例2_1

;************************************************************************
;*项目名称:Thread SEH示例      *
;************************************************************************
;*代码名称:Thread SEH_2_1.asm      *
;*代码功能:采用修改regEip值来修改程序流向的方式到指定位置处继续执行        *
;************************************************************************
;*代码作者: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
szTextERR db "SEH程序没有运行",0

;************************************************************************
;代码段
;************************************************************************
.code
;********************************************************************
; 函数功能:异常处理回调函数:修改 regEip 使其指向ExecuteHere处的位置
;********************************************************************
perThread_Handler proc uses ebx pExcept:DWORD,pFrame:DWORD,pContext:DWORD,pDispatch:DWORD       

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

        mov     eax,pContext
        Assume  eax:ptr CONTEXT

        lea     ebx, ExecuteHere  ; 异常后准备从ExecuteHere后开始执行
        mov     [eax].regEip,ebx 
        xor     ebx,ebx
        mov     [eax].iDr0,ebx    ; 对iDrx调试寄存器清零,使断点失效(反跟踪)
        mov     [eax].iDr1,ebx
        mov     [eax].iDr2,ebx
        mov     [eax].iDr3,ebx
        mov     [eax].iDr7,341
 
        mov     eax,ExceptionContinueExecution    ; ExceptionContinueExecution equ 0,表示异常已经修复,从regEip指定地址处继续执行
        ret                   
perThread_Handler endp

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

 ;********************************************************************
 ; 会引发异常的指令
 ;********************************************************************           
 mov   esi,0
 mov   eax,[esi] 

 WouldBeOmit:                                 
        invoke  MessageBox,0,addr szTextERR,addr szCaption,MB_OK    ;这一句将无法被执行
 
 ;********************************************************************
 ; 异常处理完毕后,从这里开始执行
 ;********************************************************************
 ExecuteHere:
 invoke  MessageBox,0,addr szTextOK,addr szCaption,MB_OK
 ;********************************************************************
 ; 恢复原来的 SEH 链
 ;********************************************************************
        pop     fs:[0]                     
        add     esp,4

        invoke  ExitProcess,NULL
end _start
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值