打开ollydbg点击"选项"-"Debugging options"-"Exceptions"用于设置异常出现时od的默认处理行为。

windows异常机制中对异常的处理为:第一次异常处理过程中,先寻找调试器,如果调试器能处理异常,则结束异常处理流程,否则将异常交由程序的VEH/SEH机制处理;如果程序处理了异常,则结束异常处理,否则,windows进行第二次异常处理过程。"Ignore (pass to program) following exception"下的复选框被勾选/取消时,将影响Od第一次异常处理的行为。当复选框被勾选时,od收到异常后,返回"异常未处理"给系统,进而由应用程序来处理异常;当复选框未被勾选,od返回"异常已处理"给系统,由此停止异常处理流程。
接下来,我们用一段程序来说明这个结论,在main函数中触发av异常,如果在第一轮异常处理中,Od处理了异常,则不会进入exceptFilter异常过滤函数;反之,程序会进入exceptFilter函数,并以此输出"filter"和"end":
#include <stdio.h>
int exceptFilter()
{
printf("filter\n");
return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
if(argc==1)
{
__try
{
*(int*)0=1;
}
__except(exceptFilter())
{}
}
printf("End\n");
return 0;
}
先来看下av项未被勾选,程序运行到*(int*)0=1时的情况:
这种情况下,任由我按F7单步运行,程序一直卡死在指令:
010E10A5 C7 DB C7
并在Od底部显示"Access violation...use Shift+F9 to pass exception to pragram".
为什么有这样的现象?很简单,因为Od返回异常已处理,但事实是异常还在,下一次运行这条指令时还会触发av异常,这次Od又返回异常已处理。如此往复,就显得程序卡死在这条指令上。如果我们按Od的提示,按下"shift+F9"则会使程序进入exceptFilter函数。
现在,我们勾选av复选框,让od不处理异常,然后重启程序,程序顺利进入异常处理函数exceptFilter,并没有卡死在av指令上: