在逆向过程中,通过动态调试、静态分析等手段可以破解很多程序。我们可以采用代码混淆,降低逆向分析代码的可读性,从而加大逆向的难度。
一、关键类、关键方法混淆
1.源代码
#import "ViewController.h"
#import "UserInfo.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
if ([[[UserInfoClass alloc] init] isVipWithAccount:@"hank123"]) {
NSLog(@"是VIP");
}else{
NSLog(@"不是VIP");
}
}
@end
UserInfo类:
#import <Foundation/Foundation.h>
@interface UserInfoClass : NSObject
-(BOOL)isVipWithAccount:(NSString *)account;
@end
#import "UserInfo.h"
@implementation UserInfoClass
-(BOOL)isVipWithAccount:(NSString *)account
{
if ([account isEqualToString:@"hank"]) {
return YES;
}
return NO;
}
@end
2.创建.pch文件,并在BuildSettings-->Prefix Header下配置.pch的路径
3.在pch中用宏定义的方式替换代码中的关键类和关键代码
#ifndef PrefixHeader_pch
#define PrefixHeader_pch
#define UserInfoClass FDLKJSDLFK89273
#define isVipWithAccount KDSUIOKJDF
#endif /* PrefixHeader_pch */
4.编译运行,使用Hopper分析MatchO
二、关键字符串混淆
static NSString * AES_KEYINFO = @"UUTTFFX";
上述代码中AES_KEYINFO的值会进常量区,在MatchO中分析中可以直接找到.
我们可以采用以下方式, 不让AES_KEYINFO进入常量区
#define STRING_ENCRYPT_KEY 0xAC
static NSString * AES_KEYINFO(){
//采用这样的方式,这些字符不会进入字符常量区。编译器直接换算成异或结果
unsigned char key[]={
(STRING_ENCRYPT_KEY ^ 'U'),
(STRING_ENCRYPT_KEY ^ 'U'),
(STRING_ENCRYPT_KEY ^ 'T'),
(STRING_ENCRYPT_KEY ^ 'T'),
(STRING_ENCRYPT_KEY ^ 'F'),
(STRING_ENCRYPT_KEY ^ 'F'),
(STRING_ENCRYPT_KEY ^ 'X'),
(STRING_ENCRYPT_KEY ^ '\0'),
};
unsigned char * p = key;
while (((*p) ^= STRING_ENCRYPT_KEY) != '\0') {
p++;
}
return [NSString stringWithUTF8String:(const char *)key];
}