iPhone / iPad应用代码混淆 – 可能吗? 值得?

我已经研究了很多,不pipe是在所有的地方,还是谷歌search,但我似乎无法find一个直接的答案就iPhone / iPad应用程序编写的Objective-C代码混淆。

我的问题是这些:

  1. 有没有办法做到这一点? 如果是这样,怎么样?
  2. 这值得么?
  3. 当应用程序提交给他们时,苹果是否允许它,或者有问题?

Objective-C似乎没有代码混淆器。 但让我们假设一个确实存在。

只要不崩溃,苹果可能不会拒绝一个混淆的应用程序。 主要问题是:混淆的意义何在? 通常情况下,您想混淆代码以保护您的知识,例如,如果您的程序使用了复制保护,以便使其更难以发现潜在的黑客,或者如果您使用某种高级algorithm,则不希望业务竞争对手成为能够反编译它。

复制保护已经在iOS上完成。 尽pipe通过越狱可以复制和运行一个普通的应用程序,但我认为这样做的用户数量相当低(至less比“普通”计算机(如PC和Mac)低很多)。 你是否期望盗版这样一个大问题,你需要混淆?

如果你有重要的保护知识,那么混淆可能是值得的。 混淆有其不利之处:你不能再debugging你的混淆的应用程序。 崩溃报告将是无用的。

您可能也想阅读文章混淆cocoa 。

回到事实上,似乎没有混淆器:你可以做的是这个技巧:假设你有这样一个标题:

@interface MyClass : NSObject { } - (void)myMethod; 

你可以做一个便宜的混淆,像这样:

 #ifndef DEBUG #define MyClass aqwe #define myMethod oikl #endif @interface MyClass : NSObject { } - (void)myMethod; 

这样,你仍然可以在源代码中使用有意义的符号,但编译器会在不编译进行debugging时将其变成“垃圾”。

  1. 是的,你可以看看为Apple iOS或Contaxiom代码保护的EnsureIT
  2. 这取决于。 安全通常会带来复杂性,您必须在可用性之间进行权衡。
  3. 苹果应该没有任何问题(纠正我,如果我错了),我个人有几个应用程序使用代码混淆器。

除了早期的答案,现在有几个第三方工具提供了一定程度的混淆和完整性保护,包括:

  1. 阿尔山,
  2. Metaforic,
  3. Cryptanium

他们的能力各不相同,包括:

  1. 控制stream混淆例如,ARM指令stream被冗余指令损坏以试图隐藏代码的原始目的,
  2. 类和方法重命名 – 重命名您的方法和类为无意义的名称,虽然你必须小心,因为你可以轻松地破坏你的应用程序,因为Objective-C运行库期望find某些名称,
  3. stringencryption – 应用程序中的所有静态string都被encryption,插入代码以便在使用之前对string进行解密,以使静态分析变得更加困难
  4. 插入反debugging代码以中断通常的debugging器(不总是成功),
  5. 防篡改 – 通常build立一个保护二进制代码免于修改的校验和networking,
  6. Objective-C运行时保护 – 通常会检查obj-c注册的方法实现,以确保它们在应用程序中,而且没有“混杂”。

所有这些工具都非常昂贵,而且不是没有问题的,所以您真的需要一个需要高度完整性的应用程序才能考虑它们,例如银行业务或DRM非常重要。

对于这些types的应用程序,您还需要熟练的渗透testing人员来确保您的应用程序不会以其他方式公开,因为这些工具通常与使用它们的人员一样好,还有其他操作系统漏洞需要缓解工具不要地址。

应用程序的可执行文件已经由Appleencryption,应用程序沙箱的可执行代码段不可写入,因此您无法执行需要修改运行时代码的其他encryption。 目标C / C编译器的优化器通道已经创build了与原始源代码非常不同的东西。 使用更多的C和更less的目标C将显示较less的函数名称,因为方法名称embedded在可见的纯文本中,但C函数名称不是。 所以任何商业秘密types的代码都应该用普通的C语言编写,并且优化器一起编译。 您可以混淆应用程序包中embedded的任何WebKit Javascript或任何其他embedded式VM代码(只要解释的代码不会被下载)。

可能不是因为Objective-C编译出来的处理器指令,而不是被解释或编译为字节码,所以反编译的代码已经产生了相当模糊的结果。 混淆是你通常只有当你不得不分发你的代码的源代码时才需要的,就像在JavaScript这样的解释性语言中,为了甚至当你希望代码保持秘密的时候它也可以运行。