[原创]异常处理流程(一) 异常处理三剑客
异常处理流程是学习逆向中至关重要的一环,我们试图揭开异常处理流程的神秘面纱。
调试器: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。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
