飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2473|回复: 0

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

[复制链接]
  • TA的每日心情
    难过
    2024-4-22 14:49
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2014-2-5 00:38:56 | 显示全部楼层 |阅读模式
    1. //////////////////////////////////////////////////////////////////////////
    2. // SEH异常实例 piaoyun
    3. // www.chinapyg.com
    4. // 2013-11-28
    5. //////////////////////////////////////////////////////////////////////////
    6. #include <windows.h>
    7. #include <stdio.h>

    8. // SEH 回调函数
    9. EXCEPTION_DISPOSITION __cdecl _except_handler (
    10.         struct _EXCEPTION_RECORD *ExceptionRecord,
    11.         void * EstablisherFrame,
    12.         struct _CONTEXT *ContextRecord,
    13.         void * DispatcherContex)
    14. {
    15.         printf("SEH异常触发:code-0x%x, flags-0x%x\n",
    16.                 ExceptionRecord->ExceptionCode,
    17.                 ExceptionRecord->ExceptionFlags);
    18.         if(ExceptionRecord->ExceptionCode == STATUS_INTEGER_DIVIDE_BY_ZERO)
    19.         {
    20.                 printf("异常类型:STATUS_INTEGER_DIVIDE_BY_ZERO\n");
    21.                 printf("当前ECX:%d\n",ContextRecord->Ecx);
    22.                 ContextRecord->Ecx = 50;
    23.                 printf("修正ECX:%d\n",ContextRecord->Ecx);
    24.                 return ExceptionContinueExecution;
    25.         }
    26.         return ExceptionContinueSearch;
    27. }

    28. void main()
    29. {   
    30.         _asm
    31.         {
    32.                 // 注册SEH
    33.                 PUSH offset _except_handler
    34.                 PUSH    DWORD PTR FS:[0]
    35.                 MOV     DWORD PTR FS:[0], ESP

    36.                 // 造成除零异常
    37.                 XOR     EDX, EDX
    38.                 MOV     EAX, 0xC8
    39.                 XOR     ECX, ECX
    40.                 IDIV    ECX

    41.                 // 取消SEH
    42.                 POP     DWORD PTR FS:[0]
    43.                 POP     EAX

    44.                 //---或者用下面方法
    45.                 //mov eax,[esp]
    46.                 //mov fs:[0], eax
    47.                 //add esp,8
    48.         }
    49.         printf("SEH实例运行完毕!\n");
    50. }
    复制代码


    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表