iOS 如何進行逆向工程

Android 的源碼是開放的, 開發者很容易瞭解系統機制, 但是 iOS 的代碼是封閉的, 單從文檔上還是不足以深入的瞭解系統機制, 有沒有方法能夠對 iOS 進行逆向工程, 讓開發者能夠更深入瞭解系統?


按照意圖和深度的話,大概有這麼幾種途徑與資源:

  1. 爲了學習框架,提升開發水平,可以看看私有API列表。iOS (Cocoa Touch)的各私有API都可以通過runtime查看獲得,您可以自己寫個method browser。如果覺得麻煩的話可以到Github看現成的,我收藏了倆: github.com/kennytm/ipho github.com/nst/iOS-Runt ,但還是推薦自己來實時獲取,因爲iOS在更新,API也在更新。在App Store產品中使用私有API是違反蘋果規定的,所以能不用這些API而實現一些功能是iOS工程師水平的體現。
  2. 對iOS工程師而言,如果只是開發的話(1)也就差不多了。如果您十分有愛,想了解API以下的東西的話,依然可以利用Obj-C的runtime。可以在這裏看到 opensource.apple.com/so ,尤其是objc-runtime.m,這裏提供了很多學習用的"工具"。比如經典的method_exchangeImplementations(),您可以用它研究很多黑箱過程的來龍去脈。值得一提的是,這種技巧(method swizzling)是合法的,可以在App Store 中使用! 蘋果曾給使用了相關技巧的開發者發過郵件,表示出於安全性和穩定性最好不再使用,但沒有禁止。
  3. 如果是對系統本身感興趣的話,不妨越獄看看。iOS和Mac OS X類似,基於Darwin,是一種UNIX系統。越獄後你就有了root權,可以安裝個Terminal,裝gcc都沒問題的哈哈~ 接下來就像您研究Linux那樣擺弄就好了。對於開發者來說,有了root權也就可以寫一些system tweak或全局的代碼,自然也可以用來深入瞭解系統、原生app等。這方面我很久沒折騰了,所以不敢瞎說。
  4. 如果您是想成爲一名iOS Hacker的話,最近有本書挺火的: amazon.com/iOS-Hackers- 我沒空看不知道咋樣,但作者很神。另外現在iOS越獄界也有了自己的大會,可以看看“越獄夢之隊”的演講和文檔: absinthejailbreak.com/d 。如果您還是沒有滿足的話,可以看看從硬件入手的逆向工程和調試,分享一個我收藏的寶貝: wenku.baidu.com/view/da
  5. 另外說iOS代碼是封閉/閉源的其實不全對,蘋果算是開源界的一面大旗了,比如WebKit。iOS的組成部分也一樣是開源的,可以在官網 opensource.apple.com/ 看到,最新的iOS 5.1.1在這: opensource.apple.com/re 。但是如您所見,這裏並沒有iOS操作系統的代碼,而是一些庫和編譯器、調試器...其中JavaScriptCore和WebCore很有用,這兩者是WebKit的基礎,可以說WebKit是iOS最重要的組成之一,截止iOS 5 (6我還沒下呢=___=),所有多於一行文字的控件其實都是WebKit標準的(不可思議吧?!)。很多iOS的Hack都是從這裏開始的。說到WebKit,之前Comex大神的Spirit越獄(那個"Slide to Jailbreak")就是利用Safari->WebKit->PDF Engine->TIFF字體的漏洞實現了代碼注入!所以每一個系統組件都可能是iOS逆向/Hack的突破口!
