因为iOS系统的封闭性,相对于安卓来讲,iOS开发过程当中代码混淆可能就显得并非得非有不可了。可是在安全性(可经过class-dump反编译暴露出类的方法名)和特殊需求上(例如马甲包的混淆过审)仍是有必定需求的!
此脚本借鉴于kaich/codeobscure。在使用原做者脚本的过程当中,发现了一些BUG和不足,好比正则表达式的判断不许确,生成过多无用的替换宏,须要花费过多时间去人工排错...
因为本人对python并非很熟,因此只是在原做者的基础上做了一些完善修改。python
其实插件的实现方式十分简单,提取用户编写的文件中的方法名,使用宏定义将其更换为任意的无规则字符串。但这种方式有一些须要注意的点:git
根据上面的规则(可能有遗漏),该脚本采用了相对简单的方法来避免:github
依据上述原理,基本能够避免多数状况下产生的混淆错误;固然,因为各类项目的复杂性,有一些复杂的混淆错误没法避免,须要后续手动调整代码。正则表达式
注:建议目录使用绝对路径,相对路径容易出问题。
python3 Confuse.py \ -i 你须要混淆的代码的目录,能够是多个目录,以`,`分隔 \ -s 当前项目编译环境的SDK库头文件目录,能够是多个目录,以`,`分隔 \ -e 你不须要混淆的代码的目录,Swift代码目录,能够是多个目录,以`,`分隔 \ -c 你须要提取关键字作排除混淆的目录,能够是多个目录,以`,`分隔 \ -k 可选,用于存放须要过滤的key(增长内容) -o 输出文件目录
注:各参数的意义以下:
-i
(input_dirs):必须,项目须要处理的主要文件所在的目录-s
(system_dirs):可选,配置系统Framework文件的目录,通常用于作排除字典,避免替换系统关键字-e
(exclusive_dirs):可选,用于存放不扫描处理的文件的目录,好比Swift文件目录-c
(clean_dirs):可选,用于存放排除关键字的文件的目录,例如Pods下的目录,或者静态库(头文件修改后会出错)-k
(ignore_key_dir):可选,用于存放须要过滤的key(增长内容)-o
(output_dir):必须,输出文件的目录,用于输出关键字、日志以及最后生成的混淆头文件的目录#ifndef NEED_CONFUSE_h #define NEED_CONFUSE_h // 生成时间: 2018-04-03 17:20:51 #define Function1 linotypistStonecrop #define function1 exactingnessMimologist #define function2 sheepmanSupersublimated #define functionWithTitle kensititeCratinean #define subTitle icelandicUntell #endif
这份文件包含了一堆的宏定义,将须要替换的方法名都替换为了一些随机的字符串,由于宏定义是全局替换,咱们只须要将该文件引入到本身的项目中,并在PCH文件中进行引入便可。objective-c
引入该文件后,Command+B测试编译,若是没法避免而产生编译错误则须要手动调整;因为将全部的替换归集到了头文件中了,因此遇到有错误的地方尝试删除对应宏定义替换信息从新编辑便可。shell
另外附上一个系统系统库路径:安全
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks
了解完原理,接下来用图文来详细介绍使用方法:
首先去个人Github上获取下源代码资源文件。app
注:关键文件以下:
Confuse.h
最终生成的替换文件就是这个了,该文件里记录了全部须要混淆的方法名和与之对应的替换字符串Confuse.py
该文件是脚本内容所在,全部实现方法都在这。ignoreKey.txt
该文件下记录须要过滤的特殊key,每一个key换行读取start.sh
开始执行脚本 ,在此脚本内更改路径首先须要一个pch文件,至于pch的用法自行百度吧.。iphone
#ifndef TMPrefixHeader_pch #define TMPrefixHeader_pch //代码混淆关键导入文件头,注释后不混淆 #import "Confuse.h" #endif /* TMPrefixHeader_pch */
根据自行需求添加特殊key
到ignoreKey.txt
文件内测试
经过start.sh
脚本快速执行
终端执行内容大概以下:
生成的混淆文件:
编译结果:对无参数、无返回值、多参数等方法名完成识别替换。
接下来咱们用class-dump
来反编译一下:
class-dump -H /Users/wuaming/Library/Developer/Xcode/DerivedData/TMConfuse-becmpkjuhzbzfldtqwaiznqcmmxq/Build/Products/Debug-iphonesimulator/TMConfuse.app -o /Users/wuaming/Desktop/heads
对比结果:
最后仍是要感谢下几位大佬!
相关连接:
Objective-C Class-dump 安装和使用方法(原创)
iOS安全攻防(二十三):Objective-C代码混淆
感谢原做者的Github