本文轉(zhuǎn)載自(https://blog.csdn.net/yiyaaixuexi/article/details/29210413)
Objective-C代碼容易被hook饭入,暴露信息太赤裸裸摧找,為了安全,改用C來寫吧骗随!
當(dāng)然不是全部代碼都要C來寫颜价,我指的是敏感業(yè)務(wù)邏輯代碼。
本文就介紹一種低學(xué)習(xí)成本的洪规,簡易的敷搪,Objective-C邏輯代碼重寫為C代碼的辦法。
也許留量,程序中存在一個類似這樣的類:
@interface XXUtil : NSObject + (BOOL)isVerified;+ (BOOL)isNeedSomething;+ (void)resetPassword:(NSString *)password; @end
被class-dump出來后窄赋,利用Cycript很容易實現(xiàn)攻擊,容易被hook楼熄,存在很大的安全隱患忆绰。
想改,但是不想大改程序結(jié)構(gòu)可岂,腫么辦呢错敢?
把函數(shù)名隱藏在結(jié)構(gòu)體里,以函數(shù)指針成員的形式存儲缕粹。
這樣做的好處是稚茅,編譯后,只留了下地址平斩,去掉了名字和參數(shù)表亚享,提高了逆向成本和攻擊門檻。
改寫的程序如下:
//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
最后绘面,根據(jù)Xcode的報錯指引欺税,把以前這樣的調(diào)用
[XXUtil isVerified];
對應(yīng)改成:
XXUtil->isVerified();
就可以了。
是的揭璃,絕不費(fèi)一點(diǎn)腦子晚凿。