码迷,mamicode.com
首页 > Windows程序 > 详细

windows异常处理

时间:2014-12-01 20:40:31      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:style   io   ar   color   os   使用   sp   for   on   

参考书籍:《Windows环境下32位汇编语言程序设计》14章、《C++反汇编与逆向分析技术揭秘》13章

异常处理的作用:在程序运行出现异常或错误时,系统给予程序修正错误或异常的最后一个机会。

 

异常处理分2类(按作用域分):

1、筛选器过滤回调函数,这个函数的作用域为进程范围,一个进程有且只有一个筛选器过滤回调函数,

 优点:使用简单

 缺点:由于是全局性,所以不利于封装,无法为线程单独设置异常处理函数。

2、结构化异常处理(SEH),这个函数作用域为线程范围,而且可以为每个线程同时设置多个异常处理函数

 =================================================================

异常的处理过程:

(1).系统查看产生异常的进程是否正在被调试,如果正在被调试的话,那么向调试器发送EXCEPTION_DEBUG_EVENT事件

(2).如果进程没有被调试或者调试器不去处理这个异常,那么系统 检查异常所处的线程,并在这个线程环境中查看fs:[0]来确定是否安装有SEH异常处理回调函数,如果有则调用它.

(3).回调函数尝试处理这个异常,如果可以正确处理的话,则修正错误并将返回值设置为ExceptionContinueExecution,这时系统将结束整个查找过程

(4).如果回调函数返回ExceptionContinueSearch,告知系统他无法处理这个异常,那么系统将根据SEH链中的prev字段得到上一个回调函数地址,并重复步骤(3)过程,直到链中某个回调函数返回ExceptionContinueExecution为止,查找结束

(5).如果到了SEH链的尾部,却没有一个回调函数愿意处理这个异常,那么系统将再次检测进程是否正在被调试,如果被调试的话,则再次通知调试器

(6).如果调试器还是不去处理这个异常或者进程没有被调试 ,那么系统检查有没有安装筛选器回调函数,如果有,则去调用他,筛选器回调函数返回的时候,系统默认的异常处理程序根据这个返回值将做出相应的动作

(7).如果没有安装筛选器回调函数,系统直接 调用默认的异常处理程序终止进程

 

==================================================================

异常处理相关的数据结构:

typedef struct _EXCEPTION_POINTERS {
  PEXCEPTION_RECORD ExceptionRecord; //关于这个异常一些相关数据
  PCONTEXT          ContextRecord;//异常发生时线程执行环境
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;

 

typedef struct _EXCEPTION_RECORD {
  DWORD ExceptionCode;//异常事件代码
  DWORD ExceptionFlags;//异常时间标志
  struct _EXCEPTION_RECORD* ExceptionRecord;//下一个EXCEPTION_RECORD结构地址
  PVOID ExceptionAddress;
  DWORD NumberParameters;
  DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD;

 

struct EXCEPTION_REGISTRATION    
{    
    EXCEPTION_REGISTRATION* prev;    //上一个 EXCEPTION_REGISTRATION 
    FARPROC handler;     //异常处理函数地址
}; 

======================================================================

筛选器过滤回调函数使用及注意:

1、调用SetUnhandledExceptionFilter设置回调函数

LONG WINAPI UnhandledExceptionFilter(
  _In_  struct _EXCEPTION_POINTERS *ExceptionInfo
);

//这个是回调函数的原型

//返回EXCEPTION_EXECUTE_HANDLER=1 返回这个值进程通常会被终止

//返回EXCEPTION_CONTINUE_EXECUTION=-1 返回这个值进程将继续运行

//返回EXCEPTION_CONTINUE_SEARCH=0 返回这个值进程通常被终止,不过会弹出系统错误对话框

 

SEH使用及注意:

1、替换FS:[0]的EXCEPTION_REGISTRATION指针

//FS段寄存器永远指向当前线程结构体TIB,而FS:[0]则指向EXCEPTION_REGISTRATION的指针

//SEH回调函数返回值

//ExceptionContinueExecution=0 继续执行,系统将线程环境设置为

//ExceptionContinueSearch=1 回调函数拒绝处理这个异常,系统将调用EXCEPTION_REGISTRATION中指向的上一层回调函数出来该异常

//ExceptionNestedException=2 回调函数在执行过程中又发生新的异常,即嵌套异常

//ExceptionCollidedUnwind=3发生嵌套的展开操作

 =====================================================================================

异常的展开(Exception_Unwind)

 

为什么会引发异常展开:当SEH链上所有的异常回调函数都无法处理或不去处理一个异常时,这个时候,系统将向SEH链的每个回调函数发送EXCEPTION_UNWIND,从而引发异常展开(EXCEPTION_UNWIND也可以由某个SEH回调函数发出,然后发出EXCEPTION_UNWIND前面的所有回调函数将被卸载,FS:[0]将指向发出EXCEPTION_UNWIND的回调函数)

异常展开的作用:

  1、收到EXCEPTION_UNWIND的SEH回调函数将被卸载,所以回调函数收到EXCEPTION_UNWIND时,将为自己做一些善后工作,其中特别重要的操作是将FS:[0]修改为自己的下一个SEH回调函数

 

异常展开函数:RtlUnwind()具体操作可以看《Windows环境下32位汇编语言程序设计》P521

  

 

windows异常处理

标签:style   io   ar   color   os   使用   sp   for   on   

原文地址:http://www.cnblogs.com/bravechild/p/4135664.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!