天天看点

Ollydbg异常处理设置项

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

Ollydbg异常处理设置项

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时的情况:

Ollydbg异常处理设置项

这种情况下,任由我按F7单步运行,程序一直卡死在指令:

010E10A5     C7             DB C7      

并在Od底部显示"Access violation...use Shift+F9 to pass exception to pragram". 

Ollydbg异常处理设置项

为什么有这样的现象?很简单,因为Od返回异常已处理,但事实是异常还在,下一次运行这条指令时还会触发av异常,这次Od又返回异常已处理。如此往复,就显得程序卡死在这条指令上。如果我们按Od的提示,按下"shift+F9"则会使程序进入exceptFilter函数。

现在,我们勾选av复选框,让od不处理异常,然后重启程序,程序顺利进入异常处理函数exceptFilter,并没有卡死在av指令上:

继续阅读