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

Posted

技术标签:

【中文标题】iOS中的反编译可能性以及如何防止它们【英文标题】:Decompilation possibilities in iOS and how to prevent them 【发布时间】:2013-07-28 23:07:38 【问题描述】:

我最近阅读了有关反编译 ios 应用程序的信息,我现在非常担心它。如以下帖子(#1 和 #2)所述,可以反编译分发到 App Store 的 iOS。这可以通过越狱来完成,我认为将应用程序从内存复制到硬盘。使用一些工具可以

读出字符串(字符串工具) 转储头文件 对汇编代码进行逆向工程

似乎不可能对 Cocoa 代码进行逆向工程。

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

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

【问题讨论】:

无需越狱即可进行逆向工程,是的,您可以在代码中编写的任何方法都可以被有足够时间的人理解。使用 SDK 提供的方法,因为它们的源代码不会直接在您的应用程序中,但不要梦想太多,这不是 100% 安全的方式,所有可以读取的内容都可以复制,所有可以复制的内容复制的可以破解。 所以当我使用 SDK 类方法(例如 [NSString stringWithFormat:...] 或用于保存文件时,这不会直接在程序集中可见?我的意思是任何应用程序都包含基础框架... 当你使用 [NSString stringWithFormat:...] 时,可见的是对 stringWithFormat 的调用,不可见的是该方法背后的内容 => 我们知道调用的是什么,而不是如何调用在它后面完成 好的。但我认为能够进行逆向工程的人也知道 SDK 方法背后的内容(或者他可以使用文档找到)。几乎不可能进行 SDK 方法调用,只有开发人员知道它的结果? 【参考方案1】:

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

无需越狱,就可以使用购买或下载的二进制文件来反汇编应用程序。这是静态检查,可使用标准拆卸​​工具进行检查。尽管您需要一个足够好的工具来从链接器中添加符号并充分理解方法调用,以便能够梳理出正在发生的事情。如果您想了解它的工作原理,请查看hopper,它是一个非常好的反汇编/逆向工程工具。

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

但是,所有这些都假设您的攻击者有足够的动机。如果您移除了唾手可得的果实,您可能能够防止临时黑客进行简单的尝试来破解您的系统。需要避免的一些事情:

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

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

Apple 的 Keychain 提供了一个存储身份验证令牌的好地方,例如在 OAUTH 序列中检索到的那些。 API 有点难用,但系统很可靠。

最后,问题在于,无论你做什么,你都只是在加大工作量,才能打败你的措施。攻击者可以控制方程式的所有重要部分,因此他们最终会击败设备上的任何东西。您将需要决定在保护客户端、保护服务器和监控滥用方面付出多少努力。由于攻击者掌握了设备上的所有卡片,因此您更好的方法是可以在服务器上实施以增强您的目标的方法。

【讨论】:

谢谢!我还有一些关于登录和 SSL 加密的问题: 1. 你的意思是我应该先加密数据,然后让操作系统执行与服务器的安全连接 (HTTPS/SSL) 并传输数据,对吗?然后我仍然有一个问题,我需要在传输之前存储/硬编码该加密的加密密钥...... 2. 我如何才能编译我自己的 SSL 库集?我可以在网络上的某个地方找到关于此的好信息吗?当我包含我自己的 SSL 库时,攻击者不能也反编译它们吗? 我在答案中添加了更多信息。要回答您的具体问题:1)如果您担心这种攻击,那么您只需将加密信息传递给操作系统。这可能意味着静态编译的 SSL 库链接到您的应用程序中,或者在将数据发送到系统库之前对其进行加密。 2. 要编译您自己的 SSL 库,请使用 OpenSSL 或类似的流行工具,然后静态编译并链接到您的应用程序。我也不是真的提倡这一点,但它会混淆 MIM 攻击的内容(但无助于反汇编攻击)。 作为记录,有几个库可以更容易地使用 Apple 的钥匙串,例如 Sam Soffe 的 SSKeychain

以上是关于iOS中的反编译可能性以及如何防止它们的主要内容,如果未能解决你的问题,请参考以下文章

有位好心人那里有VS.net的反编译工具

java的反编译怎么使用,说具体点?

实用:如何防止你的 jar 被反编译?

java反编译器怎么用?

安卓apk上的反逆向工程

Java jar 如何防止被反编译?代码写的太烂,害怕被人发现