一、基本概念
什么是加固
加固是为了增加应用的安全性,防止应用被破解、盗版、二次打包、注入、反编译等常见的加固方式有
数据加密(字符串、网络数据、敏感数据等)
应用加壳(二进制加密)
代码混淆(类名、方法名、代码逻辑等)
......(不同平台还有不同的做法)
代码混淆
1、iOS程序可以通过class-dump、Hopper、IDA等获取类名、方法名、以及分析程序的执行逻辑
如果进行代码混淆,可以加大别人的分析难度
2、iOS的代码混淆方案
源码的混淆
类名
方法名
协议名LLVM中间代码IR的混淆(容易产生BUG)
自己编写Pass
ollvm:https://github.com/obfuscator-llvm/obfuscator
二、源码的混淆 - 通过宏定义混淆方法名、类名
#define BDPerson dfsfsdf
#define run fsdfsdf
#define setupName jfsdklj
#define no uhdnasf
#define age lsjsdfsdf
@interface BDPerson : NSObject
- (void)run;
- (void)setupName:(NSString *)name no:(int)no age:(int)age;
@end
@implementation BDPerson
- (void)run {
NSLog(@"%s", __func__);
}
- (void)setupName:(NSString *)name no:(int)no age:(int)age {
NSLog(@"%s - %@ %d %d", __func__, name, no, age);
}
@end
注意点
- 不能混淆系统方法
- 不能混淆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-guard
$ ios-class-guard [options] <mach-o-file>
`
常用参数
- --sdk-root <path>:用于指定SDK路径,如果是模拟器SDK,一般路径就是
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk - --sdk-ios:相当于指定SDK路径为真机设备SDK
- -X <path>:用于指定xib、storyboard所在目录,它会递归搜索
- -O <path>:生成的混淆头文件路径
- -m <path>:符号映射表(默认是symbols.json)
字符串加密
- 很多时候,可执行文件中的字符串信息,对破解者来说,非常关键,是破解的捷径之一
- 为了加大破解、逆向难度,可以考虑对字符串进行加密
- 字符串的加密技术有很多种,可以根据自己的需要自行制定算法
这里举一个简单的例子
对每个字符进行异或(^
)处理
需要使用字符串时,对异或(^
)过的字符再进行一次异或(^
),就可以获得原字符