iOS 如何進行逆向工程?

Android 的源碼是開放的, 開發者很容易了解系統機制, 但是 iOS 的代碼是封閉的, 單從文檔上還是不足以深入的了解系統機制, 有沒有方法能夠對 iOS 進行逆向工程, 讓開發者能夠更深入了解系統? (當然這個是違反蘋果規定的, 但是如果能從源碼了解系統, 還是要比滿世界找文檔要好的多。)


有幸被邀請回答,不過不知道您要了解的"系統機制"有多深入? ;-)

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

  1. 為了學習框架,提升開發水平,可以看看私有API列表。iOS (Cocoa Touch)的各私有API都可以通過runtime查看獲得,您可以自己寫個method browser。如果覺得麻煩的話可以到Github看現成的,我收藏了倆: https://github.com/kennytm/iphone-private-frameworks 和 https://github.com/nst/iOS-Runtime-Headers ,但還是推薦自己來實時獲取,因為iOS在更新,API也在更新。在App Store產品中使用私有API是違反蘋果規定的,所以能不用這些API而實現一些功能是iOS工程師水平的體現。
  2. 對iOS工程師而言,如果只是開發的話(1)也就差不多了。如果您十分有愛,想了解API以下的東西的話,依然可以利用Obj-C的runtime。可以在這裡看到 http://opensource.apple.com/source/objc4/objc4-493.11/runtime/ ,尤其是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的話,最近有本書挺火的: http://www.amazon.com/iOS-Hackers-Handbook-Charlie-Miller/ 我沒空看不知道咋樣,但作者很神。另外現在iOS越獄界也有了自己的大會,可以看看「越獄夢之隊」的演講和文檔: http://absinthejailbreak.com/dream-team-presentation-at-hitbsecconf-videos/ 。如果您還是沒有滿足的話,可以看看從硬體入手的逆向工程和調試,分享一個我收藏的寶貝: http://wenku.baidu.com/view/dae22c30eefdc8d376ee32c9.html
  5. 另外說iOS代碼是封閉/閉源的其實不全對,蘋果算是開源界的一面大旗了,比如WebKit。iOS的組成部分也一樣是開源的,可以在官網 http://opensource.apple.com/ 看到,最新的iOS 5.1.1在這: http://opensource.apple.com/release/ios-511/ 。但是如您所見,這裡並沒有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 app,應該是很容易的,class-dump,沒有意外的話,直接出全部的.h文件,而且非常清晰。常見的UI結構,基礎的數據對象,有了這些,即使看不到.m中的實現代碼,是不是也能看個大概了?

至於ios系統本身,看private api。

再往下,那就是大牛們的事了

最近對陌陌做了逆向,獲取Location坐標並在陌陌里加了一個地圖頁,這應該就屬於標準的App逆向,微博的技術貼里提到了相應的技術點,行內人看了應該就會明白,但全部的技術內容暫時應該不會整理出來,畢竟也要尊重一下app的原作者。

------------------------------------------------------------------------------------------------------------------------

時隔一年半,我把這些iOS逆向知識整理出版了一本入門級書《iOS應用逆向工程》,有興趣可以看看,順便了解一下#iOS逆向工程七種武器# :)


本人逆向經驗豐富,對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供學習:

  • Reverse Engineering Mac OS X

  • ChinaAlex
  • Reverse Engineering

  • rentzsch (Jonathan "Wolf" Rentzsch) GitHub

  • Matt Galloway

( 水平一般,如有錯誤和遺漏還請各位糾正、補充 ;-) )


主要是用 IDA Pro, gdb,vbindiff,class-dump 這類工具


向您推薦我們的入門教程:[新人請看][看雪iOS安全小組]置頂嚮導集合貼


要追求底層 並一定需要逆向 ios很多底層代碼還是開源的 http://opensource.apple.com/ 如果要了解系統機制 建議先從macos入手 畢竟ios是從那兒改良的,並且他的限制也沒有那麼多。當然個人覺得先從文檔開始 了解他的設計思路 也不是壞事。


路過推薦幾個工具

iOS端: otool,gdb,vbindiff,class-dump-z,有GUI界面的Flex用來代替class-dump-z效果很好,另iOS5需要ldid

Mac端:Hopper Disassembler(我喜歡這個多過於ida),otool,ida pro

PC端:ida pro(還用說嘛→_→)其他不曉得了歡迎補充


我覺得iOS逆向可以分為這門幾個部分去學:

1. iOS系統安全機制,這是逆向分析和實踐的基礎

2. OC runtime特性、MachO文件結構、簽名、動態庫等等,這些都是理論鋪墊,不要覺得無聊,搞懂了這些很多東西就會知道為什麼

3. 工具使用,這個倒沒有好說的,用的話學一下就會了,主要還是要去理解工具的原理,怎麼寫出自己的工具。

4. 實踐,再說多的都沒用,自己動手去分析幾個應用,逆向幾個功能,然後總結梳理,尋求更好的方案。

5. 保護,了解保護原理可以幫助你分析和繞過、也可以讓你更好的去深入和對抗。

另外,雲課堂搜索「逆向」有驚喜, (逃


跟風解答一下吧,因為最近項目整改所以研究了一下自己一直想接觸的這一領域,最簡單的應該是你應當使用class-dump進行dump獲取頭文件,接下來可以使用theos之類的編寫tweak軟體咯,這樣基本可以獲取大部分你想要的信息,再進一步配合靜態分析軟體IDA或者hoopper就可以獲取更準確代碼,以上無論是app還是framework都適用於基本的逆向分析了


看到上面那麼多說了,關鍵是底層要熟悉!


看大神們都說逆向實際上付出的精力大於回報,真的是這樣的狀況么?


各位好呀 公司急需iOS逆向分析 有沒有有興趣的呀?在杭州,公司boss既是創業者也是投資人!微信:okok0610


我的博客:http://rexq.me

我會經常發布一些逆向文章


理由完全很不充分,逆向iOS上的app倒還可以理解也相對比較容易,逆向iOS本身,那就追隨那些釋放越獄的牛人去吧!

FYI:

http://theiphonewiki.com/wiki/index.php?title=25C3_presentation_%22Hacking_the_iPhone%22


這個問題竟然能邀請到季逸超同學的回答,我也就會寫iOS,對逆向工程很感興趣,準備深入了解一番。


推薦閱讀:

android可以通過進入程序後台關閉運行程序達到減少內存佔用的目的,為什麼ios不行?
哪些 iOS 應用充分發揮了 64 位 A7 處理器的性能?
為什麼iOS偽後台,但是有很多軟體也會在後台一直運行?
作為iOS開發,需要具備怎樣的能力,才能在北上廣,拿到1萬的薪資?
資深 iOS 開發工程師需要達到什麼水平?

TAG:逆向工程 | iOS開發 | iOSPrivateAPI |