iPhone / iPad应用程序代码混淆 - 可能吗?值得?

时间:2011-04-05 18:45:05

标签: iphone ipad obfuscation store

我已经研究了很多,无论是在SO还是google-ing到处,但我似乎无法找到关于iPhone / iPad应用程序的代码混淆的直接答案目标C

我的问题是这些:

  1. 有办法吗?如果是这样,怎么样?
  2. 值得吗?
  3. 当应用程序提交给他们时,Apple是允许它还是有问题?

5 个答案:

答案 0 :(得分:57)

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

只要它没有崩溃,Apple可能不会拒绝混淆的应用程序。主要问题是:混淆的重点是什么?通常,您希望对代码进行模糊处理以保护您的知识,例如,如果您的程序使用复制保护,您希望使潜在的破解者更难,或者如果您使用某些高级算法,则不希望业务竞争对手成为能够反编译它。

iOS上已经完成了复制保护。虽然通过越狱可以复制和运行普通应用程序,但我会说实际执行此操作的用户数量相当低(至少比PC和Mac等“普通”计算机低很多)。您是否认为盗版是一个需要混淆的大问题?

如果你确实有重要的知识要保护,那么混淆可能是值得的。混淆有其缺点:您无法再调试混淆的应用程序。崩溃报告将毫无用处。

您可能还想阅读文章Obfuscating Cocoa

回到事实上似乎没有混淆器:你可以做的就是这个伎俩:说你有这样的标题:

@interface MyClass : NSObject {
}

- (void)myMethod;

你可以这样做一个廉价的混淆:

#ifndef DEBUG
#define MyClass aqwe
#define myMethod oikl
#endif

@interface MyClass : NSObject {
}

- (void)myMethod;

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

答案 1 :(得分:33)

  1. 是的,您可以查看EnsureIT for Apple iOSContaxiom Code Protection
  2. 这取决于。安全性通常会带来复杂性,您必须在可用性之间取得平衡。
  3. Apple应该没有任何问题(如果我错了,请纠正我),而且我个人很少有使用代码混淆器的应用程序。

答案 2 :(得分:13)

除了早先的答案之外,现在有几个第三方工具可以提供某种程度的混淆和完整性保护,包括: -

  1. 阿尔山,
  2. Metaforic,
  3. Cryptanium
  4. 它们的功能各不相同,包括: -

    1. 控制流混淆,例如ARM指令流被冗余指令破坏,试图隐藏代码的最初目的,
    2. 类和方法重命名 - 将您的方法和类重命名为无意义的名称,尽管您必须小心使用它,因为您可以轻松破坏您的应用程序,因为Objective-C运行时期望找到某些名称,
    3. 字符串加密 - 应用程序中的所有静态字符串都已加密,并且在使用之前插入代码以解密字符串,以便更加难以进行静态分析
    4. 反调试 - 插入代码以破坏常用调试器(并非总是成功),
    5. 防篡改 - 通常构建一个校验和网络,以保护二进制代码不被修改,
    6. Objective-C运行时保护 - 通常检查obj-c注册的方法实现,以确保它们在应用程序中并且没有被“调配”。
    7. 所有这些工具都非常昂贵且并非没有问题,所以你真的需要一个需要高度完整性的应用程序才能考虑它们,例如:银行业或DRM非常重要的地方。

      对于这些类型的应用程序,您还需要熟练的渗透测试人员,以确保您的应用程序不会以其他方式暴露,因为这些工具通常只能与使用它们的人一样好,并且还有其他操作系统漏洞需要缓解工具没有解决。

答案 3 :(得分:3)

应用程序的可执行文件已由Apple加密,并且应用程序沙箱的可执行代码段不可写,因此您无法执行需要对运行时臂代码进行修改的其他加密。 Objective C / C编译器的优化器传递已经创建了与原始源代码截然不同的东西。使用更多C和更少的Objective C将显示更少的函数名称,因为方法名称嵌入在可见纯文本中,但C函数名称不是。因此,任何商业机密类型代码都应该用普通的C编码,并且在优化器编译的情况下进行编译。您可以混淆应用程序包中嵌入的任何webKit Javascript或任何其他嵌入式VM代码(只要未下载解释的代码)。

答案 4 :(得分:-7)

可能不是因为Objective-C编译出处理器指令而不是被解释或编译成字节代码,因此反编译代码已经产生了相当模糊的结果。当您需要分发代码源(例如JavaScript等解释性语言)时,通常只需要进行模糊处理,以便即使您希望代码保密也可以运行。