;************************************************************************
;*项目名称:Final SEH示例 *
;************************************************************************
;*代码名称:FEH_1_1.asm *
;*代码功能:采用修改regEip到新的EIP处继续执行 *
;************************************************************************
;*代码作者:by lujue, 2006-10-30 *
;************************************************************************
;************************************************************************
;汇编模式定义
;************************************************************************
.386
.model flat,stdcall
option casemap:none
;************************************************************************
;头文件定义
;************************************************************************
include windows.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
;************************************************************************
;数据段定义
;************************************************************************
.data
szCap db "Final Exception Handler",0
szMsgOK db "OK,the exceptoin was handled by final handler!",0
szMsgERR1 db "修复了ECX!",0
;************************************************************************
;代码段
;************************************************************************
;************************************************************************
;程序入口
;************************************************************************
.code
_start:
;调用SetUnhandledExceptionFilter来安装Final SEH
;原型很简单SetUnhandledExceptionFilter proto pTopLevelExceptionFilter:DWORD
lea eax,Final_Handler
invoke SetUnhandledExceptionFilter,eax
;************************************************************************
;除法异常
;************************************************************************
xor ecx,ecx
mov eax,200
cdq
div ecx
invoke MessageBox,NULL,addr szMsgERR1,addr szCap,MB_OK + MB_ICONINFORMATION
Exit: invoke ExitProcess,NULL
;********************************************************************
; 函数功能:异常处理回调函数:修改 regEcx 使其不为0
;********************************************************************
Final_Handler:
push ebp
mov ebp,esp
invoke MessageBox,NULL,addr szMsgOK,addr szCap,MB_OK+MB_ICONEXCLAMATION
mov ebx,[ebp + 8h] ;ebx指向EXCEPTION_POINTERS结构
mov esi,[ebx] ;esi指向EXCEPTION_RECORD结构
mov edi,[ebx + 4h] ;edi指向CONTEXT结构
assume esi:ptr EXCEPTION_RECORD,edi:ptr CONTEXT
lea eax,Exit
mov [edi].regEip,eax
assume esi:nothing,edi:nothing
;EXCEPTION_EXECUTE_HANDLER equ 1 这时不出现非法操作的讨厌对话框,程序被终止。
;mov eax,EXCEPTION_EXECUTE_HANDLER
;EXCEPTION_CONTINUE_SEARCH equ 0 出现非法操作的讨厌对话框,这时是调用系统默认的异常处理过程,程序被终结了
;mov eax,EXCEPTION_CONTINUE_SEARCH
;EXCEPTION_CONTINUE_EXECUTION equ -1 不断出现对话框,你将陷入死循环,如果没有修复ecx,就会不断产生异常,然后不断调用这个例程而死循环,
;除非更改流向,或修复,或用EixtProcess退出进程,这里我们作了修复,程序正常终止。
mov eax,EXCEPTION_CONTINUE_EXECUTION
mov esp,ebp
pop ebp
Err_Exit:
ret
end _start