iOS App的加固保護原理

蘋果系統的封閉性致使iOS APP安全性比較高,可是實際上iOS應用自己被破解的難度並不高,一旦在越獄設備上,ipa被分析就會變得很容易,本文經過講解iOS APP的破解分析過程來引出咱們要如何的保護咱們的應用。通過保護,iOS APP的安全性會得到很大的加強,大大提升了破解者破解的難度。對於iOS開發者來講,有必要了解這些措施,特別是針對一些金融、遊戲類APP的開發。

1、iOS的安全問題

世所公認,iOS系統安全性很是高,不多出現漏洞,幾乎不會中毒的狀況。然而隨着各類iOS安全隱患的頻頻出現,人們逐漸認識到,iOS跟Android同樣也面臨嚴重的安全問題。蘋果宣稱全部的iPhone都很安全,不會被惡意軟件攻擊,其實這只不過蘋果封閉式的系統管理可以及時處理漏洞罷了,這也正是蘋果不敢開放的緣由。css

咱們已經習慣,每一個新的iOS系統出來沒多久,就會有大牛找到越獄的方法。比較有名的越獄團隊如iH8Sn0w、Geohot、Comex等,以及國內的盤古團隊。就像最新iOS 10.1.1版本,剛出來一個星期,安全研究員Luca Todesco就在推特上曬圖自曝越獄成功,iH8Sn0w和盤古團隊也取得了不錯的進展。只要越獄了,iPhone手機就處於徹底裸奔狀態,不少平時不能作的事情就能夠作了,好比破解分析APP、大範圍泄露用戶隱私數據等。nginx

其中,跟咱們iOS開發者息息相關的問題,主要就是被破解、分析。APP被破解分析進而刷單做弊,或者APP被山寨以次充好等。APP一直以來存在的「山寨」現象,引發愈來愈多開發者的不滿,山寨氾濫的後果將是劣幣驅逐良幣,打擊創新者的積極性,形成惡性循環。sass

下面舉幾個例子:安全

山寨APP

1l.jpg

好比上面的《神廟逃亡》應用,左邊是合法的,右邊是山寨的,山寨的APP就把圖標的背景色以及局部作了一些修改,看起來和正品是如此的類似。服務器

微信多開

微信破解.png

這類APP在淘寶上都有銷售。正常狀況,一個手機只能有一個微信帳號在線,可是微信分身版讓用戶能夠在同一個手機上同時登陸多個微信號,這樣能夠知足一些用戶的不一樣需求,好比進行公衆號營銷、用不一樣的微信號聯繫不一樣的人等。同時這些破解後的微信還有一鍵轉發小視頻、一鍵評論、一鍵點贊等強大的功能。微信

自動搶紅包

下面是一款紅包神器的運行頁面:網絡

自動搶紅包.png

打開這款神器後再登陸微信,若是微信羣裏有人發出紅包,它就會第一時間幫你搶到紅包了,今後「發家致富,迎娶白富美,走上人生巔峯」,哈哈!ide

那麼,看起來如此高級的東東又是怎麼實現的呢?下面咱們作簡要的介紹,只有在瞭解了它們的實現原理後,咱們才能更好地保護咱們的APP不被分析、破解。函數

2、iOS分析方法

懂得如何攻擊纔會懂得如何防護,一切都是爲了以後的防護做準備。這裏總結一下爲hack而作的準備工做。工具

2.1經常使用的命令和工具

表格.png

(1)otool可查看可執行程序都連接了哪些庫。

代碼1-2.png

(2)nm能夠顯示程序符號表。

 

nm -g DeviceInfo

 

代碼2-1.png

(3)ldid:iPhoneOS.platform提供的簽名工具。

咱們本身編譯的程序須要簽上名才能跑在iPhone/iPad上。

2.2 class-dump-z

它一般是和Clutch一塊兒使用的,由於APP Store上的APP都是加密過的,須要先解密。Clutch解密後,就能夠獲得APP的源碼結構,包括資源文件、二進制文件等,下面以XX新聞APP爲例:

