CodeObfuscation - ShenYj/ShenYj.github.io GitHub Wiki
加固
加固是为了增加应用的阿暖性,防止应用被破解、盗版、二次打包、注入、反编译等
常见的加固方式
- 数据加密(字符串、网络数据、敏感数据等)
- 应用加壳(二进制加密,如上架 App Store 的应用都有加壳)
- 代码混淆(类名、方法名、代码逻辑等)
- ...(不同平台的一些特殊处理)
iOS 代码混淆
iOS 程序可以通过 class-dump、Hopper、IDA等获取类名、方法名、以及分析程序的执行逻辑
如果进行代码混淆,可以加大别人的分析难度
- iOS 的代码混淆方案
- 源码的混淆
- LLVM 中间代码 IR 的混淆 (容易产生 BUG)obfuscator
-
源码混淆
- 宏定义,替换类名、协议名、方法名
- 在源码中注入一些垃圾代码(可以对代码逻辑造成混淆)
借助工具,批量处理
- MJCodeObfuscation
-
ios-class-guard
- 基于class-dump的扩展,用 class-dump 扫描出可执行文件中的类名、方法名、属性名等并做替换,还能更新xib和storyboard的名字等等,还衍生出了支持Swift混编的 ios-class-guard-swift
-
字符串加密
- 将字符串拆分成每个字符
- 对每个字符与指定值进行异或操作
- 遍历字符再次异或指定值恢复后重新拼接起来即可还原
- 不能混淆系统方法
- 不能混淆
init
开头的初始化方法,否则会报错 - 混淆属性时需要额外注意
set
方法 - 如果
xib
、storyboard
中用到了混淆的内容,需要手动修正 - 混淆过多可能会被 AppStore 拒绝上架,需要说明用途
- 给需要混淆的符号加上了一个特定的前缀,跟系统自带的符号进行区分
- 核心的内容进行混淆,不要全部都混淆