你好,歡迎來到IOS教程網

 Ios教程網 >> IOS訊息 >> 關於IOS >> [原]iOS安全攻防(二十二):static和被裁的符號表

[原]iOS安全攻防(二十二):static和被裁的符號表

編輯:關於IOS
[收起] 文章目錄
  • 原理
  • 驗證
  • 局限
  • 打破局限

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函數的函數指針都賦在這個結構體裡,再把這個結構體拋出去。
這樣做的好處是,既隱藏了函數代碼也豐富了調用方式。

作者:yiyaaixuexi 發表於2014-3-18 17:11:18 原文鏈接 閱讀:6798 評論:13 查看評論
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved