iOS中的反编译可能性以及如何防止它们

时间:2013-07-29 08:30:08

标签: ios objective-c security assembly decompiling

我最近读到了关于iOS应用程序的反编译,现在我真的很关心它。如以下帖子(#1#2)中所述,可以对分发到App Store的iOS进行反编译。这可以通过越狱完成,我认为将应用程序从内存复制到硬盘。使用一些工具可以

  • 读出字符串(字符串工具)
  • 转储头文件
  • 逆向工程师到汇编代码

似乎无法对Cocoa代码进行逆向工程。

由于安全性是我创建的软件的一项功能,我希望防止不良用户重建我的安全功能(使用密钥加密或登录网站)。所以我提出了以下问题:

  1. 有人可以使用程序集重建我的保存和加密或登录方法吗?我的意思是他能理解究竟发生了什么(保存到哪个路径,使用哪个密钥等,哪个凭据是登录到哪个网站)?我没有装配理解它看起来像我的矩阵......
  2. 如何安全地使用无法用字符串读取或在汇编中读取的NSStrings?我知道可以对字符串进行模糊处理 - 但这仍然不安全,不是吗?

1 个答案:

答案 0 :(得分:27)

这是一个人们追逐多年的问题,任何有足够动力的技能人员都能找到方法找出你不想让他们发现的任何信息,如果这些信息一直存储的话在设备上。

如果没有越狱,可以使用购买或下载的二进制文件来反汇编应用程序。这是静态检查,并通过标准拆卸工具提供便利。虽然你需要一个足够好的工具来从链接器中添加符号,并充分理解方法调用,以便能够弄清楚正在发生的事情。如果您想了解其工作原理,请查看hopper,这是一个非常好的反汇编/反向工程工具。

特别是对于您的安全日志,如果您有一个积极的攻击者,则会遇到更大的问题:基于系统的中间人攻击。在这种情况下,攻击者可以清理系统使用的网络代码,并查看通过标准网络发送的任何内容。因此,您不能依赖于能够将任何形式的未加密数据发送到操作系统或库级别的“安全”管道中,并且期望它不会被看到。在将数据导入管道之前,您至少需要加密(即,您不能依赖于将任何纯文本发送到标准SSL库)。您可以编译自己的一组SSL库并将它们直接链接到您的应用程序,这意味着您不会随着时间的推移获得任何系统性能和安全性增强,但您可以根据需要手动升级SSL库。您也可以创建自己的加密,但这充满了潜在的问题,因为有动机的黑客可能会发现在那时攻击您的有线协议更容易(像SSL这样的公开测试协议通常比您自己可以放在一起的更安全,除非你是一位有着多年安全/加密经验的特别有天赋的开发人员。)

但是,所有这些都假定您的攻击者有足够的动力。如果你删除了悬而未决的水果,你可以防止一个随意的黑客简单地尝试找出你的系统。有些事情要避免:

  • 存储加密任一侧的纯文本加密密钥
  • 将密钥存储在特定命名的资源中(名为serverkey.text的文件或存储在名称中包含key的plist中的密钥都是经典的)
  • 尽可能避免使用简单密码

但是,最重要的是创建系统,其中存储在应用程序中的密钥(如果有的话)本身没有用户必须自己输入的信息(直接或间接通过诸如OAUTH之类的系统)。如果没有与可信任的用户进行某些交互,服务器就不应该信任客户端进行任何重要的操作。

Apple的Keychain提供了存储身份验证令牌的好地方,例如在OAUTH序列期间检索到的令牌。 API有点难以使用,但系统很稳定。

最后,问题在于,无论你做什么,你只是在努力完成打击你的措施所需的工作量。攻击者可以控制等式中的所有重要部分,因此它们最终会击败设备上的任何内容。您将需要决定为保护客户端,保护服务器和监控滥用行为需要付出多少努力。由于攻击者拥有设备上的所有卡,因此更好的方法是在服务器上实现可以增强目标的方法。