SetUnhandledExceptionFilter处理未捕获异常

 

      首先看下百度上的对此函数的解释。

设置异常捕获函数.

  当异常没有处理的时候,系统就会调用SetUnhandledExceptionFilter所设置异常处理函数.

  例如一些程序在出错的时候,会向用户报告说程序那出错就是利用这个.例如QQ..

  异常处理中的一部分

  当发生异常时,比如内存访问违例时,CPU硬件会发现此问题,并产生一个异常(你可以把它理解为中断)

  然后CPU会把代码流程切换到异常处理服务例程。操作系统异常处理服务例程会查看当前进程是否处于调试状态

  如果时,则通知调试器发生了异常,如果不是则操作系统会查看当前线程是否安装了的异常帧链(FS[0]),如果安装了SEH(try.... catch....),则调用SEH,并根据返回结果决定是否全局展开活局部展开。如果异常链中所有的SEH都没有处理此异常,而且此进程还处于调试状态,则操作系统会再次通知调试器发生异常(二次异常)。如果还没人处理,则调用操作系统的默认异常处理代码UnhandledExceptionHandler,不过操作系统允许你Hook这个函数,就是通过SetUnhandledExceptionFilter函数来设置。大部分异常通过此种方法都能捕获,不过栈溢出、覆盖的有可能捕获不到。

  大部分保护壳都采用异常处理技术,跳出正常的代码指令流程,来迷惑Cracker。

   说的有点粗略。

下面根据自己的理解阐述下。

   SetUnhandledExceptionFilter,根据函数的名字能看出是设置异常处理函数,其实如果程序没设置异常处理函数,程序会调用默认的处理函数处理异常,然后程序终止,一般情况下就弹出个对话框。

如何设置自己的异常处理函数?

LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(
LPTOP_LEVEL_EXCEPTION_FILTER
lpTopLevelExceptionFilter
);

参数是一个函数指针,定义如下

LONG UnhandledExceptionFilter(
STRUCT _EXCEPTION_POINTERS
*ExceptionInfo
);

函数类型

ExceptionInfo 是对异常描述的一个结构体

typedef struct _EXCEPTION_POINTERS {
PEXCEPTION_RECORD ExceptionRecord;
PCONTEXT ContextRecord;
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;

异常捕获函数有三种返回值

EXCEPTION_EXECUTE_HANDLER:表明异常处理完毕,程序可以退出

EXCEPTION_CONTINUE_EXECUTION:忽略此异常,从异常点继续运行。如果此时再发生异常,还会调用异常处理函数

EXCEPTION_CONTINUE_SEARCH:异常没被识别,交由上一级处理函数处理;

SetUnhandledExceptionFilter返回值,如果为0,表明此时没有附加额外的处理函数(除默认的处理函数),如果非空,则存放到当前顶层的处理函数地址。

需要注意的是,SetUnhandledExceptionFilter设置的异常处理函数为全局的处理函数,是异常发生后,最后一次处理异常的机会。如果程序被调试器附加。调试器将优先于SetUnhandledExceptionFilter设置的异常处理函数处理异常。C++自定义的try{}Catch{}比较。这是C++自定义的异常处理过程,利用SEH来处理发生的异常,如果异常发生,又出现在try{}Catch{}中 将得到优先处理。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Qt中,可以使用QApplication类的setUnhandledExceptionFilter函数来设置全局异常处理函数。具体步骤如下: 1. 创建一个全局异常处理函数,该函数需要接收一个std::exception指针作为参数,如下所示: ``` void myExceptionHandler(std::exception *e) { qDebug() << "Exception caught: " << e->what(); } ``` 2. 在应用程序的main函数中,调用QApplication类的setUnhandledExceptionFilter函数并传入全局异常处理函数,如下所示: ``` int main(int argc, char *argv[]) { QApplication app(argc, argv); qInstallMessageHandler(myMessageHandler); QApplication::setUnhandledExceptionFilter(myExceptionHandler); // 设置全局异常处理函数 // 其他代码... return app.exec(); } ``` 在上述代码中,我们先调用了qInstallMessageHandler函数,设置了一个自定义的消息处理函数myMessageHandler,以便在程序运行过程中可以将一些调试信息输出到控制台。然后,我们调用QApplication类的setUnhandledExceptionFilter函数,将全局异常处理函数myExceptionHandler传入。 当程序中发生捕获异常时,该异常会被传递给myExceptionHandler函数进行处理。在该函数中,我们可以打印出异常信息,或者进行一些其他的处理操作。 注意:在Qt中,如果一个异常没有被捕获,那么程序将会调用terminate函数结束运行,因此我们必须在全局异常处理函数中尽可能地处理异常,避免程序异常终止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值