iOS安全攻防之代码混淆

在逆向过程中,通过动态调试、静态分析等手段可以破解很多程序。我们可以采用代码混淆,降低逆向分析代码的可读性,从而加大逆向的难度。

一、关键类、关键方法混淆

1.源代码

#import "ViewController.h"
#import "UserInfo.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    if ([[[UserInfoClass alloc] init] isVipWithAccount:@"hank123"]) {
        NSLog(@"是VIP");
    }else{
        NSLog(@"不是VIP");
    }
}
@end

UserInfo类:

#import 
@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的路径


iOS安全攻防之代码混淆_第1张图片
6D7ED6050B51ACB528FB4264BB3AF05F.png

3.在pch中用宏定义的方式替换代码中的关键类和关键代码

#ifndef PrefixHeader_pch
#define PrefixHeader_pch

#define UserInfoClass FDLKJSDLFK89273
#define isVipWithAccount KDSUIOKJDF

#endif /* PrefixHeader_pch */

4.编译运行,使用Hopper分析MatchO


iOS安全攻防之代码混淆_第2张图片
A68095F0A08D122642FA3735BE793E1A.png

二、关键字符串混淆

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];
}

你可能感兴趣的:(iOS安全攻防之代码混淆)