本文方法已过期,不建议读者使用,等有新的方案后,再更新文章。
前段时间, bang神 一手创建的iOS热修复框架被苹果强制下线的消息,真是在技术圈里让很多小伙伴们坐不住了,这个15年就问世的框架具备很多之前的类似框架所不具备的优点,更加的小巧便捷,并且处于持续维护中,不仅如此,还由此成为了一个生态圈,bang神还为此开发了oc转js的代码转换器、可以自动提示的JSPatchX插件、以及基于这个技术的JSPatchPlatform平台。总之让大伙可以很方便的进行patch。
然而总有一些人想用它做坏事,以至于苹果爸爸震怒了,不再让人使用这个框架,所有集成了jspatch的软件都被强制下线,在这个风头下,很多人就开始唱衰JSPatch,典型代表就是那位所谓 有故事的
卓同学的文章,写的好像JSPatch已经死掉了一样。我想说你丫的,以后别用!
然而相信一句话,那就是方法总比困难多。苹果的检测无非是机器检测,扫描关键字而已。所以我们就做了最简单的混淆方案。
首先是要移除掉原来项目里的JSPatchPlatform平台,去github上下载JSPatch源码,将其中的三个重要文件拖入你的项目中,分别是JSEngine.m、 JSEngine.h、 JSPatch.js。然后对这三个类重新命名,最好不要出现关于patch,engine之类的字眼,而是用一些根本不会联想到jspatch的词语来命名。改个类名是容易的,但是要想把里面的所有方法都进行修改的话,可能工作量会比较大一些,于是我们又参考了念茜的一篇文章对代码的方法名做了混淆。混淆后在通过class-dump工具检测头文件如下,已经分不出我们用了什么了。
其中有一点要注意的是,那就是不能按照念茜的博客里讲的,将codeObfuscation.h文件放在pch文件里,因为这个文件每次编译都会改变,放在pch里的话,会导致每次都要重新编译所有的文件,降低程序启动的速度,可以哪个文件需要就放在哪个文件里,这是需要注意的一点。
既然我们用的是源码,那就要自己做代码下发的工作了,并且安全性也要有保障,为此我们做了一个上传代码的后台mac程序,里面运用RSA非对称加密对代码进行了加密,将加密后的代码字符串上传服务器,app端,在进行相应的解密就可以了,安全性可以媲美JSPatchPlatform平台。关于如何编写mac程序,这里不多讲,如何进行RSA非对称加密,也不在本篇文章的讲述范围内,读者可以到这里看如何自己动手做一个上传JSPatch补丁代码的Mac应用,最后附图一张mac程序的大致样子。
至此就完成了JSPatch的混淆工作,最终我们也顺利地通过了苹果的审核。后来看到bang神的一篇文章,里面提到的思路跟本文大致相似。
最后附上本文的demo,
下载下来后运行demo,会看到控制台输出如下提示,说明就已经成功了。
使用的时候,可以将codeObfuscation.h、confuse.h、func.list三个文件挪到根目录下面,然后再target-BuildPhases 中添加RunScript,在RunScript中输入/bin/sh $PROJECT_DIR/confuse.sh即可。
注意:每次编译程序的时候,codeObfuscation.h文件都会发生变化,因为每次都会生成不同的随机字符串,我们在提交代码的时候忽略掉这个文件还有一个symbols文件即可。另外使用的时候,建议对类名与方法名重新定义,而尽量不要采用demo中的类名。
最后附一个小广告,开通了个人的公众号,不仅仅是程序猿,公众号接入了图灵机器人,你可以跟它对话哦。这是一个旨在分享知识、技术、思绪、情怀的公众号,包括但不局限于逗比。。
个人公众号二维码.jpg
网友评论