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

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

  • 读出string(string工具)
  • 转储头文件
  • 反向工程到汇编代码

似乎无法逆向工程到Cocoa代码。

由于安全性是我创build的软件的一个function,我想防止不好的用户重build我的安全function(使用密钥encryption或login到网站)。 所以我想出了以下问题:

  1. 有人可以重新组装我的保存和encryption或login方法吗? 我的意思是他能明白究竟到底发生了什么(保存在哪个path上,哪个键被使用等等,什么凭证是login到哪个网站的)。 我没有大会的理解,它看起来像我的matrix…
  2. 如何安全地使用不能用string读出或在程序集中读取的NSStrings ? 我知道可以对string进行混淆,但是这还不够安全,不是吗?

这是人们多年来一直追逐的问题,任何有足够积极性的技能的人将能够find方法来找出你不想让他们发现的任何信息,如果这些信息被存储在设备上。

如果没有越狱,可以使用购买或下载的二进制文件反汇编应用程序。 这是静态检查,并通过标准的拆卸工具来促进。 虽然你需要一个足够好的工具来添加链接器中的符号,并充分理解方法调用,以便能够梳理出发生了什么。 如果你想了解它是如何工作的,请检查漏斗 ,这是一个非常好的拆卸/反向工程工具。

特别是对于您的安全login问题,如果您有动机的攻击者,则会遇到更大的问题:基于系统的man-in-the-middle攻击。 在这种情况下,攻击者可以提取系统使用的networking代码,并查看通过标准networking发送的任何内容。 因此,您不能依赖于能够将任何forms的未encryption数据发送到操作系统或库级别的“安全”pipe道,并期望不被看到。 至less需要在将数据导入pipe道之前进行encryption(即,不能依赖将任何纯文本发送到标准SSL库)。 您可以编译自己的一组SSL库,并将它们直接链接到您的应用程序,这意味着您不会随着时间的推移获得任何系统性能和安全性增强,但是您可以根据需要手动升级您的SSL库。 你也可以创build你自己的encryption,但是这充满了潜在的问题,因为有动机的黑客可能会发现攻击你的有线协议在这一点上更容易(像SSL这样的公开testing的协议通常比你可以把自己扔在一起更安全,除非你是一个特别有天赋的开发者,拥有多年的安全/encryption经验)。

但是,这一切都假定你的攻击者有足够的动机。 如果你移除低悬的水果,你或许可以防止偶然的黑客简单地尝试搞清楚你的​​系统。 有些事情要避免:

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

但是,最重要的是创build系统,其中存储在应用程序中的密钥(如果有的话)在没有用户必须自己input的信息(直接或通过诸如OAUTH的系统间接input)的情况下是无用的。 服务器不应该信任客户端进行任何重要的操作,而不必与可信的用户进行交互。

苹果的钥匙串提供了一个存储authentication令牌的好地方,比如在OAUTH序列中检索的令牌。 该API是有点难以处理,但系统是坚实的。

最后,问题是不pipe你做什么,你只是把赌注放在打败你的措施所需的大量工作上。 攻击者可以控制等式中的所有重要部分,所以他们最终将打败设备上的任何东西。 您将需要决定为保护客户端付出多less努力,保护服务器和监视滥用情况。 由于攻击者拥有设备上的所有卡,所以更好的方法将是可以在服务器上实现的方法,以增强您的目标。

Interesting Posts