本文转载自(https://blog.csdn.net/yiyaaixuexi/article/details/29210413)
Objective-C代码容易被hook,暴露信息太赤裸裸,为了安全,改用C来写吧!
当然不是全部代码都要C来写,我指的是敏感业务逻辑代码。
本文就介绍一种低学习成本的,简易的,Objective-C逻辑代码重写为C代码的办法。
也许,程序中存在一个类似这样的类:
@interface XXUtil : NSObject + (BOOL)isVerified;+ (BOOL)isNeedSomething;+ (void)resetPassword:(NSString *)password; @end
被class-dump出来后,利用Cycript很容易实现攻击,容易被hook,存在很大的安全隐患。
image想改,但是不想大改程序结构,肿么办呢?
把函数名隐藏在结构体里,以函数指针成员的形式存储。
这样做的好处是,编译后,只留了下地址,去掉了名字和参数表,提高了逆向成本和攻击门槛。
改写的程序如下:
//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
image
最后,根据Xcode的报错指引,把以前这样的调用
[XXUtil isVerified];
对应改成:
XXUtil->isVerified();
就可以了。
是的,绝不费一点脑子。
网友评论