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

当然不是全部代码都要C来写,我指的是敏感业务逻辑代码。
本文就介绍一种低学习成本的,简易的,Objective-C逻辑代码重写为C代码的办法。
也许,程序中存在一个类似这样的类:
- @interface XXUtil : NSObject
-
- + (BOOL)isVerified;
- + (BOOL)isNeedSomething;
- + (void)resetPassword:(NSString *)password;
-
- @end
被class-dump出来后,利用Cycript很容易实现攻击,容易被hook,存在很大的安全隐患。
想改,但是不想大改程序结构,肿么办呢?
把函数名隐藏在结构体里,以函数指针成员的形式存储。
这样做的好处是,编译后,只留了下地址,去掉了名字和参数表,提高了逆向成本和攻击门槛。
改写的程序如下:
-
- #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
-
- #import "XXUtil.h"
-
- static BOOL _isVerified(void)
- {
-
- return YES;
- }
-
- static BOOL _isNeedSomething(void)
- {
-
- return YES;
- }
-
- static void _resetPassword(NSString *password)
- {
-
- }
-
- 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
|