【问题标题】:Anti-debugging how to deal with library patching?反调试如何处理库打补丁?
【发布时间】:2012-10-29 08:13:39
【问题描述】:

有谁知道解决以下问题的标准技术:

  • 我想检测是否有调试器附加到我的程序(反调试)
  • 但是攻击者修补了我使用的系统调用/库

例如,在 iOS 上,sysctl() 函数可用于检测附加的调试器,但攻击者只需反汇编二进制可执行文件,找到 sysctl() 调用,并将其替换为自己的版本。

作为开发人员,我们如何处理这个问题?

我的平台是 iOS (iPhone) 和原生 Android (Android NDK)。

【问题讨论】:

  • 如果“攻击者”在模拟器中运行您的代码并使用它来单步执行代码怎么办?根本没有调试器...
  • 问题:用 sysctl() 会不会检测到模拟器中的单步执行?但是,我考虑记录关键代码之前和关键代码之后的时间。如果时间跨度很长,我可以断定程序正在调试中。但是,如果攻击者修补 time() 调用怎么办?这是原始发布问题的变体。

标签: iphone c debugging android-ndk


【解决方案1】:

完美检测调试器在逻辑上是不可能的。运行程序的机器的规格并没有指定特定的硅片或其他物理对象——它指定了机器的行为。 任何提供规范所描述行为的实现都是机器的实现。这包括在实现规范的物理处理器上执行程序,包括在实现规范的模拟器中执行程序,还包括人类阅读机器代码并在纸上实现机器。这些不是“只是”模拟;它们实际上是机器的实现。

当机器正确实现时,程序不可能确定机器没有正确实现,因为当然没有偏离规范。然而我们可以清楚地看到,其中一些机器的动作和状态完全可以被人类观察到,并且可以随意操纵。因此,逻辑上不可能总是检测到调试器的存在。

充其量,您可以使使用调试器变得令人讨厌,并且可以掩盖您这样做的方式。这可以阻止临时调查员,但不能阻止坚定的调查员。

【讨论】:

    【解决方案2】:

    混淆原生代码的黄金标准是 Skype,它已经有十多年没有被黑客入侵了。您可以查看http://www.blackhat.com/presentations/bh-europe-06/bh-eu-06-biondi/bh-eu-06-biondi-up.pdf 以获取 Skype 的一些混淆功能列表,例如机器代码的运行时解密、对调试器和虚拟机的抵抗、密码学和完整性检查的高级使用等。 但是你从外部来源知道的任何混淆技术对于代码攻击者来说都是已知的,所以你必须把自己的魔法放进去(而且总是有一个比你更聪明的攻击者)。

    结论:混淆原生代码只是给攻击者设置了一些障碍,而打破这些障碍只是时间和精力的问题。 避免这种情况的另一种方法是将所有密码保存在客户端-服务器系统的服务器端,使用成熟的客户端-服务器协议并开源客户端代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      • 2020-01-14
      相关资源
      最近更新 更多