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指令上:

《Ollydbg异常处理设置项》

《Ollydbg异常处理设置项》

POC~

    原文作者:Yuri800
    原文地址: https://blog.csdn.net/lixiangminghate/article/details/55805590
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