混淆代码是为了防止别人反编译代码之后,根据函数名或者变量名来窥探你的app,从而了解app的内部实现。
在代码混淆之前,使用class-dump进行逆向,可以看出逆向出了所有的属性和方法,如图:
混淆的原理
这里使用的混淆的原理是,用一串随机生成的字符串来替换相应的函数名和变量名
如何实现混淆?
以下混淆方式通用于OC和swift,纯OC的项目可以使用已经封装好的ios-class-guard https://github.com/Polidea/ios-class-guard
第一步:在相应的项目工程下新建一个confuse.sh 和 func.list文件
$ cd /Users/cafei/Desktop/SwiftTest
$ touch confuse.sh
$ touch func.list
第二步:将新建的两个文件拖到项目工程中
第三步:将以下脚本拷贝到刚新建的confuse.sh文件中
(此脚本源头来源于https://blog.csdn.net/yiyaaixuexi/article/details/29201699)
以下是代码截图,复制黏贴confuse.sh文本请见https://www.jianshu.com/writer#/notebooks/13159521/notes/31357519
以上是代码截图,复制黏贴confuse.sh文本请见https://www.jianshu.com/writer#/notebooks/13159521/notes/31357519
第四步:新建一个.pch文件并添加相应的配置(如果项目中已经存在pch文件则不需要再新建,直接使用即可)
第五步:添加Run Script,并写入脚本 $PROJECT_DIR/confuse.sh
第六步:给confuse.sh文件添加权限
$ cd /Users/cafei/Desktop/SwiftTest
$ chmod 755 confuse.sh
此时build项目工程,如果报错"CodeObfuscation.h" file not found
解决方案:
(1)将pch文件中刚添加的头文件注释掉,如图
(2)再次build项目工程,发现可以编译成功了
(3)将pch文件中刚注释掉的头文件再打开,再次build,就可以编译成功了
第五步:在func.plist文件中配置需要混淆的函数名和变量名
假设我现在需要混淆LoginViewController文件中的部分函数名和变量名,如图配置即可
第六步:编译项目工程看混淆结果
如上图所示,混淆成功,函数名和变量名都已经变成了随机生成的字符串,并且在symbols中可以查找到两者之间的对应关系,方便后续查找bug等
二次更新:如何查看symbols中的内容
$ cd /Users/cafei/Desktop/SwiftTest
$ sqlite3 symbols.sqlite3
$ .databases
$ select * from symbols;
这时混淆前后的函数名和变量名对应关系就出现在你眼前啦