为什么要进行代码混淆?
源码面前,了无秘密。
在 iOS 开发中,很多工程师都会对自己的代码成果进行混淆,除了为了掩藏那些怕为人知的蹩脚代码外,最主要的还是为了防止别人逆向截获到代码逻辑,通过 hook 注入等手段进行控制和篡改,这样导致搭建的代码逻辑被得以窥视,程序的安全防线就会崩溃,防线之下就全是危险了。
面对如此大的风险,我们能做什么加以防范呢?
答案:混淆你的工程。
代码混淆是故意模糊源代码的行为,目的是使源代码变得难以阅读和理解其逻辑,如果又将所有注释删除的话,那通过混淆之后代码的可读性将更加降低,几乎无法得出程序的真实语义,应用程序分析难度就会变得很大,这样一定程度上阻止了逆向工程。 而源代码经过混淆之后,尽管与混淆之前相比,样子虽已经变成了“熟悉的陌生人”,但是它在功能上又百分百无异于原始代码。
无论是在做商业应用程序还是MJ包开发以应对苹果4.3等审核条款,代码混淆都变得必不可少,已经是程序开发收尾一环中的标配。
一般混淆方案
常见的方案一般有:
1.文件名混淆:
2.字符串加密:对程序中所使用到的字符串进行加密,防止逆向通过字符串定位到我们的业务代码;
3.花指令,通过构造特殊的指令使得反编译器出错,烦扰反编译的进行;
4.重写代码的部分逻辑或修改源码的各种行文格式;
5.类名、变量/属性名、函数/方法名混淆:将工程中类名、变量/属性名、函数/方法名等进行替换,替换目的追求代码逆向之后难以阅读逻辑;
Obfuscator for iOS - 混淆利器
值得一提的是,在 iOS 开发中,如果最终是为了上架 AppStore,在提交审核之前,不应当简单地使用无意义字符串进行替换这些重要代码元素。因为根据大量提包过往的经验表明:苹果禁止提交审核的包中出现这种故意混淆代码的行为。
如果我们按照市面上的混淆软件进行这种“无脑混淆”的话,大概率会吃到苹果的好人卡,我们的混淆要有目的性,不是为了追求彻彻底底的混淆,而是为了追求最有价值的混淆,在极致和价值中保持克制和平衡,追求价值最大化。
这就需要一个更符合苹果审核政策的混淆方案,在这里向大家推荐一款专门针对 iOS 开发、 majia、定制包等人员使用的混淆软件:Obfuscator,软件最近刚上线,注册加群即可免费试用,试用结束后可私聊群主进行购买。
软件截图:在这里贴下 QQ 的讨论群 :782314620
群里面向 iOS 开发、苹果审核解决方案讨论、定制包、开发者账号、tf签等等问题的交流探讨,欢迎加入进来吧。
注 : 加群申请需验证信息,请直接填写本文链接地址即可。
前面提到了 Obfuscator 是针对 iOS 开发人员的混淆软件,为了规避苹果审核时可能被拒的各种风险如代码重复、刻意混淆等,Obfuscator 在混淆方面保持克制的同时,在有价值的混淆选项中进行挖掘完善,目前有以下混淆选项来防范被拒:
- 目录/文件名混淆:
- 工程目录结构的混淆:重新调整工程目录的逻辑结构,将其打乱混排,更进一步地让源码可读性降到最低。
- 工程名/工程uuid混淆:
- 图片等资源类的混淆:压缩、修改图片的感知 hash 值;
- 类、变量/属性、函数/方法混淆:内置了四十个苹果分类关联性强的词库进行匹配,避免无意义字符串的出现,软件的语义化还在完善中;
- 注入属性/方法:被注入的属性和方法都真实的被调用,避免成为垃圾代码;
- 注入混淆类:真实调用,不做垃圾类;
- 对注入的属性/方法进行调用:强行关联源代码中的对象,真实调用被注入的属性方法,属性、参数、返回值等都有被真实使用;
这个混淆工具在应对苹果机审时的 全量扫描二进制包以检测相似度
的问题上,已经内部测试提交AppStore应用 100+ 次,除去开发者账号的权重问题之外,无一被 4.3条款 驳回。当然,由于苹果的审核机制不透明,涉及到MJ包提交的网络环境、账号权重相似性关联的问题,就需要由MJ包开发者自己去规避了。