一逗嫡、Reveal
1询微、Reveal簡(jiǎn)介和下載
Reveal是一款調(diào)試iOS程序UI界面的神器。
官網(wǎng):https://revealapp.com 官網(wǎng)下載:https://revealapp.com/download/
建議下載至少Reveal4版本统屈,支持USB連接調(diào)試胚吁,速度快。低版本的只能WiFi連接調(diào)試愁憔。
百度云下載:Reveal4 提取密碼:b31u
2腕扶、越獄手機(jī)配置
1)Reveal Loader安裝
首先我們打款越獄設(shè)備的Cydia,然后在搜索中輸入Reveal Loader吨掌,并且進(jìn)行安裝即可半抱,下方是安裝后的效果。這一步比較簡(jiǎn)單膜宋,安裝后重啟SpringBoard即可窿侈。如果安裝的Reveal Loader不支持新版的Reveal,也可以在該軟件源上安裝:http://apt.so/codermjlee
2)打開需要調(diào)試的APP
3)導(dǎo)入libReveal.dylib
- 找到Mac的Reveal中的
RevealServer
文件秋茫,覆蓋iPhone的/Library/RHRevealLoader/RevealServer
文件 - 重啟SpringBoard或者重啟手機(jī)史简,可以在iPhone上輸入終端命令
- 重啟SpringBoard:
killall SpringBoard
;重啟手機(jī):reboot
4)開始調(diào)試APP
手機(jī)上打開需要調(diào)試的app肛著,保持在前臺(tái)狀態(tài)圆兵;然后mac上Reveal會(huì)顯示對(duì)應(yīng)的應(yīng)用圖標(biāo),點(diǎn)擊圖標(biāo)枢贿,就能查看該APP的UI層級(jí)圖了
二殉农、class-dump
顧名思義,它的作用就是把Mach-O文件的class信息給dump出來(lái)(把類信息給導(dǎo)出來(lái))局荚,生成對(duì)應(yīng)的.h頭文件超凳。官方地址:http://stevenygard.com/projects/class-dump/
下載完工具包后將class-dump文件復(fù)制到Mac的/usr/local/bin
目錄,這樣在終端就能識(shí)別class-dump
命令了
常用格式用法:`class-dump -H Mach-O文件路徑 -o 頭文件存放目錄``
-
-H
表示要生成頭文件 -
-o
用于制定頭文件的存放目錄
三、Hopper Disassmbler
使用Hopper Disassembler, 通過(guò)將匯編代碼轉(zhuǎn)成偽代碼聪建,了解其他App的實(shí)現(xiàn), 以學(xué)習(xí)他人優(yōu)秀的精髓之處
已上傳網(wǎng)盤:Hopper+4.0.8 網(wǎng)盤密碼:zr4t
1钙畔、基本使用
1)打開Mach-o可執(zhí)行文件
可以先選擇適用版本的Hopper Disassmbler,然后打開ipa文件中的可執(zhí)行文件
2)查看對(duì)應(yīng)偽代碼
待Hopper Disassmbler掃描完之后(可以在右下腳查看金麸,是否還在working中)擎析。首次掃描建議使用簡(jiǎn)單的包,先熟悉入口挥下,大的包掃描時(shí)間較久揍魂,而且還容易出問題。然后按照?qǐng)D片中的操作就可以查看偽代碼了棚瘟。
2现斋、使用Python 腳本導(dǎo)出偽代碼
Class Decompile是一個(gè)用于Hopper反匯編器的python腳本。這個(gè)腳本可以導(dǎo)出類的偽代碼偎蘸。
GitHub鏈接: https://github.com/poboke/Class-Decompile
1)將下載的Class Decompile.py文件放到
~/Library/Application Support/Hopper/Scripts
目錄里庄蹋。2)將可執(zhí)行文件拖到Hopper里,等待分析完成迷雪。如果日志框里出現(xiàn)以下文字限书,就說(shuō)明分析完成了:
Analysis segment __LINKEDIT
Analysis segment External Symbols
Background analysis ended
- 3)點(diǎn)擊菜單 Scripts –> Class Decompile :
- 4)Hopper會(huì)出現(xiàn)一個(gè)彈框,可以選擇反編譯類型:
- Decompile All Classes : 反編譯所有類
- Decompile One Class : 反編譯單個(gè)類
- Cancel : 取消
- 5)如果選擇反編譯單個(gè)類的話章咧,會(huì)出現(xiàn)以下彈框:
輸入某個(gè)類名后倦西,點(diǎn)擊 OK 按鈕就可以反編譯出該類的偽代碼。
- 6)反編譯出來(lái)的偽代碼保存在~/ClassDecompiles目錄里赁严。
- 7)打開反編譯的文件扰柠,例如CalculatorController.m,可以看到生成的偽代碼:
@implementation TTFQuizShowLiveRoomViewModel
- (void)setCurSignCount:(id)arg2
{
STK35 = r7;
r7 = &arg_C;
STK37 = r8;
sp = sp + 0xfffffffffffffffc - 0x4;
r8 = self;
r0 = *objc_ivar_offset_TTFQuizShowLiveRoomViewModel__curSignCount;
*(r8 + r0) = arg2;
*0x88 = r3;
var_0 = r3;
loc_e09f98(NSString, @selector(stringWithFormat:), cfstring__, arg2, STK37, lr, STK35, r6, r5, r4);
r5 = loc_e09f9c();
loc_e09f98(r8, @selector(curSignCountStr));
r7 = r7;
r6 = loc_e09f9c();
r1 = @selector(isEqualToString:);
r4 = loc_e09f98(r5, r1, r6);
loc_e09f94(r6);
if (r4 == 0x0) {
r1 = @selector(setCurSignCountStr:);
loc_e09f98(r8, r1, r5);
}
r0 = r5;
Pop();
Pop();
Pop();
Pop();
Pop();
r0 = loc_1be412c(r0, r1);
return;
}
@end
四疼约、MachOView
1卤档、MachOView的下載安裝
MachOView工具可Mac平臺(tái)中可查看MachO文件格式信息,IOS系統(tǒng)中可執(zhí)行程序?qū)儆贛ach-O文件格式忆谓,有必要介紹如何利用工具快速查看Mach-O文件格式裆装。MachOView工具屬于免費(fèi)開源項(xiàng)目踱承。
源代碼可在https://github.com/gdbinit/MachOView下載
或者直接下載別人封裝好的:https://github.com/fangshufeng/MachOView/releases
將“MachOView”拖到Application文件夾倡缠,就可以像其他程序一樣啟動(dòng)了
2、MachOView的使用
1)打開MachOView
點(diǎn)擊MachOView工具的主菜單“File”中的“Open”選項(xiàng)便可加載IOS平臺(tái)可執(zhí)行文件
2)文件頭信息
MachOView工具成功加載Mach-O文件之后茎活,每個(gè).o文件對(duì)應(yīng)一個(gè)類編譯后的文件昙沦,展開每個(gè)類后,在左邊窗口點(diǎn)擊“Mach Header”選項(xiàng)载荔,可以看到每個(gè)類的cpu架構(gòu)信息盾饮、load commands數(shù)量 、load commandssize 、file type等信息丘损。 如上圖所示普办。
五、Mach-O文件介紹
1徘钥、Mach-O介紹
Mach-O是Mach object的縮寫衔蹲,是Mac\iOS上用于存儲(chǔ)程序、庫(kù)的標(biāo)準(zhǔn)格式
屬于Mach-O格式的文件類型有
可以在xnu源碼中呈础,查看到Mach-O格式的詳細(xì)定義(https://opensource.apple.com/tarballs/xnu/)
EXTERNAL_HEADERS/mach-o/fat.h
EXTERNAL_HEADERS/mach-o/loader.h
2舆驶、常見的Mach-O文件類型
-
MH_OBJECT
- 目標(biāo)文件(.o)
- 靜態(tài)庫(kù)文件(.a),靜態(tài)庫(kù)其實(shí)就是N個(gè).o合并在一起
-
MH_EXECUTE:可執(zhí)行文件
- .app/xx
-
MH_DYLIB:動(dòng)態(tài)庫(kù)文件
- .dylib
- .framework/xx
-
MH_DYLINKER:動(dòng)態(tài)鏈接編輯器
- /usr/lib/dyld
-
MH_DSYM:存儲(chǔ)著二進(jìn)制文件符號(hào)信息的文件
- .dSYM/Contents/Resources/DWARF/xx(常用于分析APP的崩潰信息)
3而钞、Mach-O的基本結(jié)構(gòu)
一個(gè)Mach-O文件包含3個(gè)主要區(qū)域:
Header :文件類型沙廉、目標(biāo)架構(gòu)類型等
Load commands:描述文件在虛擬內(nèi)存中的邏輯結(jié)構(gòu)、布局
Raw segment data:在Load commands中定義的Segment的原始數(shù)據(jù)
4臼节、窺探Mach-O的結(jié)構(gòu)
命令行工具
file:查看Mach-O的文件類型撬陵。file 文件路徑
otool:查看Mach-O特定部分和段的內(nèi)容
-
lipo:常用于多架構(gòu)Mach-O文件的處理
- 查看架構(gòu)信息:lipo -info 文件路徑
- 導(dǎo)出某種特定架構(gòu):lipo 文件路徑 -thin 架構(gòu)類型 -output 輸出文件路徑
- 合并多種架構(gòu):lipo 文件路徑1 文件路徑2 -output 輸出文件路徑
4、Universal Binary(通用二進(jìn)制文件)
通用二進(jìn)制文件网缝。同時(shí)適用于多種架構(gòu)的二進(jìn)制文件袱结。包含了多種不同架構(gòu)的獨(dú)立的二進(jìn)制文件。
因?yàn)樾枰獌?chǔ)存多種架構(gòu)的代碼途凫,通用二進(jìn)制文件通常比單一平臺(tái)二進(jìn)制的程序要大垢夹。
由于兩種架構(gòu)有共同的一些資源,所以并不會(huì)達(dá)到單一版本的兩倍之多维费。
因?yàn)槲募仍瓉?lái)的要大果元,也被稱為“胖二進(jìn)制文件”(Fat Binary)。