static 和被裁的符號表

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

本文就介紹一個防御技巧——利用 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 函數的函數指針都賦在這個結構體里,再把這個結構體拋出去。

這樣做的好處是,既隱藏了函數代碼也豐富了調用方式。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 注:原文---念茜的博客 為了不讓攻擊者理清自己程序的敏感業務邏輯,于是我們想方設法提高逆向門檻。 本文就介紹一個...
    richar_閱讀 286評論 0 0
  • 1,Search Bar 怎樣去掉背景的顏色(storyboard里只能設置background顏色,可是發現cl...
    以德扶人閱讀 2,431評論 2 50
  • .h @property (retain,nonatomic)UILabel *label; @property ...
    Whatever永不放棄閱讀 880評論 0 0
  • 1.badgeVaule氣泡提示 2.git終端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夾內容...
    i得深刻方得S閱讀 4,732評論 1 9
  • 在iOS中隨處都可以看到絢麗的動畫效果,實現這些動畫的過程并不復雜,今天將帶大家一窺iOS動畫全貌。在這里你可以看...
    F麥子閱讀 5,141評論 5 13