《iOS防护06》代码混淆
2020-11-02 本文已影响0人
不仅仅是个程序猿
项目中一些关键的类名和方法名,我们可以通过混淆使类名和方法名变得无意义,以此来增加理解和逆向的难度。
创建工程
先创建一个名为 ManualConfusionDemo 的工程。
- 新建一个 UserInfo 类
UserInfo.m实现如下:
#import "UserInfo.h"
@implementation UserInfo
- (BOOL)isVipWithAccount:(NSString *)account {
if ([account isEqualToString:@"123456"]) {
return YES;
}
return NO;
}
@end
- 在ViewController.m 中调用 UserInfo 的方法
ViewController.m实现如下:
#import "ViewController.h"
#import "UserInfo.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
if ([[UserInfo new] isVipWithAccount:@"123456"]) {
NSLog(@"UserInfo 是Vip"); //这里的UserInfo是字符串,不会被替换
} else {
NSLog(@"UserInfoA 不是Vip"); //这里的UserInfo不会被替换
}
}
@end
- 创建预编译头文件 PrefixHeader.pch
- 新建 PrefixHeader.pch
-
设置预编译头文件的路径:
截屏2020-11-02上午11.25.50.png
手动混淆
手动混淆是通过在PrefixHeader.pch宏定义来替换类名和方法名。
- 混淆类名
PrefixHeader.pch
#define UserInfo ABCDEF
这样的话项目中出现的 UserInfo 标识,就会被替换成 ABCDEF。
在Hopper在查看MachO文件,UserInfo 类的名称确实被替换。
截屏2020-11-02下午2.25.27.png
- 混淆方法名
PrefixHeader.pch
#define isVipWithAccount ABCDEF
注释:这里将方法名也定义成ABCDEF,与上面类名定义的相同,类似于ABCDEF这个类去调用它的ABCDEF方法。但是不同的类不可以定义成一个标识,会引起重复而不能通过编译。
在Hopper在查看MachO文件,isVipWithAccount 方法的名称确实被替换。
截屏2020-11-02下午2.49.17.png
总结
-
因为预编译文件打包后是拿不到的,所以对方在不知道你宏定义规则的情况下,是无法还原的。
-
定义的标识符中不能含有特殊符号,如 # @ 等
-
一般我们定义一个类文件,比如UserInfo,默认的UserInfo.h和UserInfo.m中的Class即是文件名UserInfo,事实上我们可以修改这个默认值。
UserInfo.h
#import <Foundation/Foundation.h>
@interface UserInfoClass : NSObject
- (BOOL)isVipWithAccount:(NSString *)account;
@end
UserInfo.m
#import "UserInfo.h"
@implementation UserInfoClass
- (BOOL)isVipWithAccount:(NSString *)account {
if ([account isEqualToString:@"123456"]) {
return YES;
}
return NO;
}
@end
调用的时候这样调用:
[[UserInfoClass new] isVipWithAccount:@"123456"]
混淆:
#define UserInfoClass ABCDEF
注意点
- 不能混淆系统的类和方法
- 不能混淆init开头的初始化方法
- 混淆属性时需要额外注意set方法
- 如果xib、storyboard中用到了混淆的内容,需要手动修正
- 可以考虑把需要混淆的符号都加上前缀,跟系统自带的或第三方的符号进行区分
- 混淆过多可能会被AppStore拒绝上架,需要说明用途,建议只对一些重要的和核心的代码进行混淆
自动混淆工具
-
https://github.com/CoderMJLee/MJCodeObfuscation
用class-dump扫描出可执行文件中的类名、方法名、属性名等并做替换,会更新xib和storyboard的名字等等