Objective-C 代碼容易被 hook,暴露信息太赤裸裸,為了安全,改用 C 來寫吧!
http://wiki.jikexueyuan.com/project/ios-security-defense/images/sensitive1.jpeg" alt="sensitive1" />
當(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 ,存在很大的安全隱患。
http://wiki.jikexueyuan.com/project/ios-security-defense/images/sensitive2.jpeg" alt="sensitive2" />
想改,但是不想大改程序結(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();
就可以了。
是的,絕不費一點腦子。