【问题标题】:third party library with anti-debug code带有反调试代码的第三方库
【发布时间】:2013-06-04 10:43:10
【问题描述】:

我们的程序使用第三方库(用 c++ 编写的桌面应用程序),库受到反调试代码、加密/解密层、垃圾代码、触发异常和其他反调试技术的保护,这使得它不可能在调试模式下工作(在 Visual Studio 2010 上)。

我在库中只使用了两个函数,其余的代码越来越大,但是因为我不能在调试模式下运行它,所以开发起来越来越难。所以我的问题是将这个库与我的应用程序分开并使用调试支持,但仍然能够使用这两个函数,因为我们的应用程序需要它们,这可能是一种实用的方法。

【问题讨论】:

  • 您可以尝试创建两个函数来返回一组数据的已知结果。然后,您可以使用数据、不使用库并使用调试模式测试应用程序。
  • 其实我已经试过了。我们正在使用这个第三方库来保证安全,数据不会自我重复,因此无法创建一些测试数据并临时使用它。我真的需要将它与应用程序分开。

标签: c++ debugging visual-c++ visual-studio-debugging


【解决方案1】:

如果您需要使用库的真实行为进行调试(即无法模拟它),我建议您将库封装在一个小的可执行文件中,通过某种进程间通信(ZeroMQ ...)。

在您的软件中,实现一个包装器,该包装器发布一个看起来像原始库的接口并通过您的进程间通信调用可执行文件。

由于库位于不同的可执行文件中,它不会阻止您调试程序。

【讨论】:

  • 其实这听起来是个不错的解决方案,您对性能有何看法?还有你对使用 boost 进行进程间通信有什么看法?你能和ZeroMQ比较一下吗?
  • 速度是一个相对概念,它取决于你的项目。如果您关心绝对性能,则应仅出于调试目的实施此解决方案。 ZeroMQ 的运行速度非常快,它可以使用 IPC 代替套接字。但是,尽管速度可以快,但它仍然比直接调用慢。我从未使用过 boost 进程间通信,所以无法比较。
【解决方案2】:

如果您只使用受保护库中的少数函数,您可以创建自己的库,其接口与受保护库中的相同,并使用一些存根数据来实现这些函数。

【讨论】:

  • 存根数据是什么意思?我没有尝试创建具有相同界面的新库,但在我看来,它会产生与反调试代码相同的结果。
猜你喜欢
  • 2017-06-27
  • 2012-03-29
  • 2018-06-05
  • 2019-01-26
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多