基本概念
- 什么是加固
- 加固是为了增加应用的安全性,防止应用被破解、盗版、二次打包、注入、反编译等。
- 常见的加固方式有
- 数据加密(字符串、网络数据、敏感数据)。
- 应用价格(二次加密)
- 代码混淆(类名、方法名、代码逻辑)
代码混淆
iOS程序员可以通过
class-dump
、Hopper
、IDA
等获取类名、方法名、以及分析程序的执行逻辑- 如果进行代码混淆,可以加大别人的分析难度
iOS的代码混淆方案
- 类名
- 方法名
- 协议名
LLVM
中间代码IR
的混淆(容易产生Bug)- 自己编写
Pass
- ollvm
- 自己编写
源码的混淆
通过宏定义混淆方法名、类名
1 2 3 4 5 6 7 8 9 10 11 12 13
@interface JVPerson: NSObject - (void)run; - (void)setupName:(NSString *)name no:(int)no age:(int)age; @end @implementation JVPerson - (void)run { NSLog(@"%s", __func__); } - (void)setupName:(NSString *)name no:(int)no age:(int)age { NSLog(@"%s -- %@ %d %d", __func__, name, no, age); } @end
1 2 3 4 5
#define JVPerson rerere #define run xdsds #define setupName sgwefwef #define no gersdfw #define age stwe4r
注意点:
- 不能混淆系统方法
- 不能混淆init开头的等初始化方法
- 混淆属性时需要额外注意set方法
- 如果xib、storyboard中用到了混淆的内容,需要手动修正
- 可以考虑把需要混淆的符号都加上前缀,跟系统自带的符号进行区分
- 混淆过多可能会被AppStore拒绝商家,需要说明用途
建议
- 给需要混淆的符号加上了一个特定的前缀
- 小工具
ios-class-guard
第三方工具
https://github.com/polidea/ios-class-guard
它是基于class-dump的扩展
用class-dump扫描出可执行文件中的类名、方法名、属性名等并做替换,会更新xib和storyboard的名字。
用法
$ brew install ios-class-gaurd
$ ios-class-guard [options] <mach-o-file>
常用参数
ios-class-guard --sdk-root <path>
: 用于指定SDK路径,如果是模拟器SDK,一般路径就是/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator
--sdk--ios
: 相当于指定SDK路径为真机设备SDK-X <path>
: 用于指定xib、storyboard所在目录,它会递归搜索-O <path>
: 生成的混淆头文件路径-m <path>
: 符号映射表(默认是symbols.json)
字符串加密
- 很多时候,可执行文件中的字符串信息,对于破解者来说,非常关键,是破解的捷径之一。为了加大破解、逆向难度,可以考虑对字符串进行加密。
- 对每个字符串进行
异或(^)
处理。