欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]异常处理流程(一) 异常处理三剑客

[原创]异常处理流程(一) 异常处理三剑客

异常处理流程是学习逆向中至关重要的一环,我们试图揭开异常处理流程的神秘面纱。

调试器:OllyDbg

环境:WIN XP SP3 虚拟机


异常处理的本质是一个外部中断。中断是计算机硬件的一个重要概念,这里分享一个百度百科的解释给不清楚的朋友参考。

https://baike.baidu.com/item/%E4%B8%AD%E6%96%AD/3933007?fr=aladdin

具体讲,就是在遇到异常时,程序会跳出正常的程序执行流程,执行一段远在程序代码之外的代码,这段代码叫SEH( Structured Exception Handling )结构化异常处理函数。顾名思义是处理异常的专用函数。很多壳会利用系统的这一特性实现反调试,可谓是别出心裁了。只要有想法,任何一个不起眼的函数或者机制都可以摇身一变成为反调试的利器。本例就是如此

初次配置反调试插件时,首先忽略所有异常,用插件把FindWindow和IsDebuggerPresent过掉,保存,重启,让插件生效。

载入OD,发现运行以后停下来,显示无法处理的异常,很奇怪,明明忽略所有的异常,为什么还会因为异常被断下?

遇到这情况,需要明白异常区前都执行了什么函数

载入程序,首先来了解一些,SetUnhandleExeptionFilter函数的作用


翻译第二段:当这个函数调用完成后,如果一个未调试器调试的进程有异常发生后,异常会让这个进程运行结构化异常处理函数(SEH),这个函数(原文是filter,不是function。所以这里是意译)会调用由 lpTopLevelExceptionFilter所指定的异常处理函数。

所以这个函数很关键很关键很关键。

这个函数怎么用呢?我们看一下。

 #include   <windows.h>   

    

  long   __stdcall   callback(_EXCEPTION_POINTERS*   excp)   

  {   

  MessageBox(0,"Error","error",MB_OK);   

  printf("Error   address   %x/n",excp->ExceptionRecord->ExceptionAddress);   

  printf("CPU   register:/n");   

  printf("eax   %x   ebx   %x   ecx   %x   edx   %x/n",excp->ContextRecord->Eax,   

  excp->ContextRecord->Ebx,excp->ContextRecord->Ecx,   

  excp->ContextRecord->Edx);   

  return   EXCEPTION_EXECUTE_HANDLER;   

  }

    

  int   main(int   argc,char*   argv[])   

  {   

  SetUnhandledExceptionFilter(callback);   

  _asm   int   3   //只是为了让程序崩溃

  return   0;   

  }

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功