3-2.png

「class-dump NewsBoard」,就能夠獲得應用的類信息,包括函數名,下面是該APP的一個登錄頁面的頭文件:

4-2.png

2.3 IDA等靜態分析工具

靜態分析iOS APP的工具除了IDA,還有一款強大的工具– Hopper Disassembler,在某些方面,它比IDA更強大。

5-1.png

上圖顯示,從IDA工具就能夠看到該APP使用的一些類名和方法名,進而就能夠分析到方法裏面的實現邏輯了。

2.4實例

咱們在開發一款SDK的時候,想了解下公司外部競品SDK的使用狀況,到底有多少APP在集成他們的SDK。那麼,這到底該怎麼作呢?

去競品那裏打聽?好像不太現實,惟一的辦法就是「自動動手,豐衣足食」。咱們從XX助手上獲取必定數量的APP,通常是拉取榜單的數據,比較有意義,而後分析拉到的APP裏包含了哪些SDK。固然這得基於機率統計學的原理,獲取足夠多的樣本,好比一萬、十萬都是能夠的。那麼又如何從XX助手服務器拉取這些數據呢?

你們可能都會想到,那就是分析XX助手的網絡協議,而後經過代碼模擬網絡協議,請求數據,獲取APP,再分析APP的符號。分析網絡協議,最簡單的就是網絡抓包,可是估計如今很難再有裸奔的網絡包了,XX助手確實也沒有明文的網絡包,因此只有逆向分析了。值得慶幸的是,它的APP沒有作加固、保護,分析起來就簡單多了。、

2.4.1界面分析

咱們首先從界面分析程序的大致邏輯結構。

來到XX助手的榜單頁面,使用cycript打印界面佈局:

 

[[UIAppkeyWindow]recursiveDescription].toString()

 

找到每個下載控件,這裏隨便找一個:

6-1.png

經過UITableViewCellContentView這個控件,找它的包含關係。

