介紹一本好書:『iOS應用逆向工程』
吳航(@hangcom2010)是我在Juniper的前同事,我做設備端,他做網管端,平時交流不多。後來我倆前後腳離開Juniper,我出去創業,他也開始了他的互聯網生涯。後來機緣巧合,從iPad版的知乎月刊這個應用上,我竟然發現了他的大名,和他在微博中多有交流;之後,再見到他的名字出現,就是他和朋友合著的這本沉甸甸,內容翔實的『iOS應用逆向工程』。
這書我先是從朋友那裡借來看了一陣,不過癮,又自己買了一本,大致通讀一邊,感慨頗深。
逆向工程(Reverse Engineering)
每個程序員都該有一顆逆向工程的心。作為一個嵌入式系統出身的人,這本書的很多內容把我拉回到剛工作時那激情燃燒的年代。那時對嵌入式設備還懵懵懂懂的我就加入到了Reverse Engineering思科HSRP協議 [1] 的大軍中,從兩台設備間的通訊過程中一點點還原協議的原貌。逆向工程需要的能力,就如這本書所表達的,主要是耐性 —— 堅持,再堅持多一點點,也許就能見到曙光。
可惜我這對事物本原好奇和探索的心態,在後來漸漸消失。用tcpdump做協議抓包是為了分析問題,而不是探索未知的領域;GDB查看寄存器狀態,細摳各種CPU的aseembly是為了解決coredump,而非分析目標的實現細節。在使用了iPhone近三年來,我甚至都沒有看看每天都有什麼樣的數據從我的指間流入流出,背後是什麼樣的協議在支撐它們。
對於一個iOS開發者,了解別人的app如何運作非常有助於提高自己的能力。通過逆向工程,你可以回答這些問題:
要做聊天,xmpp是否是最佳選擇,大廠都在用什麼?
競爭對手提供了人臉識別功能,使用了什麼庫,怎麼做到的?
等等。
重新認識iPhone開發
坦白的說,我從未真正研習過iPhone開發,僅僅做過比hello world略高級一些的應用。所以讀整本書的過程中有些iPhone應用開發的概念我會比較吃力。但是,通過這本書我重新認識到了iPhone開發中的種種安全隱患。一個開發者,如果嘗試使用一下各種用於逆向工程的工具,以及了解逆向分析的過程,應該能夠學到很多日常開發中可能被忽視的教訓,比如說:
我的sqlite資料庫是否應該用sqlcipher加密?(其實不光sqlite,其它本地存儲的數據,都該有效保護起來)
和伺服器通訊的過程我是否應該用https保護?[2]
我的核心代碼哪些該放在伺服器端以避免反編譯,哪些該用c實現以提高反編譯的難度? [3]
說句題外話,由於沒有做加密,以前途客圈的一些產品的資料庫很容易被別人拿來使用。當一份資料庫是你靠編輯投入大量的人力和時間辛辛苦苦完成,卻因自己保護不到位而輕易被競爭對手使用,真是欲哭無淚啊。所以iOS工程師,可以多從逆向工程的角度,審視自己app潛在的風險。
小結
就寫這麼多,書中很多的例子還需要我自己一點點嘗試。不過讀這本書還是有一些前提的:一顆「鑽研」的心加上對iOS應用開發有一定程度的掌握(起碼能自己寫個簡單的app)。此外,越獄的設備請選擇低版本的iOS,並且最好是自己淘汰下來不用的設備,否則哪天把自己的天天用的手機搞崩了,恰巧手機里有不得不用,且只能在該手機使用的應用(比如說RSA token),就真的欲哭無淚了。
如果你在這個領域還讀過其它不錯的書,也歡迎與我分享。謝謝!
如果您覺得這篇文章不錯,請點贊。多謝!
歡迎訂閱公眾號『程序人生』(搜索微信號 programmer_life)。每篇文章都力求原汁原味,早8點與您相會。
1. Cisco的私有協議,Hot Standby Router Protocol
2. 這樣起碼tcpdump無法抓取;當然,如果對方採用斷點跟蹤,撰寫tweak,在消息過了SSL層,進入到處理之前將其log下來,還是會被偵聽到3. object C支持反射,很多工具可以將編譯後的目標還原地非常接近源代碼推薦閱讀: