iOS APP從開發(fā)到安裝到手機的過程
1诗充、通過編譯苍蔬、鏈接、簽名生成.app文件蝴蜓,然后通過zip壓縮生成.ipa文件碟绑。
2俺猿、.ipa文件上傳AppStore下載安裝或使用iFunBox、Xcode等工具安裝格仲。
逆向APP的思路
1押袍、界面分析:通過使用Cycript、Reveal等工具進行界面層級結構等分項凯肋。
2谊惭、代碼分析:通過MachOView、class-dump侮东、Hopper Disassembler圈盔、ida等工具對Mach-O文件進行靜態(tài)分析。
3悄雅、動態(tài)調試:通過debugserver驱敲、LLDB對運行中的APP進行代碼調試。
4宽闲、編寫代碼將自己的代碼注入到App中众眨,必要時還可能需要重新簽名、打包ipa容诬。
class-dump
把Mach-O文件的class信息dump出來(把類信息導出)娩梨,生成對應的.h頭文件。官方地址:http://stevenygard.com/projects/class-dump/览徒。下載完工具包后將class-dump文件復制到Mac的/usr/local/bin目錄姚建,這樣在終端就能識別class-dump命令了。class-dump使用命令:class-dump -H Mach-O可執(zhí)行文件 -o 輸出文件夾吱殉。
代碼的編譯過程
以Objective-C為例掸冤,首先由Objective-C語言編譯成匯編語言,再由匯編語言編譯成機器語言友雳,也就是Mach-O文件稿湿。在同一種架構平臺下,每一條匯編指令都有與之對應的唯一的機器指令押赊,因此匯編語言與機器語言之間是可以準確的進行編譯和反編譯的饺藤。但從匯編語言反編譯到Objective-C只能做到大概,無法做到完全反編譯流礁。
Hopper Disassmbler
可以將Mach-O文件的機器語言代碼反編譯成匯編代碼涕俗、OC偽代碼或Swift偽代碼的工具。
動態(tài)庫共享緩存
從iOS3.1開始神帅,為了提高性能再姑,絕大部分的系統(tǒng)動態(tài)庫文件都打包放到了一個緩存文件中(dyld shared cache)。在iPhone中的路徑為/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armX找御。
使用動態(tài)庫共享緩存的一個非常明顯的好處就是節(jié)省內存元镀,現(xiàn)在的ida绍填、Hopper反編譯工具都可以識別動態(tài)庫共享緩存。
Mac/iOS中使用/usr/lib/dyld程序來加載動態(tài)庫栖疑,dynamic link editor動態(tài)鏈接編輯器讨永,dynamic loader動態(tài)加載器。蘋果開源了dyld源碼:https://opensource.apple.com/tarballs/dyld/遇革。我們可以使用dyld源碼中的launch-cache/dsc_extractor.cpp從動態(tài)庫共享緩存中抽取動態(tài)庫卿闹。
1、將dsc_extractor.cpp文件中的#if 0前面的代碼(包括#if 0)刪除萝快,把最后面的#endif也刪除比原。
2、編譯dsc_extractor.cpp文件杠巡,使用Mac的/usr/bin/下的clang++指令進行編譯:/usr/bin/clang++ -o dsc_extractor dsc_extractor.cpp量窘,輸出結果為dsc_extractor可執(zhí)行文件。
3氢拥、使用編譯好的dsc_extractor可執(zhí)行文件從動態(tài)庫共享緩存中抽取動態(tài)庫:./dsc_extractor dyld_shared_cache_arm64 arm64蚌铜。輸出結果將放在arm64文件夾中。
Mach-O簡潔
Mach-O是Mach Object的縮寫嫩海,是Mac/iOS上用于存儲程序冬殃、庫的標準格式。Mach-O常見的文件類型主要有以下幾種:
1叁怪、MH_OBJECT:包括目標文件(.o)和靜態(tài)庫文件(.a审葬,可由N個.o文件合并成在一起)。
2奕谭、MH_EXECUTE:可執(zhí)行文件涣觉。
3、MH_DYLIB:動態(tài)庫文件血柳。包括.dylib文件和.framework/xx(例如UIKit.framework下的UIKit文件)官册。
4、MH_DYLINKER:動態(tài)鏈接編輯器(位置在iPhone的/usr/lib/dyld處)难捌。
5膝宁、MH_DSYM:存儲著二進制文件符號信息的文件,例如編譯后位于.dSYM/Contents/Resources/DWARF/xx中的文件(常用于分析APP的崩潰信息)根吁。
Mach-O基本結構
一個Mach-O文件包含3個主要區(qū)域:
1员淫、Header:文件類型、目標架構類型等击敌。
2介返、Load commands:描述文件在虛擬內存中的邏輯結構、布局愚争。
3映皆、Raw segment data:在Load commands中定義的Segment的原始數(shù)據(jù)挤聘。
Mach-O窺探
可以通過使用命令行工具或GUI工具來窺探Mach-O結構轰枝。
命令行工具:
1捅彻、file:查看Mach-O的文件類型。使用命令”file 文件路徑“鞍陨。
2步淹、otool:查看Mach-O特定部分和段的內容。例如”otool -h 文件路徑“可以查看Mach-O文件的Header信息诚撵。
3缭裆、lipo:常用于多架構Mach-O文件的處理。主要用法有查看架構信息(ipo -info 文件路徑)寿烟、導出某種特定架構(lipo 文件路徑 -thin 架構類型 -output 輸出文件路徑)澈驼、合并多種架構(lipo 文件路徑1 文件路徑2 -output 輸出文件路徑)。
GUI工具:
MachOView:選擇指定的Mach-O文件打開即可筛武。
dyld和Mach-O文件
dyld也屬于Mach-O文件缝其,但它可以用于加載MH_EXECUTE、MH_DYLIB徘六、MH_BUNDLE這三種Mach-O文件内边。事實上,APP的可執(zhí)行文件待锈、動態(tài)庫都是由dyld負責加載的漠其。