iOS安全攻防之結構體保護使用
阿新 • • 發佈:2017-05-24
fff n) cnblogs 調用 hook hang ras evel amp
Objective-C 代碼很容易被 hook,因此需要對一些重要的業務邏輯進行保護,可以改用結構體的形式,把函數名隱藏在結構體裏,以函數指針成員的形式存儲。這樣編譯後只留了下地址,去掉了名字和參數表,提高了逆向成本和攻擊門檻。
例如,把以下代碼進行保護:
+ (BOOL)isPermission:(int)level; + (CGFloat)totalAmont; + (void)somePraviteMethod:(NSString *)paraStr1 numberValue:(double)numberValue;
改為.h:
#import <Foundation/Foundation.h> #import<UIKit/UIKit.h> typedef struct protectUtil { BOOL (*isPermission)(int level); CGFloat (*totalAmont)(void); void (*somePraviteMethod)(NSString *paraStr1, double numberValue); }StructProtectUtil_t; @interface StructProtectUtil : NSObject + (StructProtectUtil_t *)sharedUtil; @end
.m 文件:
#import "StructProtectUtil.h" static BOOL _isPermission (int level) { NSLog(@"****** level = %d", level); if (level > 12) { return YES; } return NO; } static CGFloat _totalAmont() { NSLog(@"==== totalAmount"); return 1900; } static void _somePraviteMethod (NSString *paraStr1, doublenumberValue) { NSLog(@"paraStr1 = %@, numberValue = %f", paraStr1, numberValue); } static StructProtectUtil_t *protectUtil = NULL; @implementation StructProtectUtil + (StructProtectUtil_t *)sharedUtil { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ protectUtil = malloc(sizeof(StructProtectUtil_t)); protectUtil->isPermission = _isPermission; protectUtil->totalAmont = _totalAmont; protectUtil->somePraviteMethod = _somePraviteMethod; }); return protectUtil; } + (void)destory { protectUtil ? free(protectUtil) : 0; protectUtil = NULL; } @end
調用時:
[StructProtectUtil sharedUtil] -> isPermission(1000); [StructProtectUtil sharedUtil] -> totalAmont(); [StructProtectUtil sharedUtil] -> somePraviteMethod(@"ParaStr", 3820);
然後對工程進行 class-dump:
class-dump -H /Users/zhangtibin/Library/Developer/Xcode/DerivedData/TestSecurityAdvance-gflhcslxswowdrfflsfchjmlzfdt/Build/Products/Debug-iphoneos/TestSecurityAdvance.app/TestSecurityAdvance -o /Users/zhangtibin/class-dump/Struct
查看反編譯後的文件,結果如下:
這樣就實現了敏感邏輯的保護。
以下對沒有保護的文件進行 Class-dump 後看到的。
iOS安全攻防之結構體保護使用