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

static 和被裁的符號(hào)表

為了不讓攻擊者理清自己程序的敏感業(yè)務(wù)邏輯,于是我們想方設(shè)法提高逆向門檻。

本文就介紹一個(gè)防御技巧——利用 static 關(guān)鍵字裁掉函數(shù)符號(hào)。

原理

如果函數(shù)屬性為 static ,那么編譯時(shí)該函數(shù)符號(hào)就會(huì)被解析為 local 符號(hào)。

在發(fā)布 release 程序時(shí)(用 Xcode 打包編譯二進(jìn)制)默認(rèn)會(huì) strip 裁掉這些函數(shù)符號(hào),無疑給逆向者加大了工作難度。

驗(yàn)證

寫個(gè) demo 驗(yàn)證一下上述理論,以一段創(chuàng)建 Button 的代碼為例,對(duì)應(yīng)補(bǔ)充一個(gè) static 版本。

id createBtn()  
{  
    UIButton *btn = [[UIButton alloc]initWithFrame:CGRectZero];  
    [btn setFrame:CGRectMake(200, 100, 100, 100)];  
    [btn setBackgroundColor:[UIColor redColor]];  
    btn.layer.cornerRadius = 7.0f;  
    btn.layer.masksToBounds = YES;  
    return btn;  
}  

static id static_createBtn()  
{  
    UIButton *btn = [[UIButton alloc]initWithFrame:CGRectZero];  
    [btn setFrame:CGRectMake(50, 100, 100, 100)];  
    [btn setBackgroundColor:[UIColor blueColor]];  
    btn.layer.cornerRadius = 7.0f;  
    btn.layer.masksToBounds = YES;  
    return btn;  
}  

再來看一下反編的結(jié)果,對(duì)于 createBtn() 方法,我們可以得到它的偽代碼:

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

函數(shù)名雖然面目全非,但是基本操作還是清晰的。

對(duì)于 static_createBtn() 方法呢,我們已經(jīng)無法看到它任何直觀的有價(jià)值信息了。

局限

當(dāng)然這種方法也有局限性。正如你所知道的,static 函數(shù),只在本文件可見。

打破局限

怎么讓別的文件也能調(diào)到本文件的 static 方法呢?

在本文件建造一個(gè)結(jié)構(gòu)體,結(jié)構(gòu)體里包含函數(shù)指針。把 static 函數(shù)的函數(shù)指針都賦在這個(gè)結(jié)構(gòu)體里,再把這個(gè)結(jié)構(gòu)體拋出去。

這樣做的好處是,既隱藏了函數(shù)代碼也豐富了調(diào)用方式。