敏感逻辑的保护方案

24 敏感逻辑的保护方案

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

图片 24.1 sensitive1

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

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

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

1
2
3
4
5
6
7
@interface XXUtil : NSObject

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

@end

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

图片 24.2 sensitive2

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

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

改写的程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//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();

就可以了。

是的,绝不费一点脑子。

Comments