iOS安全攻防(二十四):敏感邏輯的保護方案(1)
Objective-C代碼容易被hook,暴露資訊太赤裸裸,為了安全,改用C來寫吧!
當然不是全部代碼都要C來寫,我指的是敏感商務邏輯代碼。
本文就介紹一種低學習成本的,簡易的,Objective-C邏輯代碼重寫為C代碼的辦法。
也許,程式中存在一個類似這樣的類:
@interface XXUtil : NSObject+ (BOOL)isVerified;+ (BOOL)isNeedSomething;+ (void)resetPassword:(NSString *)password;@end
被class-dump出來後,利用Cycript很容易實現攻擊,容易被hook,存在很大的安全隱患。
想改,但是不想大改程式結構,腫麼辦呢?
把函數名隱藏在結構體裡,以函數指標成員的形式儲存。
這樣做的好處是,編譯後,只留了下地址,去掉了名字和參數表,提高了逆向成本和攻擊門檻。
改寫的程式如下:
//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();
就可以了。
是的,絕不費一點腦子。