ios 逆向开发

《iOS防护07》字符串加密

2020-11-02  本文已影响0人  不仅仅是个程序猿

项目中经常要用到一些重要的字符串,本文主要介绍如何对对称加密中的salt(盐)进行加密。

通过分析应用的MachO可执行文件,我们可以在常量区找到应用中定义的常量,比如上面的demo,AES加密的key为"abc",我们用MachOView分析这个demo如下:


image.png

key ”abc“在字符串常量区很容易的被定位到了,一旦加密的key泄露了应用被入侵的风险就变高了。所以我们需要隐藏这个字符串常量key.

先拿个例子分析下:

#import "ViewController.h"
#import "EncryptionTools.h"

@interface ViewController ()

@end

//盐,salt
NSString *const AES_KEY = @"ABCDEF";

@implementation ViewController

- (void)encyptString:(NSString *)str {
    NSString *encyptedString = [[EncryptionTools sharedEncryptionTools] encryptString:str keyString:AES_KEY iv:nil];
    NSLog(@"加密后的字符串:%@",encyptedString);
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor whiteColor];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self encyptString:@"12345"];
}

@end

我们得到项目的MachO文件后,通过Hopper可以容易的看出上面加密算法中的字符串“ABCDEF”。


截屏2020-11-02下午8.56.30.png

下面就来说说如何让加密的盐更加安全。可以利用C函数脱符号的特征进行隐藏,如下通过调用C函数的方式返回Key。

修改后的代码:

#import "ViewController.h"
#import "EncryptionTools.h"

@interface ViewController ()

@end

#define STRING_ENCRYPT_KEY 0xAB

@implementation ViewController

static NSString *AES_KEY () {
    //采用这样的方式,这些字符不会进入字符常量区,编译器直接换算成异或结果
    unsigned char key[] = {
        (STRING_ENCRYPT_KEY ^ 'A'),
        (STRING_ENCRYPT_KEY ^ 'B'),
        (STRING_ENCRYPT_KEY ^ 'C'),
        (STRING_ENCRYPT_KEY ^ 'D'),
        (STRING_ENCRYPT_KEY ^ 'E'),
        (STRING_ENCRYPT_KEY ^ 'F'),
        (STRING_ENCRYPT_KEY ^ '\0'),
    };
    unsigned char *p = key;
    while (((*p) ^ STRING_ENCRYPT_KEY) != '\0') {
        p++;   //2次异或使字符还原
    }
    return [NSString stringWithUTF8String:(const char *)key];
}

- (void)encyptString:(NSString *)str {
    NSString *encyptedString = [[EncryptionTools sharedEncryptionTools] encryptString:str keyString:AES_KEY() iv:nil];
    NSLog(@"加密后的字符串:%@",encyptedString);
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor whiteColor];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self encyptString:@"12345"];
}

@end

”ABCDEF“异或0xAB之后,再依次取出来异或0xAB还原字符串“ABCDEF”(A异或B等于C,C再异或B等于A)。编译的时候会直接把异或的结果编译出来,编译后的函数体是没有“ABCDEF”字符的。

通过Hopper再次查看MachO文件,发现已经不能找到明文字符串。


截屏2020-11-02下午9.17.14.png
上一篇 下一篇

猜你喜欢

热点阅读