参加国际学术会议总结(2)

时间:2021-08-31

  异常处理流程是指运行在win32系统中的程序通常包含多个线程,而每个线程都会安装各自的异常处理例程;除此之外,程序中可能存在一个全局性的异常处理例程;再者,如果进程被调试的话,调试进程也相当于一个异常处理例程。当异常发生时,系统将根据异常类型选择一个异常处理例程来处理异常,正常情况下,系统进行异常处理的流程为:

  系统首先判断异常是否应发送给目标程序的异常处理例程。如果应该发送,并且目标程序正在被调试.则系统挂起程序;如果程序没有被调试或者调试器未能处理异常,系统继续查找是否安装了线程相关的异常处理例程。如果已经安装,系统就把异常发送给SEH处理例程。每个线程相关的异常处理例程可以处理或者不处理这个异常,如果它不处理并且安装了多个线程相关的异常处理例程可交由链起来的其他例程处理;如果这些SEH处理例程均不处理异常,且程序处于被调试状态,操作系统会再次通知调试器;如果程序未处于被调试状态或者调试器没有能够处理,并且程序调用SetUnhandledExceptionFilter函数安装了进程相关的异常处理例程的话,系统转向对它的调用;如果没有安装进程相关的异常处理例程或者它没有处理这个异常,系统会调用默认的异常处理例程,通常显示一个对话框,用户可以选择“关闭”或者可以将程序附加到调试器的“调试”按钮。如果没有可以附加的调试器或调试器也不处理,系统就对线程异常处理句柄进行展开做最后的清理工作,最终调用ExitProcess终结程序。通过对系统异常处理流程分析可知,当应用程序执行过程中发生异常时,系统可在三个层次上完成异常处理:调试器、进程、线程。线程层次的异常处理即SEH,能够准确定位异常的信息,更加灵活、隐蔽的实现反跟踪的功能,是本文研究的主要方面。下面深入分析SEH的工作原理。