iOS逆向(七)經常使用逆向工具介紹

逆向工具集和安裝和使用

iOS逆向工程的工具大體可分爲四類:

  • 檢測工具 如:Reveal、tcpdump等
  • 反編譯工具(反彙編工具 - 分析二進制文件並獲得一些信息) 如:IDA、Hopper Disassembler、classdump等
  • 調試工具 如:lldb、Cycript等
  • 開發工具 如:Xcode、theos等

1 、classdump介紹

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

classdump官網地址

打開連接後,選擇class-dump-3.5.dmg,進行下載。下載完成以後,將dmg文件中的class-dump複製到/usr/bin目錄,並在終端執行以下執行進行賦權:bash

sudo chmod 777 /usr/bin/class-dump
複製代碼

而後運行class-dump指令,便可看到以下結果: 微信

class-dump的簡單使用

class-dump -H /Applications/Calculator.app -o /Users/GofLee/Desktop/CalculateHeads
複製代碼

【說明】架構

  • /Applications/Calculator.app:計算器app的路徑;
  • /Users/GofLee/Desktop/CalculateHeads:存放dump結果的頭文件文件夾路徑。
  • 執行上面的指令以後,咱們能夠在
  • /Users/GofLee/Desktop/CalculateHeads 目錄下看到生成的.h列表

從上面的結果能夠看到,咱們有了這些.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-z 是對 class-dump 和 class-dump-x 的改進版,徹底用C++重寫,避免動態調用,這使得 class-dump-z 比 class-dump 和 class-dump-x快10倍左右,而且能夠在 Linux、Mac、 iPhone 上運行。ide

dumpdecrypted 砸殼工具

dumpdecrypted地址工具

cd到 dumpdecrypted的目錄下,而後運行以下命令

make //make以後會生成dumpdecrypted.dylib動態庫文件

而後將該動態庫文件拷貝到手機的tmp文件的目錄下
複製代碼
  • 定位要砸殼的StoreApp的執行文件名字TargetApp (ps -e 能夠獲得全路徑)
  • 定位要砸殼的StoreApp的Document目錄:
cycript -p TargetApp [[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0] 
複製代碼
  • 獲得路徑:
#"file:///var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE/Documents/" 
複製代碼
  • 進入Document目錄:
cd /var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE/Documents/
複製代碼
  • 拷貝dumpdecrypted.dylib:

注意:做以下操做以前你如要使用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
複製代碼
  • 獲取沙盒路徑以後 進入沙盒路徑的Documents的路徑之下 以上的具體操做以下
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
複製代碼
  • 完成以後的頭文件以下
相關文章
相關標籤/搜索