我写了两个函数利用异常处理来检测反调试,分别利用了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为什么会中断到判断函数返回值的指令呢? 且均没有给出中断原因。
跪求解答疑惑。
|