美文网首页
iOS安全攻防之代码混淆

iOS安全攻防之代码混淆

作者: king_jensen | 来源:发表于2019-02-17 11:51 被阅读5次

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

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

    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的路径


    6D7ED6050B51ACB528FB4264BB3AF05F.png

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

    #ifndef PrefixHeader_pch
    #define PrefixHeader_pch
    
    #define UserInfoClass FDLKJSDLFK89273
    #define isVipWithAccount KDSUIOKJDF
    
    #endif /* PrefixHeader_pch */
    

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


    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安全攻防之代码混淆

          本文链接:https://www.haomeiwen.com/subject/kvfgeqtx.html