【问题标题】:How to debug a crash in a process containing anti-debugger measures如何在包含反调试器措施的进程中调试崩溃
【发布时间】:2012-04-02 13:39:13
【问题描述】:

我们的应用程序出现崩溃,无法调试,因为我们的一位合作伙伴认为使用真正可怕“CodeMeter”来加密他们的 DLL 是合适的。 CodeMeter 许可阻止所有尝试调试包含 CodeMeter 加密 DLL 的应用程序,甚至似乎导致从未处理的异常过滤器调用的 MiniDumpWriteDump 失败(此技术在没有加载此 DLL 的情况下有效)。只有在将加密的 DLL 加载到进程中时才会发生崩溃。

我正在疯狂地尝试调试它并确定是否是加密的 DLL 崩溃了,如果是,我如何向我们的合作伙伴提供足够的诊断信息来解决这个问题。

任何建议 - 也许我可以从未处理的异常过滤器中调用一些手动堆栈和模块遍历代码?

CodeMeter 是否具有构建设置,允许我们的合作伙伴生成仍然加密和许可但不会如此激进地破坏调试的构建?

为了以防万一有任何疑问,我并不是要破解许可,只是诊断这次崩溃。

【问题讨论】:

  • CodeMeter 似乎也禁用了其他 DbgHelp.dll 功能。 SymInitialize 在存在此 CodeMeter 加密 DLL 时也会失败。这让我想知道这个有毒 CodeMeter 软件偷偷选择破坏核心操作系统的哪些其他部分......
  • 我找到了一些使用 CaptureStackBacktrace 遍历堆栈的示例代码。这仅显示异常过滤器的调用堆栈,而不是异常本身。
  • 现在已经设法使用 __try __except 从加密的 DLL 中捕获并记录异常详细信息。尽管使用 CaptureStackBacktrace,仍然无法从 SEH 异常过滤器中获取有效的堆栈跟踪。

标签: visual-studio-debugging postmortem-debugging


【解决方案1】:

我使用了一些运行良好的stack walking code,可以通过传入传递给异常过滤器的 CONTEXT 记录从 SEH 或未处理的异常过滤器中调用。

堆栈中的地址和前几个异常参数中的潜在地址可以使用SymFromAddr in DbgHelp 解释,包括模块句柄。添加模块文件名和模块句柄的log,用于解释堆栈地址与哪些DLL相关。

此特定崩溃是 Visual C++ 异常。通过使用 SymFromAddr 查找异常参数之一的地址来揭示异常的类型。

Raymond Chen 的博客有一些来自异常参数的 finding the type of a Visual C++ exception 代码,但由于某种原因(可能是我自己的错误),我无法让它为我工作。

【讨论】:

    猜你喜欢
    • 2011-10-03
    • 2012-03-15
    • 1970-01-01
    • 2022-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    相关资源
    最近更新 更多