1.debugserver和LLDB
如果說IDA是倚天劍识腿,那么LLDB就是屠龍刀。在iOS逆向工程中叠萍,兩者相輔相成芝发。
LLDB全稱Low Level Debugger绪商,由蘋果出品苛谷,作為Xcode內(nèi)置的動態(tài)調(diào)試工具。
它不僅適用于C格郁、C++腹殿、OC語言,還支持OSX例书、iOS以及iOS模擬器锣尉。
- LLDB是運行在OSX中的,要想調(diào)試iOS决采,還需要另一個伙伴配合自沧,他就是debugserver。可以說它們兩個是寶劍界的干將莫邪拇厢。
1.1 debugserver
debugserver運行在iOS上爱谁,作為服務(wù)端,實際執(zhí)行LLDB傳過來的命令孝偎,并將執(zhí)行結(jié)果反饋給LLDB访敌,顯示給用戶,即所謂的遠(yuǎn)程調(diào)試衣盾。
在默認(rèn)情況下寺旺,iOS上并沒有安裝debugserver,只有設(shè)備連接過一次Xcode后势决,debugserver才會被Xcode安裝到iOS的/Developer/usr/bin目錄下阻塑。
1.2 幫debugserver減肥
- 我的手機(jī)是iphone5s--對應(yīng)的ARM是arm64
- 我們從手機(jī)/Developer/usr/bin/debugserver 把debugserver 下載到mac上
scp root@iOSIP:/Developer/usr/bin/debugserver /Users/mac-name/Desktop/debugserver
- 然后進(jìn)行減肥操作(路徑自己選擇)
lipo -thin arm64 /Users/mac-name/Desktop/debugserver -output /Users/popo/Desktop/debugserver1/debugserver
- 再接著,我們給debugserver添加task_for_pid權(quán)限徽龟。
1.因為通過Xcode安裝的debugserver只能調(diào)試我們自己的App叮姑。
2.我們自己有App的源代碼,就用不著debug了据悔。
3.所以我們要添加task_for_pid權(quán)限传透。
- xml文件下載地址: http://iosre.com/ent.xml
- 這個是在debugserver1目錄下執(zhí)行的終端命令(上圖就是該目錄下的文件)
ldid -Sent.xml debugserver
注意:
如果沒有安裝ldid,要進(jìn)行安裝后,才可以使用用上面的命令執(zhí)行.安裝ldid的命令是:
brew install ldid
- 接著,我們在執(zhí)行
codesign -s - --entitlements ent.plist -f debugserver
以上就完成了對debugserver的處理
- 經(jīng)過處理的debugserver拷貝到iOS
scp /Users/popo/Desktop/debugserver1/debugserver root@192.168.3.15:/usr/bin/debugserver
- 我們進(jìn)入手機(jī)終端,對debugserver進(jìn)行授權(quán)
chmod +x /usr/bin/debugserver
- 我們執(zhí)行一下debugserver,測試一下是否配置成功,我們監(jiān)聽1234端口,開啟SpringBoard--debugserver,看到下圖結(jié)果,說明我們的配置是沒問題了.
- 接著我們就要使用LLDB,對1234端口進(jìn)行調(diào)試.
1.3 LLDB
- 在mac終端敲lldb,會進(jìn)入lldb環(huán)境,我們輸入help,就可以查看lldb調(diào)試命令.我們就可以開啟調(diào)試模式.
- 首先啟動debugserver
- 在lldb環(huán)境輸入:
process connect connect://手機(jī)ip:1234
- 調(diào)試命令--1.image list
--用于列舉當(dāng)前進(jìn)程中的所有模塊
--每次進(jìn)程啟動時,同一進(jìn)程的所有模塊在虛擬內(nèi)存中的起始地址都會產(chǎn)生隨機(jī)偏移.
- 調(diào)試命令--2.breakpoint
--2.1用于設(shè)置斷點
--2.2用法:
-- (1) b function
-- (2) br s -a address
-- (3) br s -a 'ASLROffset + address'
--2.3使用:
--第1種:在函數(shù)的起始位置
設(shè)置斷點
--(lldb) b NSLog
--第2/3種是在地址處
設(shè)置斷點
--(lldb) br s -a 0xCCCCC
--2.4注意:
--當(dāng)進(jìn)程停在斷點上時,斷點所在的哪一行代碼并沒有執(zhí)行.這里和我們在xcode打斷點是一樣的.
調(diào)試命令--3.print
--LLDB的主要功能之一是"在程序停止的時候檢查程序內(nèi)部發(fā)生的事"
--通過print命令,我們可以打印某處的值調(diào)試命令--4.nexti與stepi
--它們的作用都是執(zhí)行下一條機(jī)器指令
--區(qū)別:nexti不進(jìn)入函數(shù)體,stepi會進(jìn)入函數(shù)體
--簡寫: ni 與si調(diào)試命令--5.register write
--用于給制定的寄存器賦值,從而對程序進(jìn)行改動,觀察程序執(zhí)行過程變化
2.dumpdecrypted--砸殼工具
2.1 dumpdecrypted的產(chǎn)生
- 由于AppStore下載的App是被蘋果加密過的,可執(zhí)行文件被套上一層保護(hù)殼
- class-dump無法作用于加密過的App
- 想要獲取頭文件,需要先解密App的可執(zhí)行文件,也叫砸殼
- dumpdecrypted就是由越獄社區(qū)的知名人士 Stefan Esser 出品的一款砸殼工具,被越獄社區(qū)廣泛運用在iOS逆向工程研究中.
2.2 dumpdecrypted的使用
- 2種方式下載dumpdecrypted:
第一種:
下載地址:https://github.com/stefanesser/dumpdecrypted
第二種:
先確定下載的目錄(desktop/dump目錄下):
下載執(zhí)行命令:
git clone git://github.com/stefanesser/dumpdecrypted
- 接著對下載好的文件進(jìn)行編譯dumpdecrypted.dylib
cd dumpdecrypted/
make
-
找到要砸殼的APP的Documents目錄路徑
估計你看到這些,就會很頭疼了,到底哪個是呢?
-
我們借助強(qiáng)大的Cycript,讓App告訴我們它在哪里,直接找到它的的根目錄
鎖定該目錄 065B70ED-FCD1-4874-B4A3-86F1B765945F
- 將dumpdecrypted.dylib拷貝到Documents目錄下.
有兩種方式拷貝:
第一種:
scp /Users/popo/Desktop/dump/dumpdecrypted/dumpdecrypted.dyli root@192.168.3.15:var/mobile/Containers/Data/Application/065B70ED-FCD1-4874-B4A3-86F1B765945F/Documents/dumpdecrypted.dylib
第二種:
以上兩種方式,只需要拷貝成功就行,選擇那種,根據(jù)個人喜好.
- 開始砸殼
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/9AF4167F-D4AA-4DBB-A67D-A956CCDBDEF9/WeChat.app/WeChat mach-o decryption dumper
砸殼失敗了,分析一下原因:
required code signature missing for 'dumpdecrypted.dylib'
由于沒有對dumpdecrypted.dylib簽名,
我們沒有砸殼成功.
其實出現(xiàn)問題的時候就是漲經(jīng)驗的時候,
遇到問題就解決問題.
我們把問題解決后接著砸殼
- 解決問題是對dumpdecrypted.dylib文件簽名,首先獲取可簽名的證書
security find-identity -v -p codesigning
然后為dumpecrypted.dylib簽名
codesign --force --verify --verbose --sign "iPhone Developer: `(開發(fā)這信息)`" dumpdecrypted.dylib
然后在上傳到手機(jī)
- 進(jìn)行第二次砸殼
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/9AF4167F-D4AA-4DBB-A67D-A956CCDBDEF9/WeChat.app/WeChat mach-o decryption dumper
在當(dāng)前目錄下會生成WeChat.decrypted文件
砸殼完成,然后你就可以拿著砸殼文件就行class-dump,靜態(tài)分析匯編代碼了.
-
問題:dumpdecrypted為什么拷貝到Documents目錄下操作?
- StoreApp對沙盒以外的絕大數(shù)目錄沒有寫權(quán)限.
- Documents目錄下使用dumpdecrypted.dylib時,保證它能在當(dāng)前目錄下寫一個decrypted文件.
4.OpenSSH
"切磋技藝:iOS逆向工具精選"地址: http://www.reibang.com/p/beea9f2b9f7d
提到了遠(yuǎn)程連接手機(jī)終端.
這里重點講解一下.
- 我們會經(jīng)常用到兩個命令ssh 和scp
- ssh用于遠(yuǎn)程登錄
- scp遠(yuǎn)程拷貝文件
- ssh使用:
ssh user@手機(jī)ip
我們上面連接手機(jī)時,使用到了這個命令
ssh root@192.168.3.15
- scp使用:
scp user@手機(jī)ip:/path/to/remoteFile /path/to/localFile
我們拷貝dumpdecrypted.dylib 到手機(jī):
scp /Users/popo/Desktop/dump/dumpdecrypted/dumpdecrypted.dyli root@192.168.3.15:var/mobile/Containers/Data/Application/065B70ED-FCD1-4874-B4A3-86F1B765945F/Documents/dumpdecrypted.dylib
- 安裝OpenSSH后需要注意修改默認(rèn)登錄密碼:alpine.
- iOS上的用戶有2個
- root
- mobile
- 修改密碼,執(zhí)行命令
passwd root
passwd mobile
5.usbmuxd
"切磋技藝:iOS逆向工具精選": http://www.reibang.com/p/beea9f2b9f7d
提到了有線無線連接遠(yuǎn)程終端.
這里也介紹一下.
- 使用usb連接比無線連接,穩(wěn)定,傳輸快.
- 這是一款把本地OSX/Windows端口轉(zhuǎn)發(fā)到遠(yuǎn)程iOS端口的工具usbmuxd.
- 下載配置usbmuxd
下載地址:http://cgit.sukimashita.com/usbmuxd.git/snapshot/usbmuxd- 1.0.8.tar.gz
python tcprelay.py -t 遠(yuǎn)程iOS上的端口 : 本地OSX/Windows上的端口
- ssh到iOS中
ssh root@192.168.31.5 -p 54322
就可以使用usb連線終端了.
6.iFile--iOS版的Finder
-
iFile是iOS上一款非常強(qiáng)大的文件管理App,可以看做是iOS版的Finder.
7.clutch--砸殼
源碼地址:https://github.com/KJCracks/Clutch
7.1 源碼下載
7.2 編譯工具
用Xcode打開源碼
編譯命令 command + B
7.3 拷貝到手機(jī)使用
-
拷貝方法一:
- 拷貝方法二:
scp Clutch/clutch root@設(shè)備ip:/usr/bin/
7.4 ssh到越獄機(jī),準(zhǔn)備砸殼
-
砸殼錢先認(rèn)識這些命令+參數(shù)的作用
1.clutch -b 砸殼后的文件是二進(jìn)制文件
2.clutch -d 砸殼后的文件是ipa文件
3.clutch -i 查看安裝的應(yīng)用
4.clutch --clean /var/tmp/clutch 目錄清理
5.clutch --version 顯示版本并退出
6.clutch --? 顯示幫助并退出 -
沒有執(zhí)行權(quán)限,需要授權(quán)
-
執(zhí)行clutch -i (查看手機(jī)安裝的App)
-
砸殼
砸殼兩種方式
砸殼第一種執(zhí)行命令(clutch -d app序列號)
clutch -d 1
砸殼第二種執(zhí)行命令(clutch -d app包名)
clutch -d hk.itools.appe
# Zipping WeChat.app
# Swapping architectures..
# DONE: /private/var/mobile/Documents/Dumped/hk.itools.appe-iOS7.0-(Clutch-2.0.4).ipa
-
砸殼后的ipa所在目錄
砸殼后的ipa
砸殼到這里,就完成了...
8.fruda-ios-dump 一條命令完成iOS應(yīng)用砸殼
8.1 Frida
- Frida的使用場景:
1.hook特定函數(shù)并更改返回值
2.分析定制協(xié)議,同事其動態(tài)嗅探,解密
3.應(yīng)用調(diào)試
4.在iOS應(yīng)用上dump類和方法信息
8.2 手機(jī)設(shè)備安裝Frida
-
首先打開手機(jī)設(shè)備,在Cydia中添加源
https://build.frida.re
- 然后在Cydia中搜索Frida,進(jìn)行安裝.
8.3 在mac安裝Frida
- 終端執(zhí)行:
sudo pip install frida
- 如果報下面錯誤:
Uninstalling a distutils installed project (six) has been deprecated and will be
removed in a future version. This is due to the fact that uninstalling a distutils
project will only partially uninstall the project.
- 我們執(zhí)行下面命令:
原因:Apple預(yù)安裝的這個six庫出于安全原因被設(shè)置為sudo也不可以執(zhí)行操作,所以需要依賴于高版本的庫就需要更新six.
sudo pip install frida –upgrade –ignore-installed six
到這一步,環(huán)境配置完成了.
8.4 配置frida-ios-dump環(huán)境
github地址: https://github.com/AloneMonkey/frida-ios-dump
- 下載源碼
- 安裝依賴
sudo pip install -r requirements.txt --upgrade (Python 2.7)
- 修改dump.py參數(shù)
vim /opt/dump/frida-ios-dump/dump.py
8.5 打開終端,端口轉(zhuǎn)發(fā)
Run usbmuxd/iproxy SSH forwarding over USB (Default 2222 -> 22). e.g.
執(zhí)行下面的命令:
iproxy 2222 22
8.6 進(jìn)行砸殼
比如 一鍵砸殼(WeChat)
./dump.py WeChat
這里就完成了砸殼.
9.Reveal--一款Mac下調(diào)試iOS應(yīng)用的軟件
下載地址:https://github.com/LK26/Reverse-tool-one/blob/master/Reveal.dmg
9.1 Reveal
- Reveal能夠在運行時調(diào)試和修改iOS應(yīng)用程序,而且它能連接到應(yīng)用程序,并允許開發(fā)者編輯各種用戶界面參數(shù),而且會立即反應(yīng)在程序的UI上.
- Reveal會掃描其網(wǎng)路中關(guān)聯(lián)的應(yīng)用程序,并讓開發(fā)者選擇連接其中之一,當(dāng)連接到一個應(yīng)用程序后,Reveal將顯示其UI,其中包括大量的參數(shù)和設(shè)置.
- 除了解析出UI參數(shù)外,開發(fā)者可以輕松的檢查UI組件的分層,并在其層次結(jié)構(gòu)中選擇特定元素.
9.2 安裝和使用
-
在越獄機(jī)中,打開cydia,搜索Reveal Loader
-
點擊安裝(我這里已經(jīng)安裝)
-
打開應(yīng)用設(shè)置,找到Reveal
-
點擊進(jìn)入Reveal
-
開啟你要Reveal的app
-
這里在手機(jī)的設(shè)置完成了,我們在Mac上打開Reveal,找到Help--->>Show Reveal Library in Finder--->>iOS Library
-
找到RevealServer.framework
Reveal新版本,iOS-Libraries文件中不再是libReveal.dylib了,
而是RevelServer.framework,
這里不用擔(dān)心.
我們只需要把文件名改掉就OK了.
我們執(zhí)行下面的命令:
scp /Users/用戶名/Desktop/RevealServer.framework
root@192.168.3.15:/Library/RHRevealLoader/libReveal.dylib
拷貝到手機(jī).
- 如果這些完成了,你就可以對已經(jīng)勾選的app頁面結(jié)構(gòu)進(jìn)行分析了.
注意
:讓手機(jī) 和 電腦處在同一局域網(wǎng)下,手機(jī)打開需要查看的 App, Mac上的 Reveal 選擇需要查看的App,就開始你的分析之旅吧,哈哈~~