【问题标题】:I'm having problems with WaitForDebugEvent EXCEPTION_DEBUG_EVENT我遇到了 WaitForDebugEvent EXCEPTION_DEBUG_EVENT 的问题
【发布时间】:2011-04-17 11:46:47
【问题描述】:

我正在使用 CreateProcess(标志 NORMAL_PRIORITY_CLASS + DEBUG_PROCESS + DEBUG_ONLY_THIS_PROCESS)启动一个 Explorer.exe 实例,然后我正在这样做:

过程 FakeDebugProcess;
变量
  wDebugEvent:DEBUG_EVENT;
开始
  填充字符(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 子 eax, edx 77ea3c09 sar eax, 1 77ea3c0b mov [ecx], 斧头 77ea3c0e xor eax, eax 77ea3c10 流行音乐 77ea3c11 流行音乐 77ea3c12 流行 ebx 77ea3c13 弹出 ebp 77ea3c14 ret 8

我做错了什么?我该如何解决?

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

【问题讨论】:

  • 所以,似乎更好的方法是:
  • 如果 wDebugEvent.dwDebugEventCode = EXIT_PROCESS_DEBUG_EVENT 则开始,然后中断; ContinueDebugEvent(wDebugEvent.dwProcessId, wDebugEvent.dwThreadId, DBG_EXCEPTION_NOT_HANDLED);结尾;根据MSDN:函数继续异常处理。如果这是第一次机会异常事件,则使用结构化异常处理程序的搜索和调度逻辑;否则,该过程终止。对于任何其他调试事件,此标志只是继续线程。
  • Explorer.exe 现在正因“应用程序未能正确初始化 (0x80000003)”而死,所以仍未解决。

标签: c++ delphi debugging winapi


【解决方案1】:

我知道这个帖子很旧,但我遇到了同样的问题并解决了它,所以我想我会分享。

如果启动一个进程并希望使用 Windows API 调用对其进行调试,您应该知道 Windows 将在第一次加载时发送一个 EXCEPTION_BREAKPOINT (INT3)。您必须调试第一个断点异常...

现在,对于所有其他异常,您希望返回 DBG_EXCEPTION_NOT_HANDLED 以便将它们传回并处理。在 windows 产生第一个断点异常后,您可以随意设置额外的断点。

调试循环的真正简化代码如下所示:

// debug loop...  while(debugging) or whatever you want to do.

DEBUG_EVENT DebugEvent;
DWORD ContinueStatus = DBG_CONTINUE;

WaitForDebugEvent(&DebugEvent, INFINITE);

switch (DebugEvent.dwDebugEventCode) {

    case EXCEPTION_DEBUG_EVENT:

        switch(DebugEvent.u.Exception.ExceptionRecord.ExceptionCode) { 

            case EXCEPTION_BREAKPOINT:
                // stay with DBG_CONTINUE at least for the first breakpoint. 
                // continue, don't pass this back to process being debugged.   
                break;
            default:
                // handles all other stuff like EXCEPTION_ACCESS_VIOLATION
                // pass these back to the process being debugged... 
                ContinueStatus = DBG_EXCEPTION_NOT_HANDLED;
                break;
        }
        break;

    default: 
        break;
}

ContinueDebugEvent(DebugEvent.dwProcessId, DebugEvent.dwThreadId, ContinueStatus);

基础知识:

  • Windows 会在启动时生成一个断点,您需要捕获它而不是返回。
  • 大型 Windows 程序还有许多其他需要处理的异常,因此请将它们传递回去。
  • 在启动时回传断点导致:“应用程序未能正确初始化 (0x80000003)”
  • 捕获内存/SEH 异常而不将它们传回会导致调试器循环中出现无限循环,因为异常永远没有机会被代码清除。

【讨论】:

    【解决方案2】:

    您的代码很好,使用其他调试器进行测试,例如 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)

    【讨论】:

      【解决方案3】:

      为什么你认为你的代码有问题?调试器会第一时间收到任何 SEH 异常的通知。您正在调试大量代码。不仅是 Explorer.exe,您还可以获得所有的外壳扩展处理程序。周围有很多垃圾,即使这些扩展有错误,Explorer 也会尽最大努力保持活力。

      如果您真的想解决这个问题,这不是一个坏主意,那么请使用 SysInternals 的 Autoruns 实用程序并禁用任何不是由 Microsoft 制作且您并不真正需要的 shell 扩展处理程序。如果你想测试你的调试器,那么试试 Notepad.exe 之类的更纯洁的东西。虽然 File + Open 带回了这些 shell 扩展。

      【讨论】:

      • 我的意思是无论安装什么外壳扩展,我的代码都需要工作。我想知道的是我做错了什么触发了异常。异常不断出现,以至于 Explorer.exe 变得无法使用。
      • 而且它并不是真正的调试器。我正在尝试的更像是保护 Explorer.exe 免受不必要的入侵。
      • 呃,Windows 不知道您不想成为调试器。你要它,你得到它。
      • 确实,我知道这一点。正如我所说的那样,Explorer 在洪水中变得无法使用。异常已经被触发(我对此表示怀疑),并且调试通知使过程太慢,或者我以某种方式引发了这些异常,即使是间接的。我只是不知道如何解决这个问题。
      • 我也没有看到。看起来您可以使用调试器 API 来完成这项工作的基本假设都被粉碎了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多