反调试如何处理库补丁?

时间:2012-10-29 08:13:39

标签: iphone c debugging android-ndk

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

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

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

我们作为开发者如何处理这个问题?

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

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:1)

混淆本机代码的黄金标准是Skype,它已经被黑客攻击了十多年。您可以查看http://www.blackhat.com/presentations/bh-europe-06/bh-eu-06-biondi/bh-eu-06-biondi-up.pdf以获取Skype的一些混淆功能列表,例如机器代码的运行时解密,对调试器和虚拟机的阻力,加密和完整性检查的高级使用等。 但是,任何来自外部源的已知的混淆技术对于代码攻击者来说都是已知的,因此您必须将自己的魔法放入其中(并且始终存在比您更聪明的攻击者)。

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