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

Objective-C 代碼混淆

class-dump 可以很方便的導出程序頭文件,不僅讓攻擊者了解了程序結構方便逆向,還讓著急趕進度時寫出的欠完善的程序給同行留下笑柄。 所以,我們迫切的希望混淆自己的代碼。

混淆的常規(guī)思路

混淆分許多思路,比如:

1)花代碼花指令,即隨意往程序中加入迷惑人的代碼指令

2)易讀字符替換 等等

http://wiki.jikexueyuan.com/project/ios-security-defense/images/confusion1.png" alt="confusion1" />

防止 class-dump 出可讀信息的有效辦法是易讀字符替換。

Objective-C 的方法名混淆

混淆的時機

我們希望在開發(fā)時一直保留清晰可讀的程序代碼,方便自己。 同時,希望編譯出來的二進制包含亂七八糟的混淆后的程序代碼,惡心他人。

因此,我們可以在 Build Phrase 中設定在編譯之前進行方法名的字符串替換。

混淆的方法

方法名混淆其實就是字符串替換,有 2 個方法可以,一個是 #define,一個是利用 tops。

利用 #define 的方法有一個好處,就是可以把混淆結果合并在一個 .h 中,在工程 Prefix.pch 的最前面 #import 這個 .h 。不導入也可以編譯、導入則實現混淆。

單段的 selector ,如 func: ,可以通過 #define func 來實現字符串替換。

多段的 selector,如 a:b:c: ,可以通過分別 #define a 、b、c 來實現字符串替換。

我的混淆工具

我寫了個簡易的混淆腳本,主要思路是把敏感方法名集中寫在一個名叫 func.list 的文件中,逐一 #define 成隨機字符,追加寫入 .h 。

腳本如下:

#!/usr/bin/env bash  

TABLENAME=symbols  
SYMBOL_DB_FILE="symbols"  
STRING_SYMBOL_FILE="func.list"  
HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/codeObfuscation.h"  
export LC_CTYPE=C  

#維護數據庫方便日后作排重  
createTable()  
{  
    echo "create table $TABLENAME(src text, des text);" | sqlite3 $SYMBOL_DB_FILE  
}  

insertValue()  
{  
    echo "insert into $TABLENAME values('$1' ,'$2');" | sqlite3 $SYMBOL_DB_FILE  
}  

query()  
{  
    echo "select * from $TABLENAME where src='$1';" | sqlite3 $SYMBOL_DB_FILE  
}  

ramdomString()  
{  
    openssl rand -base64 64 | tr -cd 'a-zA-Z' |head -c 16  
}  

rm -f $SYMBOL_DB_FILE  
rm -f $HEAD_FILE  
createTable  

touch $HEAD_FILE  
echo '#ifndef Demo_codeObfuscation_h  
#define Demo_codeObfuscation_h' >> $HEAD_FILE  
echo "http://confuse string at `date`" >> $HEAD_FILE  
cat "$STRING_SYMBOL_FILE" | while read -ra line; do  
    if [[ ! -z "$line" ]]; then  
        ramdom=`ramdomString`  
        echo $line $ramdom  
        insertValue $line $ramdom  
        echo "#define $line $ramdom" >> $HEAD_FILE  
    fi  
done  
echo "#endif" >> $HEAD_FILE  

sqlite3 $SYMBOL_DB_FILE .dump  

操作步驟

1.將混淆腳本 confuse.sh 放到工程目錄下 mv confuse.sh your_proj_path/

2.修改 Prefix.pch

打開 Xcode,修改 XXX-Prefix.ch ,添加混淆頭文件:

#ifdef __OBJC__  
    #import <UIKit/UIKit.h>  
    #import <Foundation/Foundation.h>  
    //添加混淆作用的頭文件(這個文件名是腳本confuse.sh中定義的)  
    #import "codeObfuscation.h"  
#endif 

3.配置 Build Phase

在工程 Build Phase 中添加執(zhí)行腳本操作,執(zhí)行 confuse.sh 腳本,如圖:

http://wiki.jikexueyuan.com/project/ios-security-defense/images/confusion3.png" alt="confusion3" />

4.創(chuàng)建函數名列表 func.list ,寫入待混淆的函數名,如:

-(void)sample;
-(void)seg1:(NSString *)string seg2:(NSUInteger)num;

就這樣寫:

sample
seg1
seg2

并將文件放置于與 confuse.sh 腳本同級
mv func.list your_proj_path/

5.編譯查看結果

直接 build,混淆腳本會在編譯前運行,進行字符隨機替換,并且每次 build 的隨機字符不同,如圖:

http://wiki.jikexueyuan.com/project/ios-security-defense/images/confusion4.png" alt="confusion4" />