有谁知道解决以下问题的标准技术:
- 我想检测,如果调试器附加到我的程序(反调试)
- 然而,攻击者修补了我使用的系统调用/库
例如,在 iOS 上,sysctl() 函数可用于检测附加的调试器,但攻击者只需反汇编二进制可执行文件,找到 sysctl() 调用,并用他自己的版本替换它们。
作为开发人员,我们如何处理这个问题?
我的平台是 iOS (iPhone) 和原生 Android (Android NDK)。
有谁知道解决以下问题的标准技术:
例如,在 iOS 上,sysctl() 函数可用于检测附加的调试器,但攻击者只需反汇编二进制可执行文件,找到 sysctl() 调用,并用他自己的版本替换它们。
作为开发人员,我们如何处理这个问题?
我的平台是 iOS (iPhone) 和原生 Android (Android NDK)。
完美检测调试器在逻辑上是不可能的。运行程序的机器的规格并没有指定特定的硅片或其他物理对象——它指定了机器的行为。任何提供规范描述的行为的实现都是机器的实现。这包括在实现规范的物理处理器上执行程序,包括在实现规范的模拟器中执行程序,还包括人类阅读机器代码并在纸上实现机器。这些不是“只是”模拟;它们实际上是机器的实现。
当机器正确实现时,程序不可能确定机器没有正确实现,因为当然没有偏离规范。然而我们可以清楚地看到,其中一些机器的动作和状态完全可以被人类观察到,并且可以随意操纵。因此,在逻辑上不可能总是检测到调试器的存在。
充其量,您可以使使用调试器变得令人讨厌,并且可以掩盖您这样做的方式。这可以阻止临时调查员,但不能阻止坚定的调查员。
混淆本机代码的黄金标准是 Skype,它已经有十多年没有被黑客入侵了。您可以查看http://www.blackhat.com/presentations/bh-europe-06/bh-eu-06-biondi/bh-eu-06-biondi-up.pdf以获取 Skype 的一些混淆功能的列表,例如机器代码的运行时解密、对调试器和虚拟机的抵抗、密码学和完整性检查的高级使用等。但是你从外部来源知道的任何混淆技术对于代码攻击者来说都是已知的,所以你必须把自己的魔法放进去它(总是有一个比你更聪明的攻击者)。
结论:混淆原生代码只是给攻击者设置了一些障碍,而打破这些障碍只是时间和精力的问题。避免这种情况的另一种方法是将所有密码保留在客户端-服务器系统的服务器端,使用成熟的客户端-服务器协议并开源客户端代码。