如何在包含反调试器措施的进程中调试崩溃

问题描述:

我的应用程序崩溃了,我无法调试,因为我们的一个合作伙伴已经认为适合使用真正的可怕的'CodeMeter'加密他们的DLL。 CodeMeter许可可防止所有尝试调试包含CodeMeter加密DLL的应用程序,甚至似乎会导致从未处理的异常过滤器调用的MiniDumpWriteDump失败(此技术在未加载此DLL的情况下工作)。只有当加密的DLL被加载到进程中时才会发生崩溃。如何在包含反调试器措施的进程中调试崩溃

我疯了,试图调试这个,并确定它是否是加密的DLL崩溃,如果是的话,我如何能够提供足够的诊断信息给我们的合作伙伴解决这个问题。

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

CodeMeter是否有构建设置,允许我们的合作伙伴生成一个仍然是加密和授权的构建,但不会如此积极地破坏调试?

只要有疑问,我不想破解授权,只是诊断这次崩溃。

+0

它看起来像CodeMeter也禁用其他DbgHelp.dll功能。在CodeMeter加密DLL的存在下,SymInitialize也会失败。它让我想知道核心操作系统的其他部分__poisonous__ CodeMeter软件已经悄悄地选择破坏... – persiflage 2012-04-02 15:49:27

+0

我发现了一些示例代码来使用CaptureStackBacktrace来堆栈。这只显示异常过滤器的调用堆栈,而不是异常本身。 – persiflage 2012-04-02 15:52:11

+0

现在已经设法使用__try __except捕获并记录来自加密DLL的异常详细信息。尽管使用CaptureStackBacktrace,仍然无法从SEH异常过滤器获取有效的堆栈跟踪。 – persiflage 2012-04-05 09:23:19

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

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

这个特殊的崩溃是一个Visual C++异常。通过使用SymFromAddr查找其中一个异常参数的地址来揭示异常的类型。

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