蘋果系統(tǒng)的封閉性導致iOS
APP安全性比較高瑞你,但是實際上iOS應(yīng)用本身被破解的難度并不高,一旦在越獄設(shè)備上,ipa被分析就會變得很容易吝秕,本文通過講解iOS
APP的破解分析過程來引出我們要如何的保護我們的應(yīng)用洲劣。經(jīng)過保護备蚓,iOS
APP的安全性會獲得很大的增強,大大提高了破解者破解的難度囱稽。對于iOS開發(fā)者來說郊尝,有必要了解這些措施,特別是針對一些金融战惊、游戲類APP的開發(fā)流昏。
一、iOS的安全問題
世所公認,iOS系統(tǒng)安全性非常高况凉,很少出現(xiàn)漏洞谚鄙,幾乎不會中毒的情況。然而隨著各種iOS安全隱患的頻頻出現(xiàn)刁绒,人們逐漸認識到闷营,iOS跟Android一樣也面臨嚴重的安全問題。蘋果宣稱所有的iPhone都很安全知市,不會被惡意軟件攻擊傻盟,其實這只不過蘋果封閉式的系統(tǒng)管理能夠及時處理漏洞罷了,這也正是蘋果不敢開放的原因嫂丙。
我們已經(jīng)習慣娘赴,每個新的iOS系統(tǒng)出來沒多久,就會有大牛找到越獄的方法跟啤。比較有名的越獄團隊如iH8Sn0w诽表、Geohot、Comex等腥光,以及國內(nèi)的盤古團隊关顷。就像最新iOS
10.1.1版本,剛出來一個星期武福,安全研究員Luca
Todesco就在推特上曬圖自曝越獄成功议双,iH8Sn0w和盤古團隊也取得了不錯的進展。只要越獄了捉片,iPhone手機就處于完全裸奔狀態(tài)平痰,很多平時不能做的事情就可以做了,比如破解分析APP伍纫、大范圍泄露用戶隱私數(shù)據(jù)等宗雇。
其中,跟我們iOS開發(fā)者息息相關(guān)的問題莹规,主要就是被破解赔蒲、分析。APP被破解分析進而刷單作弊良漱,或者APP被山寨以次充好等舞虱。APP一直以來存在的“山寨”現(xiàn)象,引起越來越多開發(fā)者的不滿母市,山寨泛濫的后果將是劣幣驅(qū)逐良幣矾兜,打擊創(chuàng)新者的積極性,造成惡性循環(huán)患久。
下面舉幾個例子:
山寨APP
比如上面的《神廟逃亡》應(yīng)用椅寺,左邊是合法的浑槽,右邊是山寨的,山寨的APP就把圖標的背景色以及局部做了一些修改返帕,看起來和正品是如此的相似桐玻。
微信多開
這類APP在淘寶上都有銷售。正常情況溉旋,一個手機只能有一個微信賬號在線畸冲,但是微信分身版讓用戶可以在同一個手機上同時登錄多個微信號嫉髓,這樣可以滿足一些用戶的不同需求观腊,比如進行公眾號營銷、用不同的微信號聯(lián)系不同的人等算行。同時這些破解后的微信還有一鍵轉(zhuǎn)發(fā)小視頻梧油、一鍵評論、一鍵點贊等強大的功能州邢。
自動搶紅包
下面是一款紅包神器的運行頁面:
打開這款神器后再登錄微信儡陨,如果微信群里有人發(fā)出紅包,它就會第一時間幫你搶到紅包了量淌,從此“發(fā)家致富骗村,迎娶白富美,走上人生巔峰”呀枢,哈哈胚股!
那么,看起來如此高級的東東又是怎么實現(xiàn)的呢裙秋?下面我們做簡要的介紹琅拌,只有在了解了它們的實現(xiàn)原理后,我們才能更好地保護我們的APP不被分析摘刑、破解进宝。
二、iOS分析方法
懂得如何攻擊才會懂得如何防御枷恕,一切都是為了之后的防御作準備党晋。這里總結(jié)一下為hack而做的準備工作。
2.1常用的命令和工具
(1)otool可查看可執(zhí)行程序都鏈接了哪些庫徐块。
(2)nm可以顯示程序符號表未玻。
1
nm?-g?DeviceInfo
(3)ldid:iPhoneOS.platform提供的簽名工具。
我們自己編譯的程序需要簽上名才能跑在iPhone/iPad上蛹锰。
2.2 class-dump-z
它通常是和Clutch一起使用的深胳,因為APP Store上的APP都是加密過的,需要先解密铜犬。Clutch解密后舞终,就可以得到APP的源碼結(jié)構(gòu)轻庆,包括資源文件、二進制文件等敛劝,下面以XX新聞APP為例:
“class-dump NewsBoard”余爆,就可以得到應(yīng)用的類信息,包括函數(shù)名夸盟,下面是該APP的一個登陸頁面的頭文件:
2.3 IDA等靜態(tài)分析工具
靜態(tài)分析iOS APP的工具除了IDA蛾方,還有一款強大的工具– Hopper Disassembler,在某些方面上陕,它比IDA更強大桩砰。
上圖顯示,從IDA工具就可以看到該APP使用的一些類名和方法名释簿,進而就可以分析到方法里面的實現(xiàn)邏輯了亚隅。
2.4實例
我們在開發(fā)一款SDK的時候,想了解下公司外部競品SDK的使用情況庶溶,到底有多少APP在集成他們的SDK煮纵。那么,這到底該怎么做呢偏螺?
去競品那里打聽行疏?好像不太現(xiàn)實,唯一的辦法就是“自動動手套像,豐衣足食”酿联。我們從XX助手上獲取一定數(shù)量的APP,一般是拉取榜單的數(shù)據(jù)凉夯,比較有意義货葬,然后分析拉到的APP里包含了哪些SDK。當然這得基于概率統(tǒng)計學的原理劲够,獲取足夠多的樣本震桶,比如一萬、十萬都是可以的征绎。那么又如何從XX助手服務(wù)器拉取這些數(shù)據(jù)呢蹲姐?
大家可能都會想到,那就是分析XX助手的網(wǎng)絡(luò)協(xié)議人柿,然后通過代碼模擬網(wǎng)絡(luò)協(xié)議柴墩,請求數(shù)據(jù),獲取APP凫岖,再分析APP的符號江咳。分析網(wǎng)絡(luò)協(xié)議,最簡單的就是網(wǎng)絡(luò)抓包哥放,但是估計現(xiàn)在很難再有裸奔的網(wǎng)絡(luò)包了歼指,XX助手確實也沒有明文的網(wǎng)絡(luò)包爹土,所以只有逆向分析了。值得慶幸的是踩身,它的APP沒有做加固胀茵、保護,分析起來就簡單多了挟阻。琼娘、
2.4.1界面分析
我們首先從界面分析程序的大體邏輯結(jié)構(gòu)。
來到XX助手的榜單頁面附鸽,使用cycript打印界面布局:
1
[[UIAppkeyWindow]recursiveDescription].toString()
找到每一個下載控件脱拼,這里隨便找一個:
通過UITableViewCellContentView這個控件,找它的包含關(guān)系拒炎。
使用[#0x15baf520nextResponder]往上找挪拟,可以得到:TRTableMultipleViewCell。
TRTableMultipleViewCell分為3列击你,每一列包含一個TRAppListSubCell,而每個TRAppListSubCell對應(yīng)一個TRAppInfo對象谎柄,猜測這個TRAppInfo就是下載后的數(shù)據(jù)對象丁侄,Hook這個類的方法可以看到:
TRAppInfo對應(yīng)一個App的相關(guān)信息,包括下載地址朝巫,為了得知這些信息是怎么初始化的鸿摇。在-[TRAppInfosetAdsite:]下斷點: b-[TRAppInfosetAdsite:],然后查看調(diào)用堆棧:
其中的一個類TRApiServices很像是網(wǎng)絡(luò)請求的接口劈猿。Hook該類的調(diào)用輸出拙吉,點擊榜單,并有了以下log輸出:
至此揪荣,我們基本確定了我們需要的函數(shù)名了筷黔。
2.4.2逆向分析
接下來,就是逆向分析getChartsAppListForCountryId和parseGetChartsAppListData這兩個函數(shù)了仗颈。
使用IDA工具打開XX助手APP佛舱,定位到getChartsAppListForCountryId這個函數(shù):
再進一步去分析”writeBodyHeader”方法以及”getBody”等方法,就可以知道網(wǎng)絡(luò)請求的發(fā)送格式了挨决;要想知道網(wǎng)絡(luò)數(shù)據(jù)返回的格式请祖,還得去分析”
parseGetChartsAppListData:error”這個方法,一切準備妥當后脖祈,就可以下載了肆捕。
三、iOS加固保護原理
從上面的分析來看盖高,我們可以從以下幾個方面來保護我們的APP:
1.字符串混淆
對應(yīng)用程序中使用到的字符串進行加密慎陵,保證源碼被逆向后不能看出字符串的直觀含義掏秩。
2.類名、方法名混淆
對應(yīng)用程序的方法名和方法體進行混淆荆姆,保證源碼被逆向后很難明白它的真正功能蒙幻。
3.程序結(jié)構(gòu)混淆加密
對應(yīng)用程序邏輯結(jié)構(gòu)進行打亂混排,保證源碼可讀性降到最低胆筒。
4.反調(diào)試邮破、反注入等一些主動保護策略
這是一些主動保護策略,增大破解者調(diào)試仆救、分析APP的門檻抒和。
3.1字符串加密
字符串會暴露APP的很多關(guān)鍵信息,攻擊者可以根據(jù)界面顯示的字符串彤蔽,快速找到相關(guān)邏輯的處理函數(shù)摧莽,從而進行分析破解。加密字符串可以增加攻擊者閱讀代碼的難度以及根據(jù)字符串靜態(tài)搜索的難度顿痪。
比如一個APP中有如下的一些字符串定義在代碼文件中:
經(jīng)過加密后镊辕,代碼文件變成如下的形式:
里面已經(jīng)沒有明文的字符串了,全是用byte的形式保存的蚁袭,打包生成APP后征懈,他們也就無法直觀的看出實際內(nèi)容了,這對破解者會造成巨大的難度:
3.2符號混淆
符號混淆的中心思想是將類名、方法名揩悄、變量名替換為無意義符號卖哎,提高應(yīng)用安全性;防止敏感符號被class-dump工具提取删性,防止IDA Pro等工具反編譯后分析業(yè)務(wù)代碼亏娜。
比如一款混淆后的APP,用IDA等工具打開,如下圖所示:
“Labels”欄里蹬挺,顯示的這些符號维贺,不管是類名還是方法名,誰也看不出來到底什么意思汗侵,這個函數(shù)到底是什么功能幸缕,就有點丈二和尚摸不著頭腦的感覺,這就大大增加了破解者分析APP的難度晰韵。
3.3代碼邏輯混淆
代碼邏輯混淆有以下幾個方面的含義:
對方法體進行混淆发乔,保證源碼被逆向后該部分的代碼有很大的迷惑性,因為有一些垃圾代碼的存在雪猪;
對應(yīng)用程序邏輯結(jié)構(gòu)進行打亂混排栏尚,保證源碼可讀性降到最低冤灾,這很容易把破解者帶到溝里去骆姐;
它擁有和原始的代碼一樣的功能灵巧,這是最最關(guān)鍵的略号。
混淆前后的對比如下(左邊是原始結(jié)構(gòu),右邊是混淆后的結(jié)構(gòu)):
下面以iOS APP中的main函數(shù)為例:
它就只有一行有效代碼纵菌,包含兩個關(guān)鍵函數(shù)阐污,已經(jīng)算最簡單的函數(shù)體了,混淆前的匯編代碼如下:
這里主要包含兩個API的符號: NSStringFromClass咱圆、UIApplicationMain笛辟。其余就是一些消息發(fā)送以及內(nèi)存管理的相關(guān)符號,但如果進行一定的代碼邏輯混淆后序苏,這個結(jié)構(gòu)就會變得大不一樣了手幢。
NSStringFromClass、UIApplicationMain這兩個函數(shù)忱详,邏輯結(jié)構(gòu)已經(jīng)變得非常復雜了围来,如果一個函數(shù)中,包含更多的代碼的話匈睁,那這個結(jié)構(gòu)將更加復雜监透,對破解者來說將是一個很耗時間、精力的過程软舌,一般早早就會放棄分析了才漆。
3.4URL編碼加密
對程序中出現(xiàn)的URL進行編碼加密,防止URL被靜態(tài)分析佛点。
3.5網(wǎng)絡(luò)傳輸數(shù)據(jù)加密
對客戶端傳輸數(shù)據(jù)提供加密方案,防止通過網(wǎng)絡(luò)接口的攔截獲取數(shù)據(jù)黎比。
3.6主動保護策略
除了上面的一些被動保護方法超营,我們還可以加入一些主動的防護機制,比如反調(diào)試等阅虫。
iOS平臺下的Anti-Debug方法一般有以下一些:
檢查進程的狀態(tài)是否為 P_TRACED演闭。
調(diào)用ptrace請求來檢查進程是否被調(diào)試。由于可能被攻擊者繞過該方法的調(diào)用颓帝,在應(yīng)用的多處增加ptrace函數(shù)會提高應(yīng)用的安全性米碰。
通過sysctl查看信息進程里的標記,判斷自己是否正在被調(diào)試购城。sysctl是用以查詢內(nèi)核狀態(tài)的接口吕座,并允許具備相應(yīng)權(quán)限的進程設(shè)置內(nèi)核狀態(tài)。
iOS下的這些方法瘪板,相對于Linux下的方法要少很多吴趴,例如fork一個子進程,ptrace父進程進行檢測方式不再奏效侮攀。而且锣枝,要完全防止程序被調(diào)試或者被逆向厢拭,理論上是不可能的,但可以增加破解者調(diào)試的難度撇叁。
總之供鸠,添加以上的一些保護措施后,iOS
APP的安全性會獲得很大的增強陨闹,大大提高了破解者破解的難度楞捂。對于iOS開發(fā)者來說,有必要了解這些措施正林,特別是針對一些金融泡一、證券類APP的開發(fā),保護方面的需求比較大觅廓,比如國內(nèi)某知名移動支付工具就添加了一些調(diào)試檢測以及反調(diào)試的功能鼻忠。