返回首页 iOS 安全攻防

敏感逻辑的保护方案

Objective-C 代码容易被 hook,暴露信息太赤裸裸,为了安全,改用 C 来写吧!

sensitive1

当然不是全部代码都要 C 来写,我指的是敏感业务逻辑代码。

本文就介绍一种低学习成本的,简易的,Objective-C 逻辑代码重写为 C 代码的办法。

也许,程序中存在一个类似这样的类:

@interface XXUtil : NSObject  

+ (BOOL)isVerified;  
+ (BOOL)isNeedSomething;  
+ (void)resetPassword:(NSString *)password;  

@end 

被 class-dump 出来后,利用 Cycript 很容易实现攻击,容易被 hook ,存在很大的安全隐患。

sensitive2

想改,但是不想大改程序结构,肿么办呢?

把函数名隐藏在结构体里,以函数指针成员的形式存储。 这样做的好处是,编译后,只留了下地址,去掉了名字和参数表,提高了逆向成本和攻击门槛。

改写的程序如下:

//XXUtil.h  
#import <Foundation/Foundation.h>  

typedef struct _util {  
    BOOL (*isVerified)(void);  
    BOOL (*isNeedSomething)(void);  
    void (*resetPassword)(NSString *password);  
}XXUtil_t ;  

#define XXUtil ([_XXUtil sharedUtil])  

@interface _XXUtil : NSObject  

+ (XXUtil_t *)sharedUtil;  
@end  

//XXUtil.m  
#import "XXUtil.h"  

static BOOL _isVerified(void)  
{  
    //bala bala ...  
    return YES;  
}  

static BOOL _isNeedSomething(void)  
{  
    //bala bala ...  
    return YES;  
}  

static void _resetPassword(NSString *password)  
{  
    //bala bala ...  
}  

static XXUtil_t * util = NULL;  
@implementation _XXUtil  

+(XXUtil_t *)sharedUtil  
{  
    static dispatch_once_t onceToken;  
    dispatch_once(&onceToken, ^{  
        util = malloc(sizeof(XXUtil_t));  
        util->isVerified = _isVerified;  
        util->isNeedSomething = _isNeedSomething;  
        util->resetPassword = _resetPassword;  
    });  
    return util;  
}  

+ (void)destroy  
{  
    util ? free(util): 0;  
    util = NULL;  
}  
@end  

最后,根据 Xcode 的报错指引,把以前这样的调用 [XXUtil isVerified];

对应改成: XXUtil->isVerified();

就可以了。

是的,绝不费一点脑子。