ios和mac osx底層有過深入挖掘. mac和ios有互相借鑑的地方,所以以下提到的信息可能適用於ios或者mac。
  • 0x0.Background: 你必須要有很強的逆向sense,這個是逆向分析的基礎,逆向的sense舉個栗子:如果你發現看到一個產品之後能夠大致猜出它的架構,它的關鍵部分,核心算法以及可能存在的bug,甚至能夠猜出影響性能的是哪部分,這個需要很長時間的逆向分析和工程開發的經驗。BTW:語言什麼的就不說了,ARM,X86指令,Objective-C,C,C++
  • 0x1.Tools: 你需要掌握以下工具:otool,lipo,ar,libtool,class-dump,mach-o-view(有空讀一讀它的代碼,自己編譯以下,加點功能什麼的),hopper disassemble,ida pro,gdb,xcode開發要會的就不提了,還有一個很有用的codeunsign,最後再推薦一個我寫的一個magic類:cccssw/call_at_anywhere GitHub 這個類用途很廣,發揮餘地很多.
  • 0x2.Frameworks: 調用私有API什麼的是最簡單的部分,最直接的路徑是去private frameworks下面根據frameworks的名稱猜測各個framework是幹什麼的,然後用class-dump dump出header,在項目裏面引用就可以用了.如果觀察力到位,發現某些官方app有某些功能能夠猜測出背後可能有調用私有api,反彙編這個官方程序就能找到私有api的調用形式.
  • 0x3.Kernel: ios 和macos都是bsd+mach-o的混合模型,網上有一個圖很清楚,說明其架構的. mach-o 的格式學習的最佳途徑就是看mach-oview這個開源項目的代碼。
  • 0x4.Defend technics used by Apple:用得最普遍得就是利用xpcservice將調用放在另外一個可執行程序中,然後函數調用通過進程間通信完成,核心得邏輯不會在這個xpc調用裏面,該xpc遠程程序會繼續調用底層frameworks,最後你就很難找到最核心的邏輯和算法到底在哪裏了;關鍵部分用c實現,然後隱藏data structure,只留出必要的指針,hidden pointer的技術,keychain的實現就是這樣做的,要逆向出它keychain的數據庫格式非常難,嘗試過,失敗了;另外一方面可能考慮到代碼的可維護性,大部分蘋果的代碼都有很詳細的log,可能有開關控制log的打開關閉,如果能把log開起來,一個程序,framework就很容易跟蹤了(靜態分析),打開這些log一般要直接修改二進制文件,或者修改特殊的plist文件.
  • 0x5.static analysis:靜態分析一般就是先定位最關鍵的地方,定位的方法很多,一般先開log,然後分析完log後通過關鍵字來找。定位成功後,沒有什麼底層技術時,你想要乾的事情基本上就快完成了,邏輯就在你面前,彙編配合僞代碼就很簡單了(除了有FSM或者jmp table的情況,這種情況還是動態分析吧). 有些涉及到底層技術,有一種內核級別調用的陷入函數(涉及到mach-o內核機制)比較麻煩,這種情況也有一些辦法,做起來怎麼樣都是限制大,這篇文章How I cracked the security foundation of Mac OSX System 提供了一些技巧和思路。
  • 0x6.dynamic analysis:動態分析要配合靜態來做,主要還是用xcode的調試器或者gdb,xcode的符號斷點.f6-f7-f6慢慢調.
  • 0x7.reimplement logics:功能重現,逆向裏面經常要做的事情,一個加密算法,解密算法要重新實現一遍,讓自己可以用。途徑有兩條:1.照着匯編寫出彙編版,c版或者objective-c的實現;2.直接調用二進制中的函數. 途徑1是考你功底的,功底深做起來就是個體力活而已。途徑2有兩條路,一是修改二進制文件,或者patch你要的邏輯到一個有架子了的二進制文件,二是計算函數地址動態加載。 重點講一下途徑2,靜態修改很麻煩,直接暴露需要解決以下問題:mach-o文件中有兩個section與export function有關,其中一個Symbol table和與之相關的String table較容易修改,另外一個是Dynamic loader info比較難修改,裏面有的相對位置需要做uleb128轉換,另外存儲信息的格式是鏈表格式,解決這兩個就可以了. 靜態修改除了這些,mach-o前面與section對應的頭信息也要修改,長度,位置偏移量.; 途徑2的動態加載就不多說了,看我github的項目call_it_any_where 應該是目前爲止最方便的方式。
  • 0x8.jail-development:越獄開發其實門檻比app store還要低.這一塊與逆向有關的主要是hook class之類的,老外有一篇很詳細的博文講這塊。貌似就在後面的blog list裏面.
  • 0x9.security issues: 建議手機別越獄,mac和ios下的maleware其實比windows下面還難發現.;keychain裏面即使最嚴格的ACL策略也是能夠繞過的;
講一講會逆向的好處:逆向是一門藝術也是一種研究方法,能夠讓你弄清楚程序運行的本來面目。看別人的實現也可以用來提升自己的架構能力。逆向能夠找到一些詭異問題的root reason。最重要的是逆向能力強後,對程序,代碼,算法,數據結構,計算機體系的認識會深刻很多。做項目也會從容很多,不太再會遇到什麼bug搞不定。另外個人認爲在漏洞挖掘上比起fuzzy逆向纔是正途。
不會逆向的程序員不是好程序員。
最後再給些blog供學習:

發佈了25 篇原創文章 · 獲贊 6 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章