我正在使用CreateProcess(标志NORMAL_PRIORITY_CLASS + DEBUG_PROCESS + DEBUG_ONLY_THIS_PROCESS)启动Explorer.exe实例,然后执行以下操作:

过程FakeDebugProcess;
变种
wDebugEvent:DEBUG_EVENT;
开始
fillchar(wDebugEvent,sizeof(wDebugEvent),0);
重复
如果WaitForDebugEvent(wDebugEvent,INFINITE)
然后
开始
如果wDebugEvent.dwDebugEventCode = EXIT_PROCESS_DEBUG_EVENT
然后休息
ContinueDebugEvent(wDebugEvent.dwProcessId,wDebugEvent.dwThreadId,DBG_CONTINUE);
结束;
直到错误;
结束;

一切正常,除了我从看起来像是“C:\ Windows \ System32 \ rpcrt4.dll”的文件中获得了许多EXCEPTION_DEBUG_EVENTs

(其他详细信息:EXCEPTION_ACCESS_VIOLATION)77ea3c00 sub_77ea3c00 :;功能入口点
77ea3c00 >> mov [ecx + 4],eax
77ea3c03 movsx eax,bx
77ea3c06 cdq
77ea3c07 sub eax,edx
77ea3c09 sar eax,1
77ea3c0b mov [ecx],ax
77ea3c0e xor eax,eax
77ea3c10 pop edi
77ea3c11 pop esi
77ea3c12 pop ebx
77ea3c13 pop ebp
77ea3c14第8版

我究竟做错了什么?我如何解决它?

我正在使用Delphi 7,顺便说一句。

最佳答案

您的代码很好,使用其他调试器(例如ollydbg,rpcrt4.dll)进行测试仍然会报告附加到某些应用程序的异常。解决此问题的唯一方法是根据异常代码,然后根据模块,定义过滤器(ollydbg允许用户执行操作)。因此,如果您收到0xC0000005(EXCEPTION_ACCESS_VIOLATION),则检查:EIP >= (UINT_PTR)GetModuleHandle("rpcrt.dll") && EIP <= (UINT_PTR)GetModuleHandle("rpcrt.dll") + getModuleSize("rpcrt.dll")(当然,getModuleSize是一个自定义函数,可以从PE中获取模块的虚拟化大小,而UINT_PTR是一种足以将指针保留在目标系统上的类型)。忽略它,否则处理事件,尽管可能需要连接到KiDispatchUserException(这应该是正确的,否则请检查NTInternals)

关于c++ - 我在使用WaitForDebugEvent EXCEPTION_DEBUG_EVENT时遇到问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3799294/

10-09 19:41