Re: 请教一个关于windows异常分发的问题。
C/C++本地代码调试
请教一个关于windows异常分发的问题。
风继续吹
2016-08-21, 23:52 下午
我写了两个函数利用异常处理来检测反调试,分别利用了int3断点和0地址访问两种异常,但是得到的效果却不一样,所以来这里请教。
代码分别如下:
函数1:
BOOL MyIsDebuggerPresent_Int3()
{
__try
{
__asm int 3
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
return FALSE;
}
return TRUE;
}
函数2:
BOOL MyIsDebuggerPresent_AccessZeroAddress()
{
__try
{
int* pAddr = NULL;
*pAddr = 1;
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
return FALSE;
}
return TRUE;
}
程序中分别在main函数中调用这两个函数,如果返回TRUE,就表示该程序正在被调试,则会打印出"Being Debugged.",否则打印出"Not Being Debugged."。
现象是:当用windbg调试时,对于函数1,windbg会收到断点指令异常,在windbg中执行gu命令后会断下,当前的指令是test eax,eax(这条指令是在判断MyIsDebuggerPresent_Int3
的返回值
,
windbg没有给出中断的原因,
为什么会断到这条指令呢?),然后执行gu命令,结果发现
打印出"Being Debugged.",也即意味着函数1中的异常处理部分始终未被执行;而
对于函数2,windbg会收到访问违规异常,在windbg中执行gu命令后会断下,当前的指令是test eax,eax(这条指令是在判断
MyIsDebuggerPresent_AccessZeroAddress的返回值
,windbg也没有给出中断的原因,为什么也会断到这条指令呢?),然后执行gu命令,结果发现
打印出"Not Being Debugged.",也即意味着函数2中的异常处理部分被执行了。
问题:1、对于int3断点,为什么在windbg中执行了gu命令,自己的代码中针对该断点的异常处理没有被执行呢? 而针对访问违规在windbg中执行了gu命令,自己的代码中针对该访问违规的异常处理却被执行了。 2、针对int3断点以及访问违规这两种异常,windbg为什么会中断到判断函数返回值的指令呢? 且均没有给出中断原因。
跪求解答疑惑。
Re: 请教一个关于windows异常分发的问题。
风继续吹
2016-08-22, 02:22 上午
睡不着,总觉得是自己哪里搞错了,刚才翻了一下windbg的帮助文件,果然是自己搞错了。 gn(Go with Exception Not Handled)命令才是返回强制不处理异常,我记成gu(Go Up)命令,误以为是(Go with Exception Unhandled)了。 希望各位不要犯和我相同的错误。
Re: 请教一个关于windows异常分发的问题。
格蠹老雷
2016-08-22, 10:33 上午
精神可嘉