為了不讓攻擊者理清自己程序的敏感業務邏輯,于是我們想方設法提高逆向門檻。
本文就介紹一個防御技巧——利用 static 關鍵字裁掉函數符號。
原理
如果函數屬性為 static ,那么編譯時該函數符號就會被解析為 local 符號。
在發布 release 程序時(用 Xcode 打包編譯二進制)默認會 strip 裁掉這些函數符號,無疑給逆向者加大了工作難度。
驗證
寫個 demo 驗證一下上述理論,以一段創建 Button 的代碼為例,對應補充一個 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;
}
再來看一下反編的結果,對于 createBtn() 方法,我們可以得到它的偽代碼:
函數名雖然面目全非,但是基本操作還是清晰的。
對于 static_createBtn() 方法呢,我們已經無法看到它任何直觀的有價值信息了。
局限
當然這種方法也有局限性。正如你所知道的,static 函數,只在本文件可見。
打破局限
怎么讓別的文件也能調到本文件的 static 方法呢?
在本文件建造一個結構體,結構體里包含函數指針。把 static 函數的函數指針都賦在這個結構體里,再把這個結構體拋出去。
這樣做的好處是,既隱藏了函數代碼也豐富了調用方式。