為了不讓攻擊者理清自己程序的敏感業(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),無(wú)疑給逆向者加大了工作難度。
寫個(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;
}
再來(lái)看一下反編的結(jié)果,對(duì)于 createBtn() 方法,我們可以得到它的偽代碼:
http://wiki.jikexueyuan.com/project/ios-security-defense/images/static.png" alt="static" />
函數(shù)名雖然面目全非,但是基本操作還是清晰的。
對(duì)于 static_createBtn() 方法呢,我們已經(jīng)無(wú)法看到它任何直觀的有價(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)用方式。