飘云 发表于 2014-2-5 00:38:56

原生SEH异常实例[VC6]--飘云

//////////////////////////////////////////////////////////////////////////
// SEH异常实例 piaoyun
// www.chinapyg.com
// 2013-11-28
//////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <stdio.h>

// SEH 回调函数
EXCEPTION_DISPOSITION __cdecl _except_handler (
      struct _EXCEPTION_RECORD *ExceptionRecord,
      void * EstablisherFrame,
      struct _CONTEXT *ContextRecord,
      void * DispatcherContex)
{
      printf("SEH异常触发:code-0x%x, flags-0x%x\n",
                ExceptionRecord->ExceptionCode,
                ExceptionRecord->ExceptionFlags);
      if(ExceptionRecord->ExceptionCode == STATUS_INTEGER_DIVIDE_BY_ZERO)
      {
                printf("异常类型:STATUS_INTEGER_DIVIDE_BY_ZERO\n");
                printf("当前ECX:%d\n",ContextRecord->Ecx);
                ContextRecord->Ecx = 50;
                printf("修正ECX:%d\n",ContextRecord->Ecx);
                return ExceptionContinueExecution;
      }
      return ExceptionContinueSearch;
}

void main()
{   
      _asm
      {
                // 注册SEH
                PUSH offset _except_handler
                PUSH    DWORD PTR FS:
                MOV   DWORD PTR FS:, ESP

                // 造成除零异常
                XOR   EDX, EDX
                MOV   EAX, 0xC8
                XOR   ECX, ECX
                IDIV    ECX

                // 取消SEH
                POP   DWORD PTR FS:
                POP   EAX

                //---或者用下面方法
                //mov eax,
                //mov fs:, eax
                //add esp,8
      }
      printf("SEH实例运行完毕!\n");
}

页: [1]
查看完整版本: 原生SEH异常实例[VC6]--飘云