结构化异常处理
由于windows系统可以在运行态安装一个异常处理回调函数,当应用程序的异常发生时候,回调过程就被系统触发,由应用程序来处理这些异常,实现对异常的修补
但是这个异常回调是怎么实现的呢?
代码:
ASSUME FS :NOTHING ifndef SehStruct SehStruct EQU 1 .DATA SEH sSEH <> endif .CODE MOV SEH.SaveEip , ContinueAddr MOV SEH.OrgEbp, EBP PUSH OFFSET SehHandler PUSH FS:[0] MOV SEH.OrgEsp, ESP MOV FS:[0],ESP ;去除回调 POP FS:[0] ADD ESP,4
代码:
.386 .model flat,stdcall option casemap:none include \masm32\include\user32.inc includelib \masm32\lib\user32.lib include \masm32\include\windows.inc ;结构定义 sSEH STRUCT OrgEsp DD ? OrgEbp DD ? SaveEip DD ? sSEH ends ;宏定义 InstSehFrame MACRO ContinueAddr ASSUME FS : NOTHING IFNDEF SehStruct SehStruct EQU 1 .DATA SEH sSEH <> ENDIF .CODE mov SEH.SaveEip, ContinueAddr mov SEH.OrgEbp,EBP push offset SehHandler push FS:[0] mov SEH.OrgEsp,ESP mov FS:[0],ESP endm KillSehFrame MACRO pop fs:[0] add esp,4 endm ;过程定义 .CODE SehHandler PROC c pExcept:DWORD ,pFrame:DWORD ,pContext:DWORD,PDispatch:DWORD mov eax,pContext ASSUME eax:ptr context push seh.SaveEip POP [eax].regEip PUSH SEH.OrgEsp pop [eax],regEsp push SEH.OrgEbp pop [eax],regEbp mov eax,ExceptionContinueExecution ret SehHandler endp .DATA szGood DB "SEH succeed",0 szCap DB "OK",0 .CODE main: InstSehFrame <OFFSET SavePlace1> ;产生异常的代码1 xor eax,eax xchg DWORD ptr [eax],eax SavePlace1: KillSehFrame InstSehFrame <OFFSET SavePlace2> ;产生异常2 xor ebx,ebx xor edx,edx mov eax,2 div ebx SavePlace2: KillSehFrame invoke MessageBox,0,offset szGood,offset szCap,MB_OK RET end main InstSehFrame 安装异常回调函数 KillSehFrame 去除自定义的异常处理回调函数