-
-
[求助]如何让调试器忽略指定异常
-
发表于: 2012-11-12 20:31 2913
-
大家好,我在写一个小的调试器,遇到一个问题就是我想在被调试程序遇到EXCEPTION_ACCESS_VIOLATION异常的时候,让被调试程序执行自己的异常处理程序,我搜索了一下,网上说将ContinueDebugEvent的第三个参数设置为DBG_EXCEPTION_NOT_HANDLED就可以了.可是我测试的结果不管用.
调试起的代码如下:
被调试程序的异常处理程序如下:
我测试的结果是当被调试程序触发异常的时候,收到两次EXCEPTION_ACCESS_VIOLATION,被调试程序就退出了.
希望高人指点一下.谢谢.
调试起的代码如下:
int _tmain(int argc, _TCHAR* argv[]) { EnablePrivilege(SE_DEBUG_NAME); DWORD processid; cout<<"input processid:"; cin>>processid; if(!DebugActiveProcess(processid)) return 0; DEBUG_EVENT de={0}; DWORD dwContinueStatus=DBG_CONTINUE; while(::WaitForDebugEvent(&de,INFINITE)) { switch(de.dwDebugEventCode) { case EXCEPTION_DEBUG_EVENT: switch(de.u.Exception.ExceptionRecord.ExceptionCode) { case EXCEPTION_BREAKPOINT: break; case EXCEPTION_SINGLE_STEP: break; case EXCEPTION_ACCESS_VIOLATION: printf("access error!\r\n"); if(de.u.Exception.dwFirstChance) ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_EXCEPTION_NOT_HANDLED); else ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE ); continue; break; } break; default: break; } if(!ContinueDebugEvent(de.dwProcessId,de.dwThreadId,dwContinueStatus )) { break; } } return 0; }
被调试程序的异常处理程序如下:
static DWORD NewEip; static DWORD isDebugged; LONG WINAPI TopUnhandledExceptionFilter( struct _EXCEPTION_POINTERS *ExceptionInfo ) { _asm pushad AfxMessageBox(_T("进入异常处理函数")); ExceptionInfo->ContextRecord->Eip=NewEip;//转移到安全位置 _asm popad return EXCEPTION_CONTINUE_EXECUTION; } typedef LPTOP_LEVEL_EXCEPTION_FILTER (_stdcall *pSetUnhandledExceptionFilter)( LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter ); pSetUnhandledExceptionFilter lpSetUnhandledExceptionFilter; void CS1Dlg::OnBnClickedButton3() { lpSetUnhandledExceptionFilter = (pSetUnhandledExceptionFilter)GetProcAddress(LoadLibrary(_T("kernel32.dll")), "SetUnhandledExceptionFilter"); lpSetUnhandledExceptionFilter(TopUnhandledExceptionFilter); _asm{ //获取这个安全地址 call me //方式一,需要NewEip加上一个偏移值 me: pop NewEip //方式一结束 mov NewEip,offset safe //方式二,更简单 xor eax,eax jmp eax //int 3 //触发异常 } isDebugged=1; _asm{ safe: } if(1==isDebugged){ }else{ } }
我测试的结果是当被调试程序触发异常的时候,收到两次EXCEPTION_ACCESS_VIOLATION,被调试程序就退出了.
希望高人指点一下.谢谢.
赞赏
他的文章
- [求助]android签名问题 4093
- [求助]hookSwapContext的疑惑 3549
- [求助]如何让调试器忽略指定异常 2914
- 大家帮我看看如何使list控件支持文件拖拽 3432
看原图
赞赏
雪币:
留言: