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

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

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

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

@interfaceXXUtil : NSObject

+ (BOOL)isVerified;

+ (BOOL)isNeedSomething;

+ (void)resetPassword:(NSString*)password;

@end

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

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

把函数名隐藏在结构体里,以函数指针成员的形式存储。

这样做的好处是,编译后,只留了下地址,去掉了名字和参数表,提高了逆向成本和攻击门槛。

改写的程序如下:

//XXUtil.h

#import

typedefstruct_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”

staticBOOL_isVerified(void)

{

//bala bala …

returnYES;

}

staticBOOL_isNeedSomething(void)

{

//bala bala …

returnYES;

}

staticvoid_resetPassword(NSString*password)

{

//bala bala …

}

staticXXUtil_t* util =NULL;

@implementation_XXUtil

+(XXUtil_t*)sharedUtil

{

staticdispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

util = malloc(sizeof(XXUtil_t));

util->isVerified = _isVerified;

util->isNeedSomething = _isNeedSomething;

util->resetPassword = _resetPassword;

});

returnutil;

}

+ (void)destroy

{

util ? free(util):0;

util =NULL;

}

@end

最后,根据Xcode的报错指引,把以前这样的调用

[XXUtil isVerified];

对应改成:

XXUtil->isVerified();

就可以了。

是的,绝不费一点脑子。