推薦序
前兩天在「貓頭鷹團隊」的公眾號看到這篇文章,于是我要了轉載授權,推薦給大家。
本文的作者沙梓社和吳航共同編寫了《 iOS 應用逆向工程》,文章中介紹的是一些基本的 iOS 領域的安全知識,但是由于普及不夠,基本上沒有被人們重視,希望本文能讓大家重視到 iOS 的源代碼安全問題。
另外預告一下,我認識的一個做移動安全的白帽子即將公開一個在非越獄手機上通過 App 繞過 的 iOS 漏洞視頻,并且計劃發布一系列 iOS 系統安全方面的文章。我爭取到了授權,并在我的公眾號上同步發表這些文章,敬請期待:)
以下是文章正文,略有調整。
講師介紹-沙梓社
湖北武漢人,《iOS 應用逆向工程》系列圖書的作者,在 Cydia(最大的越獄 iOS 商店)上有 11 款獨立作品,接受過 CSDN 的專訪,書的英文版在 上開源后收獲了 2600+ stars,是首位在 WWJC 上發表演講的中國人,以「提升中國 iOS 開發者在國際上的地位」為己任。
在很多朋友的眼里,iOS 逆向工程是一個小眾、神秘的方向,為什么我會選擇這個小眾的方向呢?這要從我最喜歡的一首詩說起。第一次,我是在李開復的自傳《世界因你不同》里看到這首詩,當時就感覺身心得到了非常強烈的震撼:
因為我感覺到自己就是這類人:如果有兩條路給我選,我確實會選更少人走的那一條。我發現自己是一個刻意保持自己跟別人不同的人。
在初次讀到這首詩時,我還沒有開始學習 iOS。在從事 iOS 方面的研究后,又從喬幫主親自配音的廣告中尋找到了靈感,發現蘋果跟我的價值觀非常一致,就是要追求不同。因此,我更加認定 iOS 就是我的主攻方向。
我的成長之路,就是一條與眾不同的未選之路:別人都在學「大眾情人」 時,我開始學「小眾路人」iOS;別人都在學 iOS 正向開發時,我開始學 iOS 逆向工程。正是因為追求不同,我寫的《iOS 應用逆向工程》成為了全球唯一一本 iOS 逆向相關書籍,而且有美國和韓國的出版社想要引進本書,打破了中國 iOS 知識產權零輸出的尷尬紀錄。我用自己的努力代表中國 iOS 開發者在國際上發聲,而且為 iOS 主流社區所認可,作為中國人我感到非常自豪。
簡單來說,我所研究的,主要是 iOS 應用層的逆向工程,對內核層的逆向工程只是稍有涉獵,沒有入門。應用層的逆向工程,我感覺自己玩得差不多了,應用層的所有逆向工程相關問題,都可以用我那本書上介紹過的知識和技術得到解決,我覺得沒有太大挑戰性了,主要是勞動量問題。到了這個地步,我的規劃主要分為 2 個方向:
繼續從事內核研究,這個方向的終點是「越獄」(越獄即通過漏洞利用拿到iOS的root權限,代表了iOS技術研究的最高境界);
換個腦子,用一些非技術能力武裝自己,讓自己成為一專多能的人才。這個方向的終點就是創業。
當然,很多朋友會問,IT 人員創業的普遍做法,都是去 BAT 這樣的互聯網公司干 2 年,觀察一下他們的玩法,然后拉一個團隊出來干。你問啥不這么干呢?主要是碰到了一個很好的項目。大公司一直都在那里,想什么時候去都可以;而好項目卻不常有,機會過去就過去了,不等人,所以我在準備并不算充分的情況下選擇了創業這條路。
交代完了我的背景,咱們可以進入正題了
大意是「通過研究現有功能的實現原理,理解并融會貫通,在此基礎上實現(甚至增強)這個功能。」也就是說,不是照貓畫虎,而是師夷長技,「借刀殺人」。
在我的理解里,逆向工程是一種工程師式的高級思維方式。給你水、面粉、糖、芝麻,讓你做燒餅,這是正向工程;給你一個燒餅,讓你分析出它是由多少水、多少面粉、多少糖、多少芝麻組成的,這是逆向工程。也就是說,根據圖紙制作實物的這個過程是正向工程,而根據實物倒推圖紙的這個過程則是逆向工程。喬布斯曾說「Good copy; Great steal.」逆向工程有異曲同工之妙。
舉幾個通過逆向工程師夷長技的例子:
除了去學習別人的長處,逆向工程還可以發現自己和別人的短處:
這種低級錯誤,星巴克可以犯,但不能犯;這取決于你的產品定位。這個錯誤當然是通過逆向工程發現的。
這是某世界500強企業犯的,通過HTTP協議明文傳輸用戶手機和密碼的低級錯誤:
這是某突破3億用戶的移動App:
把傳輸協議的密鑰硬編碼在代碼里,有逆向工程基礎的朋友可以輕松還原整套網絡傳輸協議。淘寶上一堆堆的這個刷榜那個刷贊,就是這個原理。
阿凹(貓友會吉祥物,一個微信機器人),是「借刀殺人」最典型的運用之一:
阿凹的實現原理,簡單說,就是通過逆向工程的方式找出微信iOS客戶端的收發信息等私有接口,然后基于自己的邏輯調用這些接口,實現針對特殊事件的自動化應答功能。
我個人最常用的iOS逆向工程工具主要有這些:
class-dump的效果,圖中顯示的是新浪微博App的所有頭文件:
的效果,可以看到微信星號密碼的明文:
Theos開發插件的運行效果:
所有進程的[ :]方法均被「hook」,可以隨意篡改。
IDA的效果:
對于熟悉匯編語言(圖里是ARM匯編)的朋友來說,所有未加密的二進制文件,均等同于開源。這是什么概念,做技術的都懂。
接下來我簡單介紹下阿凹的制作流程:
核心在于找到收發微信消息的函數,然后加以修改利用:
用給微信砸殼,解密出的文件近50M:
class-dump出微信的所有頭文件,近7000個:
定位到收消息的View,進而定位到V對應的C,找出邏輯層的收消息函數。
定位到發消息的按鈕(也是一個View),進而定位到對應的C,找出邏輯層的發消息函數(這個過程沒法用截圖表現出來,所以我只簡單描述下)。
組合收發函數,完成阿凹的邏輯,最后寫代碼:
問題及討論環節
【問】沙大神,如果我成功找到了一個應用的加密函數,然后剩下的工作就是把它翻譯成OC語言,這個過程有什么技巧么?我ARM匯編沒怎么接觸過,除了硬著頭皮上,有木有什么捷徑= =!
【答】如果你是土豪,那么可以購買IDA pro,1年十幾萬上下。可以把二進制文件給反編譯成C語言。如果你不是,可以500塊人民幣購買,支持32位ARM匯編的反編譯,直接反編譯成C語言
【問】SOGA,也就是我需要從一臺ARM v7的機器拿到二進制文件,之后采用這種方法對么
【答】是的,買一臺二手 5即可
【問】你好沙神,比如說我用對用戶的聊天記錄進行加密,逆向工程能破解這個本地化的庫文件么
【答】可以破
【問】那就是其實也不是絕對安全
【答】只要這個庫在本地,可以被你的App解密,那么我就也可以解密;如果這個庫在你本地沒法解密,那我可能也沒法解密。微信本身提供了紅包功能,阿凹就可以搶紅包,只是這個功能我沒開放出來,破壞游戲平衡了;微信本身沒有提供沖廁所的功能,所以我也沒辦法實現。
【問】額,意思 那就是只能看逆向者的三觀了
【答】是這樣的,這是把雙刃劍。上一個復旦大學生開源的搶紅包代碼,1000多個star,洋洋灑灑幾千行代碼,我可以50行以內搞定,我只是覺得開源出來沒啥意義,就算了
【問】那我又得問正向問題,就沒有級別比較高的用戶本地數據全保障方法了么
【答】參考支付寶和
【問】能給講下支付寶和大概是怎么處理的么
【答】我也沒有研究過,因為暫時用不到……
【問】阿凹回答問題的答案是調的什么資源?還是通過自己分詞得來的?
【答】是用的圖靈機器人。微信本身只提供了消息收發接口,發的是什么消息,是由圖靈機器人決定的。我本來打算加入語音識別功能的,用科大訊飛,但是現在太忙了,沒時間,就先擱置了
【問】既然說到微信搶紅包,沙大神我再問個問題。我猜想微信搶紅包和發送聊天消息有點類似,通過檢測紅包發送消息和找到紅包點擊函數來快速搶紅包。那么之前我也見過有人因為搶紅包被微信發現禁用搶紅包功能7天,請問沙大神,如果你是微信開發人員,你會采取什么手段來防范逆向開發人員
【答】這取決于用逆向工程干什么,如果是寫個阿凹這樣的機器人,我覺得無傷大雅。如果是搶紅包,那我能想到的一個直觀防范方式,就是如果發紅包和搶紅包的時間間隔非常短,比如1秒內,那么說明是用外掛了。另外就是把這部分代碼寫得難懂一點,那么逆向工程的難度也就大一點。
【問】我理解,理論上逆向工程都可以通過找到對應函數完成應用原本的功能,比如點擊事件等
【答】是這樣的,矛和盾總是沒有止境的,只是看逆向工程付出的代價多大了。提高逆向工程的難度軟件逆向工程是什么意思,讓逆向工程師覺得不值得,是最好的防范方式。蘋果防越獄,就非常高明,我把你們越獄社區最好的點子全都學習到了正版iOS里,用戶覺得蘋果越來越好用了,越獄越來越沒有意義了。越的人少了,高手覺得沒意思了軟件逆向工程是什么意思,自然就防住了。
【問】嗯,那么能簡單介紹幾種常用提高逆向成本的正向開發手段么
【答】用C/C++函數寫核心功能;關鍵功能函數名起個完全不相干的東西;編譯MachO時加上、標記等方法;Swift/ObjC混編。這幾個方法,可以防住絕大多數腳本小子了。
【問】我以前看過一本安全的書說用C++寫然后代碼用大量模版,逆向人就會瘋了,是這樣么?
【答】C++確實不好逆向
招人
沙梓社在上海創業,現在找靠譜java后端,找的火急火燎。這里有簡介: 和他的2015年終總結: 如果大家在上海有認識的靠譜java后端,麻煩幫我引薦一下,叩謝!
關于貓友會大講壇
本次分享來自貓友會大講壇。貓友會大講壇是“貓友會”開設的一個知識分享欄目,”知識分享,是能力的鍛煉,雙方都會有收獲。
全文完。
贊助商: