If you need English document for this project, MixPlainText
English document
重要
目前想到一个更好的方案,就是使用 Lex (最新的实现叫做 Flex,这个工具在 macOS 上自带) (这个工具也叫做词法分析器的生成器)。后面有时间再更新。
MixPlainText
该项目的作用是可以将 iOS 工程所有 Objective C 实现文件(后缀名为 m 的文件)中的明文进行加密混淆,如此一来,您的 app 的二进制文件中所有的明文都是经过混淆的。之前我总结了一点如何确保 iOS app 在越狱环境下的安全性,或许值得一看:对 iOS app 进行安全加固
特点
- 简单,开发人员可以硬编码明文字符串,所有的加密会在编译开始时自动处理
- 可自定义加密或者混淆方式,(为了不影响 app 运行效率,需要提供一个简单快速的加密或混淆方式)提高逆向难度
局限
- 不能加密这样的 OC string,比如:@"a""b",因为默认的正则表达式无法识别这种情况,确保将其改成 @"ab",否则无法通过编译。
- Mix 处理过程中如果遇到 "@",这种字符串,会编译出错,需要改一下写法,使用下面的 cs 变量
NSString *s = @"@";
char *cs = s.UTF8String;
- 不能加密含 \nnn, \xnn, \unnnn 和 \Unnnnnnnn 这样的转义字符串,确保您的转义字符串不含这些转义,否则无法通过编译。
- 不能加密静态类型的 string。
使用场景
- 使用私有 API,将加密操作交给 MixPlainText,只要不在审核期间调用,一般能够通过审核
- 提高逆向分析难度,因为所有明文都是经过加密混淆的,逆向分析需要先解密
使用方式
-
打开您自己的工程,在 Build Phases 中添加 Run Script,内容为
# 默认是 Debug 情况下运行,可根据需要自定义,比如 Release if [ "${CONFIGURATION}" = "Debug" ]; then # 注意由于你的工程目录可能包含 Pods 这类第三方代码,所以你需要切换到你自己代码所在的目录比如 MixIosDemo 目录 cd MixIosDemo chmod +x ../mix.swift ../mix.swift fi
确保该 Run Script 在 Compile Souces 之前。
-
添加 MixIosDemo/MixOC/MixDecrypt.h 到您的工程中
-
在您的 pch 头文件中引入 MixDecrypt.h
-
如果遇到代码编译不过的问题,请到编译出错的地方比较原先的代码和经过 mix.swift 脚本加密过后的区别,然后对原始代码进行一些相应修改。当然你可以给我提 issue。
您可以参考 MixIosDemo 这个 iOS Demo 工程来了解具体配置方式。在运行这个工程的时候,你会发现代码中的 NSLog(@"Hello world!");
变成了 NSLog(dl_getRealText(@"t5qTk5DfiJCNk5ve/wE="));
,但是 app 运行的时候打印的仍然是 Hello world!
。
自定义加密混淆
目前默认的加密方式是异或加密(可能也算不上加密,顶多算是混淆),如果需要自定义加密混淆方式,两个步骤:
- 修改 MixIosDemo/mix.swift 中的加密方法
- 修改 MixDecrypt.h 中 dl_getRealText 函数体的解密方法
注意,不要使用复杂的加解密方法,同时解密方法要和加密方法配套,否则运行时会出错。
Warning
由于该程序会改变您原来程序代码的内容,所以您在使用的时候一定要谨慎,最好是在版本控制系统(比如 Git,SVN)下使用,同时当前工作目录没有未 commit 的内容。
TODO
- 支持 C 类型的字符串
- 增加支持更多的文件类型,比如 mm 文件, h 文件,pch 文件, c 文件, cpp 文件等
贡献者
作者: @粉碎音箱的音乐(weibo)
Blog: Blog
需要 Star!
如果你觉得 MixPlainText
有用的话,请点个 star 呗!谢谢啦。