鍍金池/ 教程/ iOS/ 敏感邏輯的保護方案
Hack 實戰(zhàn)——支付寶 App 手勢密碼校驗欺騙
使用 Reveal 分析他人 App
后臺 daemon 非法竊取用戶 iTunesstore 信息
使用 iNalyzer 分析應(yīng)用程序
越獄檢測的攻與防
使用 introspy 追蹤分析應(yīng)用程序
廢除應(yīng)用程序的 ASLR 特性
使用 Cycript 修改支付寶 App 運行時
敏感邏輯的保護方案
Fishhook
使用 class-dump-z 分析支付寶 App
static 和被裁的符號表
iOS7 的動態(tài)庫注入
二進制和資源文件自檢
Hack 實戰(zhàn)——探究支付寶 App 手勢密碼
使用 Keychain-Dumper 導(dǎo)出 keychain 數(shù)據(jù)
數(shù)據(jù)擦除
Hack 實戰(zhàn)——解除支付寶 App 手勢解鎖錯誤次數(shù)限制
Objective-C 代碼混淆
阻止 GDB 依附
基于腳本實現(xiàn)動態(tài)庫注入
Hack 必備的命令與工具
鍵盤緩存與安全鍵盤
數(shù)據(jù)保護 API

敏感邏輯的保護方案

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();

就可以了。

是的,絕不費一點腦子。