iOS安全攻防(二十四):敏感邏輯的保護方案(1)
Objective-C代碼容易被hook,暴露信息太赤裸裸,為了安全,改用C來寫吧!
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD48cD61sci7srvKx8irsr+0+sLrtrzSqkPAtNC0o6zO0ta4tcTKx8P0uNDStc7xwt+8rbT6wuuhozwvcD48cD6xvs7Evs296cnc0rvW1rXN0afPsLPJsb61xKOsvPLS17XEo6xPYmplY3RpdmUtQ8LfvK20+sLr1tjQtM6qQ7T6wuu1xLDst6ihozwvcD48cD48YnIgLz48L3A+PHA+0rLQ7aOss8zQ8tbQtObU2tK7uPbA4MvG1eLR+bXEwOCjujwvcD48cD48L3A+PHByZSBjbGFzcz0="brush:java;">@interface XXUtil : NSObject
+ (BOOL)isVerified;
+ (BOOL)isNeedSomething;
+ (void)resetPassword:(NSString *)password;
@end
被class-dump出來後,利用Cycript很容易實現攻擊,容易被hook,存在很大的安全隱患。
想改,但是不想大改程序結構,腫麼辦呢?
把函數名隱藏在結構體裡,以函數指針成員的形式存儲。
這樣做的好處是,編譯後,只留了下地址,去掉了名字和參數表,提高了逆向成本和攻擊門檻。
改寫的程序如下:
//XXUtil.h #importtypedef 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();
是的,絕不費一點腦子。