【问题标题】:Catching child process exceptions on windows在 Windows 上捕获子进程异常
【发布时间】:2011-05-17 21:40:55
【问题描述】:

我正在开发一个多平台 C++ 模糊测试应用程序。该应用程序生成一个子进程并检查它是否意外停止。我已经设法在 linux 上做到这一点,但是,windows 异常处理机制让我很难做到。

我的代码现在执行以下操作: - 调用 CreateProcess 来生成进程。 - WaitForSingleObject 等待它终止。 - 然后调用GetExitCodeProcess,检查退出码是否对应异常。

一切正常,我已经使用空解引用测试应用程序对其进行了测试,我可以优雅地捕获异常。但是,每次我对此进行测试时,都会出现一个 Windows 错误消息框,告诉我发送或不发送错误报告。由于 fuzzer 应该是一个自动测试应用程序,我需要以某种方式禁用此通知,以便即使捕获到异常,fuzzer 也可以继续测试。

我已经尝试安装一个 SEH 处理程序,但没有运气(显然这些处理程序没有被子进程继承)。我读过一些关于使用向量异常处理的内容,但假设它是一样的,我相信向量处理程序不是继承的。

有人可以帮我解决这个问题吗?我不知道要搜索什么,我已经用谷歌搜索了很多,但没有找到任何东西。

谢谢!

【问题讨论】:

    标签: windows debugging exception exception-handling seh


    【解决方案1】:

    Debug API 是一种选择。 Here 是 MSDN 的起点。

    【讨论】:

    • 感谢您的回答!我曾想过使用一些调试 API,但认为一些使用一些反调试机制来避免破解和/或恢复的应用程序如果检测到它们正在被模糊器调试,则可以修改它们的行为。我想如果我找不到另一个选项,那么我将不得不使用这个调试机制。
    • 更有理由向那些试图对其代码进行逆向工程证明的人开枪。
    【解决方案2】:

    根据 frast 的回答,您可以使用合适的 SetErrorMode 将该进程作为进程的 生成。此(可继承)设置确定哪些错误会导致弹出对话框 - 我在尝试为自动化测试应用程序实现完全相同的事情时发现了您的问题。

    为避免出现任何错误对话框,请使用

    SetErrorMode(
        SEM_FAILCRITICALERRORS 
        | SEM_NOALIGNMENTFAULTEXCEPT 
        | SEM_NOGPFAULTERRORBOX 
        | SEM_NOOPENFILEERRORBOX);
    

    注入可能是矫枉过正 - 最好使用包装进程。

    【讨论】:

    • 你能分享一个可以处理这个问题的包装进程吗?
    • “Wrapper”是一个进程/函数/方法的通用名称,其唯一目标是调用并随后清理另一个进程/函数/方法。您可以使用msdn.microsoft.com/en-us/library/windows/desktop/… 在 Windows 中创建子进程
    • 我明白了。如果子应用设置了SetErrorMode,我们仍然需要注入
    【解决方案3】:

    尝试将以下代码注入您的子进程:

    SetErrorMode(SEM_NOGPFAULTERRORBOX);
    

    在 MSDN 中查找SetErrorMode 的详细信息。

    在此处阅读有关注射技术的信息: Injective Code inside Import Table

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-29
      • 1970-01-01
      • 2010-09-12
      • 2018-04-08
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多