一、Reveal
1、Reveal簡介和下載
Reveal是一款調試iOS程序UI界面的神器。
官網:https://revealapp.com 官網下載:https://revealapp.com/download/
建議下載至少Reveal4版本,支持USB連接調試,速度快。低版本的只能WiFi連接調試。
百度云下載:Reveal4 提取密碼:b31u
2、越獄手機配置
1)Reveal Loader安裝
首先我們打款越獄設備的Cydia,然后在搜索中輸入Reveal Loader,并且進行安裝即可,下方是安裝后的效果。這一步比較簡單,安裝后重啟SpringBoard即可。如果安裝的Reveal Loader不支持新版的Reveal,也可以在該軟件源上安裝:http://apt.so/codermjlee
2)打開需要調試的APP
3)導入libReveal.dylib
- 找到Mac的Reveal中的
RevealServer
文件,覆蓋iPhone的/Library/RHRevealLoader/RevealServer
文件 - 重啟SpringBoard或者重啟手機,可以在iPhone上輸入終端命令
- 重啟SpringBoard:
killall SpringBoard
;重啟手機:reboot
4)開始調試APP
手機上打開需要調試的app,保持在前臺狀態;然后mac上Reveal會顯示對應的應用圖標,點擊圖標,就能查看該APP的UI層級圖了
二、class-dump
顧名思義,它的作用就是把Mach-O文件的class信息給dump出來(把類信息給導出來),生成對應的.h頭文件。官方地址:http://stevenygard.com/projects/class-dump/
下載完工具包后將class-dump文件復制到Mac的/usr/local/bin
目錄,這樣在終端就能識別class-dump
命令了
常用格式用法:`class-dump -H Mach-O文件路徑 -o 頭文件存放目錄``
-
-H
表示要生成頭文件 -
-o
用于制定頭文件的存放目錄
三、Hopper Disassmbler
使用Hopper Disassembler, 通過將匯編代碼轉成偽代碼,了解其他App的實現, 以學習他人優秀的精髓之處
已上傳網盤:Hopper+4.0.8 網盤密碼:zr4t
1、基本使用
1)打開Mach-o可執行文件
可以先選擇適用版本的Hopper Disassmbler,然后打開ipa文件中的可執行文件
2)查看對應偽代碼
待Hopper Disassmbler掃描完之后(可以在右下腳查看,是否還在working中)。首次掃描建議使用簡單的包,先熟悉入口,大的包掃描時間較久,而且還容易出問題。然后按照圖片中的操作就可以查看偽代碼了。
2、使用Python 腳本導出偽代碼
Class Decompile是一個用于Hopper反匯編器的python腳本。這個腳本可以導出類的偽代碼。
GitHub鏈接: https://github.com/poboke/Class-Decompile
1)將下載的Class Decompile.py文件放到
~/Library/Application Support/Hopper/Scripts
目錄里。2)將可執行文件拖到Hopper里,等待分析完成。如果日志框里出現以下文字,就說明分析完成了:
Analysis segment __LINKEDIT
Analysis segment External Symbols
Background analysis ended
- 3)點擊菜單 Scripts –> Class Decompile :
- 4)Hopper會出現一個彈框,可以選擇反編譯類型:
- Decompile All Classes : 反編譯所有類
- Decompile One Class : 反編譯單個類
- Cancel : 取消
- 5)如果選擇反編譯單個類的話,會出現以下彈框:
輸入某個類名后,點擊 OK 按鈕就可以反編譯出該類的偽代碼。
- 6)反編譯出來的偽代碼保存在~/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平臺中可查看MachO文件格式信息,IOS系統中可執行程序屬于Mach-O文件格式,有必要介紹如何利用工具快速查看Mach-O文件格式。MachOView工具屬于免費開源項目。
源代碼可在https://github.com/gdbinit/MachOView下載
或者直接下載別人封裝好的:https://github.com/fangshufeng/MachOView/releases
將“MachOView”拖到Application文件夾,就可以像其他程序一樣啟動了
2、MachOView的使用
1)打開MachOView
點擊MachOView工具的主菜單“File”中的“Open”選項便可加載IOS平臺可執行文件
2)文件頭信息
MachOView工具成功加載Mach-O文件之后,每個.o文件對應一個類編譯后的文件,展開每個類后,在左邊窗口點擊“Mach Header”選項,可以看到每個類的cpu架構信息、load commands數量 、load commandssize 、file type等信息。 如上圖所示。
五、Mach-O文件介紹
1、Mach-O介紹
Mach-O是Mach object的縮寫,是Mac\iOS上用于存儲程序、庫的標準格式
屬于Mach-O格式的文件類型有
可以在xnu源碼中,查看到Mach-O格式的詳細定義(https://opensource.apple.com/tarballs/xnu/)
EXTERNAL_HEADERS/mach-o/fat.h
EXTERNAL_HEADERS/mach-o/loader.h
2、常見的Mach-O文件類型
-
MH_OBJECT
- 目標文件(.o)
- 靜態庫文件(.a),靜態庫其實就是N個.o合并在一起
-
MH_EXECUTE:可執行文件
- .app/xx
-
MH_DYLIB:動態庫文件
- .dylib
- .framework/xx
-
MH_DYLINKER:動態鏈接編輯器
- /usr/lib/dyld
-
MH_DSYM:存儲著二進制文件符號信息的文件
- .dSYM/Contents/Resources/DWARF/xx(常用于分析APP的崩潰信息)
3、Mach-O的基本結構
一個Mach-O文件包含3個主要區域:
Header :文件類型、目標架構類型等
Load commands:描述文件在虛擬內存中的邏輯結構、布局
Raw segment data:在Load commands中定義的Segment的原始數據
4、窺探Mach-O的結構
命令行工具
file:查看Mach-O的文件類型。file 文件路徑
otool:查看Mach-O特定部分和段的內容
-
lipo:常用于多架構Mach-O文件的處理
- 查看架構信息:lipo -info 文件路徑
- 導出某種特定架構:lipo 文件路徑 -thin 架構類型 -output 輸出文件路徑
- 合并多種架構:lipo 文件路徑1 文件路徑2 -output 輸出文件路徑
4、Universal Binary(通用二進制文件)
通用二進制文件。同時適用于多種架構的二進制文件。包含了多種不同架構的獨立的二進制文件。
因為需要儲存多種架構的代碼,通用二進制文件通常比單一平臺二進制的程序要大。
由于兩種架構有共同的一些資源,所以并不會達到單一版本的兩倍之多。
因為文件比原來的要大,也被稱為“胖二進制文件”(Fat Binary)。