初始Mach-O

iOS APP從開發(fā)到安裝到手機(jī)的過程

1、通過編譯、鏈接、簽名生成.app文件,然后通過zip壓縮生成.ipa文件。

2、.ipa文件上傳AppStore下載安裝或使用iFunBox、Xcode等工具安裝。

逆向APP的思路

1、界面分析:通過使用Cycript、Reveal等工具進(jìn)行界面層級結(jié)構(gòu)等分項。

2、代碼分析:通過MachOView、class-dump、Hopper Disassembler、ida等工具對Mach-O文件進(jìn)行靜態(tài)分析。

3、動態(tài)調(diào)試:通過debugserver、LLDB對運行中的APP進(jìn)行代碼調(diào)試。

4、編寫代碼將自己的代碼注入到App中,必要時還可能需要重新簽名、打包ipa。

class-dump

把Mach-O文件的class信息dump出來(把類信息導(dǎo)出),生成對應(yīng)的.h頭文件。官方地址:http://stevenygard.com/projects/class-dump/。下載完工具包后將class-dump文件復(fù)制到Mac的/usr/local/bin目錄,這樣在終端就能識別class-dump命令了。class-dump使用命令:class-dump -H Mach-O可執(zhí)行文件 -o 輸出文件夾。

代碼的編譯過程

以O(shè)bjective-C為例,首先由Objective-C語言編譯成匯編語言,再由匯編語言編譯成機(jī)器語言,也就是Mach-O文件。在同一種架構(gòu)平臺下,每一條匯編指令都有與之對應(yīng)的唯一的機(jī)器指令,因此匯編語言與機(jī)器語言之間是可以準(zhǔn)確的進(jìn)行編譯和反編譯的。但從匯編語言反編譯到Objective-C只能做到大概,無法做到完全反編譯。

Hopper Disassmbler

可以將Mach-O文件的機(jī)器語言代碼反編譯成匯編代碼、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)緩存庫目錄

使用動態(tài)庫共享緩存的一個非常明顯的好處就是節(jié)省內(nèi)存,現(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++指令進(jìn)行編譯:/usr/bin/clang++ -o dsc_extractor dsc_extractor.cpp,輸出結(jié)果為dsc_extractor可執(zhí)行文件。

3、使用編譯好的dsc_extractor可執(zhí)行文件從動態(tài)庫共享緩存中抽取動態(tài)庫:./dsc_extractor dyld_shared_cache_arm64 arm64。輸出結(jié)果將放在arm64文件夾中。

抽取結(jié)果

Mach-O簡潔

Mach-O是Mach Object的縮寫,是Mac/iOS上用于存儲程序、庫的標(biāo)準(zhǔn)格式。Mach-O常見的文件類型主要有以下幾種:

1、MH_OBJECT:包括目標(biāo)文件(.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:存儲著二進(jìn)制文件符號信息的文件,例如編譯后位于.dSYM/Contents/Resources/DWARF/xx中的文件(常用于分析APP的崩潰信息)。

Mach-O基本結(jié)構(gòu)

一個Mach-O文件包含3個主要區(qū)域:

1、Header:文件類型、目標(biāo)架構(gòu)類型等。

2、Load commands:描述文件在虛擬內(nèi)存中的邏輯結(jié)構(gòu)、布局。

3、Raw segment data:在Load commands中定義的Segment的原始數(shù)據(jù)。

Mach-O窺探

可以通過使用命令行工具或GUI工具來窺探Mach-O結(jié)構(gòu)。

命令行工具:

1、file:查看Mach-O的文件類型。使用命令”file 文件路徑“。

2、otool:查看Mach-O特定部分和段的內(nèi)容。例如”otool -h 文件路徑“可以查看Mach-O文件的Header信息。

3、lipo:常用于多架構(gòu)Mach-O文件的處理。主要用法有查看架構(gòu)信息(ipo -info 文件路徑)、導(dǎo)出某種特定架構(gòu)(lipo 文件路徑 -thin 架構(gòu)類型 -output 輸出文件路徑)、合并多種架構(gòu)(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負(fù)責(zé)加載的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容