我們可以從以下幾個方面來保護我們的APP:
1.字符串混淆
對應用程序中使用到的字符串進行加密,保證源碼被逆向后不能看出字符串的直觀含義。
2.類名、方法名混淆
對應用程序的方法名和方法體進行混淆,保證源碼被逆向后很難明白它的真正功能。
3.程序結構混淆加密
對應用程序邏輯結構進行打亂混排,保證源碼可讀性降到最低。
4.反調試、反注入等一些主動保護策略
這是一些主動保護策略,增大破解者調試、分析APP的門檻。
1.1字符串加密
字符串會暴露APP的很多關鍵信息,攻擊者可以根據界面顯示的字符串,快速找到相關邏輯的處理函數,
從而進行分析破解。加密字符串可以增加攻擊者閱讀代碼的難度以及根據字符串靜態搜索的難度。
比如一個APP中有如下的一些字符串定義在代碼文件中:
經過加密后,代碼文件變成如下的形式:
里面已經沒有明文的字符串了,全是用byte的形式保存的,打包生成APP后,他們也就無法直觀的看出實際內容了,
這對破解者會造成巨大的難度:
2.2符號混淆
符號混淆的中心思想是將類名、方法名、變量名替換為無意義符號,提高應用安全性;防止敏感符號被class-dump工具提取,
防止IDA Pro等工具反編譯后分析業務代碼。
比如一款混淆后的APP,用IDA等工具打開,如下圖所示:
“Labels”欄里,顯示的這些符號,不管是類名還是方法名,誰也看不出來到底什么意思,這個函數到底是什么功能,
就有點丈二和尚摸不着頭腦的感覺,這就大大增加了破解者分析APP的難度。
3.3代碼邏輯混淆
代碼邏輯混淆有以下幾個方面的含義:
對方法體進行混淆,保證源碼被逆向后該部分的代碼有很大的迷惑性,因為有一些垃圾代碼的存在;
對應用程序邏輯結構進行打亂混排,保證源碼可讀性降到最低,這很容易把破解者帶到溝里去;
它擁有和原始的代碼一樣的功能,這是最最關鍵的。
混淆前后的對比如下(左邊是原始結構,右邊是混淆后的結構):
下面以iOS APP中的main函數為例:
它就只有一行有效代碼,包含兩個關鍵函數,已經算最簡單的函數體了,混淆前的匯編代碼如下:
這里主要包含兩個API的符號: NSStringFromClass、UIApplicationMain。其余就是一些消息發送以及內存管理的相關符號,但如果進行一定的代碼邏輯混淆后,這個結構就會變得大不一樣了。
NSStringFromClass、UIApplicationMain這兩個函數,邏輯結構已經變得非常復雜了,如果一個函數中,包含更多的代碼的話,那這個結構將更加復雜,對破解者來說將是一個很耗時間、精力的過程,一般早早就會放棄分析了。
4.4URL編碼加密
對程序中出現的URL進行編碼加密,防止URL被靜態分析。
5.5網絡傳輸數據加密
對客戶端傳輸數據提供加密方案,防止通過網絡接口的攔截獲取數據。
6.6主動保護策略
除了上面的一些被動保護方法,我們還可以加入一些主動的防護機制,比如反調試等。
iOS平台下的Anti-Debug方法一般有以下一些:
檢查進程的狀態是否為 P_TRACED。
調用ptrace請求來檢查進程是否被調試。由於可能被攻擊者繞過該方法的調用,在應用的多處增加ptrace函數會提高應用的安全性。
通過sysctl查看信息進程里的標記,判斷自己是否正在被調試。sysctl是用以查詢內核狀態的接口,並允許具備相應權限的進程設置內核狀態。
iOS下的這些方法,相對於Linux下的方法要少很多,例如fork一個子進程,ptrace父進程進行檢測方式不再奏效。而且,要完全防止程序被調試或者被逆向,理論上是不可能的,但可以增加破解者調試的難度。
總之,添加以上的一些保護措施后,iOS APP的安全性會獲得很大的增強,大大提高了破解者破解的難度。對於iOS開發者來說,有必要了解這些措施,特別是針對一些金融、證券類APP的開發,保護方面的需求比較大,比如國內某知名移動支付工具就添加了一些調試檢測以及反調試的功能。
幾維安全安全編譯器是一款面向互聯網企業和個人開發者提供的源代碼加密工具,與普通編譯器相似,可將C、C++、Objective-C等源代碼編譯成二進制代碼,不同之處在於,安全編譯器在編譯的時候,能夠對代碼邏輯進行混淆、變形、膨脹等加密處理,同時還能夠對敏感的字符串進行加密保護 。從而避免被IDA Pro等破解工具反編譯代碼,竊取核心技術。
安全編譯器支持iOS項目[APP、動態庫、靜態庫]和安卓NDK項目[SO動態庫、靜態庫]!
免費版僅支持靜態庫項目,如需免費使用請前往幾維安全(www.kiwisec.com/)服務平台。定制版是離線加密工具,並支持所有類型的項目。