如何加密或混淆Objective-C代码?

26

可能是重复问题:
iPhone/iPad应用程序代码混淆——是否可行?值得吗?

我花了很多时间去研究这个问题,但是我找不到完美的答案。这就是为什么我决定在这里提出我的问题。我有一个iPhone应用程序,想要加密代码以防止被class-dump或otool工具(用于从可执行文件中转储头文件)窃取。我想知道是否有任何方法可以加密源代码或混淆源代码?


为什么?如果您告诉我们您真正想要做什么,可能会有更好的方法。 - JeremyP
我看到了class-dump工具可以轻松地转储头文件并查看函数/方法签名。我想加密头文件(转储出的头文件应该是加密的)或在我的代码中实现代码混淆。这就是我需要实现的。希望你能得到更多信息。 - Johny_568
@Black Frog:我也尝试过那种方法,但是对我没用。:( - Johny_568
类转储工具不会转储头文件的内容,它们会以人类可读的形式转储已编译的接口。 - JeremyP
@Jeremy:但无论如何,它会打印出我们在头文件中声明的签名,对吗? - Johny_568
@Johny_568:是的,但如果你想要动态绑定,那是无法避免的。不过,这个问题无关紧要,因为从应用商店下载的应用程序显然是加密的。 - JeremyP
3个回答

16

起初看起来比较简单,但实际上要复杂得多。任何篡改方法名称的工具都有可能对以下方面造成影响:

  1. KVC兼容性
  2. 动态生成选择器的使用
  3. Nib文件兼容性
  4. 协议一致性
  5. 方法继承

混淆仅是另一层要处理的内容;通常混淆很容易被还原。不可能真正地对您的类进行“加密”,因为Objective-C运行时和Cocoa框架不知道如何解密它。任何决心足够的人最终都会弄清楚您的程序如何工作。


4
建立防拷贝的人通常会得到报酬,而移除防拷贝的人通常不会。最终,如果你做得好,翻转者可能会因为要理解或对抗你的保护措施需要太多时间而放弃。但是,你说得对,这不是最终的解决方案,只是最好的方案。 - jimpic

8
实际上,您可以使用专业的第三方工具来提供一些混淆和篡改保护。我知道有两家公司提供此类工具或服务:Arxan和irDato。
这些工具对于小型开发人员来说并不便宜或容易获得,但如果您正在为大型企业开发,则应该考虑使用它们。
混淆是通过改变代码路径并添加冗余指令来使试图反向工程代码的人感到困惑。篡改保护是通过在代码中添加校验和并在函数内嵌入校验和检查来完成的。您可以创建一个相互依赖的校验和网络,使其极难绕过。还有其他一些事情可以做,但您确实需要与该领域的专家交谈。
此外,针对之前的回答,苹果并未加密二进制文件,只是对其进行签名。在越狱设备上轻松进行反向工程和修改应用程序二进制文件。

6
苹果确实会加密通过应用商店分发的二进制文件。请参考《Hacking and Securing iOS Applications》第156-162页。然而,这种加密很容易被移除。 - funroll

-2

显然,根据这个答案,苹果公司对所有iPhone应用程序的iPhone二进制文件进行加密处理。

我建议不要再担心这个问题了。


我错过了他提到这是一个iPhone应用程序的部分。 - dreamlax
@dreamlax:是的,很容易做到。我会添加iOS标签。 - JeremyP
15
通过像 clutch 这样的工具,在越狱设备上很容易去除加密。 - funroll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接