使用[#0x15baf520nextResponder]往上找,能夠獲得:TRTableMultipleViewCell。

TRTableMultipleViewCell分爲3列,每一列包含一個TRAppListSubCell,而每一個TRAppListSubCell對應一個TRAppInfo對象,猜想這個TRAppInfo就是下載後的數據對象,Hook這個類的方法能夠看到:

7.png

TRAppInfo對應一個App的相關信息,包括下載地址,爲了得知這些信息是怎麼初始化的。在-[TRAppInfosetAdsite:]下斷點: b-[TRAppInfosetAdsite:],而後查看調用堆棧:

8.png

其中的一個類TRApiServices很像是網絡請求的接口。Hook該類的調用輸出,點擊榜單,並有瞭如下log輸出:

9.png

至此,咱們基本肯定了咱們須要的函數名了。

2.4.2逆向分析

接下來,就是逆向分析getChartsAppListForCountryId和parseGetChartsAppListData這兩個函數了。

使用IDA工具打開XX助手APP,定位到getChartsAppListForCountryId這個函數:

10.png

再進一步去分析」writeBodyHeader」方法以及」getBody」等方法,就能夠知道網絡請求的發送格式了;要想知道網絡數據返回的格式,還得去分析」 parseGetChartsAppListData:error」這個方法,一切準備穩當後,就能夠下載了。

3、iOS加固保護原理

從上面的分析來看,咱們能夠從如下幾個方面來保護咱們的APP:

1.字符串混淆

對應用程序中使用到的字符串進行加密,保證源碼被逆向後不能看出字符串的直觀含義。

2.類名、方法名混淆

對應用程序的方法名和方法體進行混淆,保證源碼被逆向後很難明白它的真正功能。

3.程序結構混淆加密

對應用程序邏輯結構進行打亂混排,保證源碼可讀性降到最低。

4.反調試、反注入等一些主動保護策略

這是一些主動保護策略,增大破解者調試、分析APP的門檻。

3.1字符串加密

字符串會暴露APP的不少關鍵信息,攻擊者能夠根據界面顯示的字符串,快速找到相關邏輯的處理函數,從而進行分析破解。加密字符串能夠增長攻擊者閱讀代碼的難度以及根據字符串靜態搜索的難度。

好比一個APP中有以下的一些字符串定義在代碼文件中:

12.png

通過加密後,代碼文件變成以下的形式:

13.png

裏面已經沒有明文的字符串了,全是用byte的形式保存的,打包生成APP後,他們也就沒法直觀的看出實際內容了,這對破解者會形成巨大的難度:

15.png

3.2符號混淆

符號混淆的中心思想是將類名、方法名、變量名替換爲無心義符號,提升應用安全性;防止敏感符號被class-dump工具提取,防止IDA Pro等工具反編譯後分析業務代碼。

好比一款混淆後的APP,用IDA等工具打開,以下圖所示:

18.png

「Labels」欄裏,顯示的這些符號,無論是類名仍是方法名,誰也看不出來到底什麼意思,這個函數究竟是什麼功能,就有點丈二和尚摸不着頭腦的感受,這就大大增長了破解者分析APP的難度。

3.3代碼邏輯混淆

代碼邏輯混淆有如下幾個方面的含義:

對方法體進行混淆,保證源碼被逆向後該部分的代碼有很大的迷惑性,由於有一些垃圾代碼的存在;

對應用程序邏輯結構進行打亂混排,保證源碼可讀性降到最低,這很容易把破解者帶到溝裏去;

它擁有和原始的代碼同樣的功能,這是最最關鍵的。

混淆先後的對好比下(左邊是原始結構,右邊是混淆後的結構):

16.jpg

下面以iOS APP中的main函數爲例:

17.jpg

它就只有一行有效代碼,包含兩個關鍵函數,已經算最簡單的函數體了,混淆前的彙編代碼以下:

18.png

這裏主要包含兩個API的符號: NSStringFromClass、UIApplicationMain。其他就是一些消息發送以及內存管理的相關符號,但若是進行必定的代碼邏輯混淆後,這個結構就會變得大不同了。

20-1.png

19.png

NSStringFromClass、UIApplicationMain這兩個函數,邏輯結構已經變得很是複雜了,若是一個函數中,包含更多的代碼的話,那這個結構將更加複雜,對破解者來講將是一個很耗時間、精力的過程,通常早早就會放棄分析了。

3.4URL編碼加密

對程序中出現的URL進行編碼加密,防止URL被靜態分析。

3.5網絡傳輸數據加密

對客戶端傳輸數據提供加密方案,防止經過網絡接口的攔截獲取數據。

3.6主動保護策略

除了上面的一些被動保護方法,咱們還能夠加入一些主動的防禦機制,好比反調試等。

iOS平臺下的Anti-Debug方法通常有如下一些:

檢查進程的狀態是否爲 P_TRACED。

調用ptrace請求來檢查進程是否被調試。因爲可能被攻擊者繞過該方法的調用,在應用的多處增長ptrace函數會提升應用的安全性。

經過sysctl查看信息進程裏的標記,判斷本身是否正在被調試。sysctl是用以查詢內核狀態的接口,並容許具有相應權限的進程設置內核狀態。

iOS下的這些方法,相對於Linux下的方法要少不少,例如fork一個子進程,ptrace父進程進行檢測方式再也不奏效。並且,要徹底防止程序被調試或者被逆向,理論上是不可能的,但能夠增長破解者調試的難度。

總之,添加以上的一些保護措施後,iOS APP的安全性會得到很大的加強,大大提升了破解者破解的難度。對於iOS開發者來講,有必要了解這些措施,特別是針對一些金融、證券類APP的開發,保護方面的需求比較大,好比國內某知名移動支付工具就添加了一些調試檢測以及反調試的功能。

相關文章
相關標籤/搜索