class-dump是用來dump目標文件的類信息的工具。它利用Objective-C語言的runtime的特性,將存儲在mach-O文件中的@interface和@protocol信息提取出來,並生成對應的.h文件。git
注:class-dump只能導出未經加密的App的頭文件。classdump是對"otool -ov" 信息的翻譯,以一種咱們熟悉的易讀的方式呈現,官方介紹以下:github
This is a command-line utility for examining the Objective-C runtime information stored in Mach-O files. It generates declarations for the classes, categories and protocols. This is the same information provided by using ‘otool -ov’, but presented as normal Objective-C declarations, so it is much more compact and readable.sass
打開連接後,選擇class-dump-3.5.dmg,進行下載。下載完成以後,將dmg文件中的class-dump複製到/usr/bin目錄,並在終端執行以下執行進行賦權:bash
sudo chmod 777 /usr/bin/class-dump
複製代碼
而後運行class-dump指令,便可看到以下結果: 微信
class-dump -H /Applications/Calculator.app -o /Users/GofLee/Desktop/CalculateHeads
複製代碼
【說明】架構
從上面的結果能夠看到,咱們有了這些.h文件以後,就能夠初步瞭解目標App的程序結構。後面能夠結合Reveal和cycript工具,更精準的分析目標App某個頁面的功能實現。 一樣的,咱們也能夠導出AppKit、UIKit的頭文件:app
class-dump -H /System/Library/Frameworks/AppKit.framework -o /Users/GofLee/Desktop/AppKitHeaders
複製代碼
【注意】:有時class-dump指令會執行失敗,沒法獲得想要的頭文件,或頭文件的內容是加密的密文。出現這種狀況是由於class-dump的做用對象必須是未經加密的可執行文件,通常App Store中下載的App都是通過簽名加密的,這個時候須要先進行砸殼。tcp
class-dump-z 是對 class-dump 和 class-dump-x 的改進版,徹底用C++重寫,避免動態調用,這使得 class-dump-z 比 class-dump 和 class-dump-x快10倍左右,而且能夠在 Linux、Mac、 iPhone 上運行。ide
cd到 dumpdecrypted的目錄下,而後運行以下命令
make //make以後會生成dumpdecrypted.dylib動態庫文件
而後將該動態庫文件拷貝到手機的tmp文件的目錄下
複製代碼
cycript -p TargetApp [[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
複製代碼
#"file:///var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE/Documents/"
複製代碼
cd /var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE/Documents/
複製代碼
注意:做以下操做以前你如要使用scp將dumpdecrypted.dylib文件提早拷貝到手機
scp dumpdecrypted.dylib . DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/749DC69A-3A8D-4B5C-9926-1220E69FC85F/WeChat.app/WeChat
複製代碼
獲取沙盒路徑的方式
ps -e | grep WeChat //找到微信的進程 app路徑
cycript -p WeChat //在進程中開啓cycript
dir = NSHomeDirectory() //獲取沙盒路徑
control +D 關閉cycript
複製代碼
Administratorde-iPhone:/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB root# ls
Documents/ Library/ tmp/
Administratorde-iPhone:/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB root# cd Documents/
Administratorde-iPhone:/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents root# ls
00000000000000000000000000000000/ MMResourceMgr/ app_tutt/
079d66db896f66ef28a7e029c2eff367/ MMappedKV/ heavy_user_id_mapping.dat
CrashReport/ MemoryStat/ mmupdateinfo.archive
LocalInfo.lst OpenImResource/
LoginInfo2.dat SafeMode.dat
Administratorde-iPhone:/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents root# cp /tmp/dumpdecrypted.dylib . //這一步須要提早將dumpdecrypted.dylib文件拷貝到手機的/tmp文件夾下
Administratorde-iPhone:/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents root# ls
00000000000000000000000000000000/ MMResourceMgr/ app_tutt/
079d66db896f66ef28a7e029c2eff367/ MMappedKV/ dumpdecrypted.dylib*
CrashReport/ MemoryStat/ heavy_user_id_mapping.dat
LocalInfo.lst OpenImResource/ mmupdateinfo.archive
LoginInfo2.dat SafeMode.dat
Administratorde-iPhone:/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents root#
複製代碼
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/E736B0BC-7ED4-42CE-8513-CE52F88F5F52/WeChat.app/WeChat
複製代碼
若是以上命令運行完成以後報以下錯誤 表示dumpdecrypted.dylib 沒有進行簽名 須要先進行簽名
dyld: could not load inserted library 'dumpdecrypted.dylib' because no suitable image found. Did find:
dumpdecrypted.dylib: required code signature missing for 'dumpdecrypted.dylib'
/private/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents/dumpdecrypted.dylib: required code signature missing for '/private/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents/dumpdecrypted.dylib'
Abort trap: 6
複製代碼
ldid -S /private/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents/dumpdecrypted.dylib
複製代碼
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/E736B0BC-7ED4-42CE-8513-CE52F88F5F52/WeChat.app/WeChat
複製代碼
ls 後的目錄結構 ,其中WeChat.decrypted是解密後的文件
9-A7B1-AA3B8FD268CB/Documents root# ls
00000000000000000000000000000000/ MMResourceMgr/ WeChat.decrypted
079d66db896f66ef28a7e029c2eff367/ MMappedKV/ app_tutt/
CrashReport/ MemoryStat/ dumpdecrypted.dylib*
LocalInfo.lst OpenImResource/ heavy_user_id_mapping.dat
LoginInfo2.dat SafeMode.dat mmupdateinfo.archive
Administratorde-iPhone:/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents root#
複製代碼
//將解密後的文件拷貝到mac
scp WeChat.decrypted hexindai@172.20.8.179:/tmp
複製代碼
注意:當砸殼完畢後,使用 class-dump 仍然只導出 CDStructures.h 一個文件,則可能架構選擇錯誤;由於 dumpdecrypted 只會砸你手機處理器對應的那個殼,fat binary 的其它部分仍然是有殼的,而 class-dump 的默認目標又不是被砸殼的那個部分,所以頗有可能就會報錯;
class-dump -s —arch armv7 -S -H WeChat.decrypted -o ./WCHeaderscd
複製代碼