本章中我們會在越獄手機上對APP進行調試,我們將進行下面幾個內容的探索:
1、將自定義
.cy
文件引入到手機磁盤,連接手機APP并調試(非砸殼APP)。
2、class_dump
,導出APP的頭文件。
3、Reveal
,UI調試。
4、debugserver
。
一、hank.cy
文件的使用
1.1、拷貝hank.cy
并使用
首先這里提供一個hank.cy
文件,目的是幫助我們調試APP。hank.cy
拿到hank.cy
文件之后,我們要做的就是將它導入到我們的越獄手機里面,相當于一個插件。
1、USB連接手機
這一步的操作,我們在16、越獄 & OpenSSH里面有詳細的講解??次恼碌淖詈?。-
2、創建專屬文件夾
一般情況先我們會把hank.cy
文件拷貝到/usr/lib/cycript0.9
文件夾下面,但是這樣做是不規范的。我們參考cycript
作者saurik的格式,在com
文件夾下面建立自己的文件夾,用于存放我們自己的插件。
image
比如我這邊就建立了一個Jax
文件夾。
// 使用 `mkdir`指令創建文件夾
$ mkdir <文件名>
- 3、拷貝
hank.cy
到指定文件夾
$ scp -P 2222 ./hank.cy root@localhost:/usr/lib/cycript0.9/com/Jax
-
4、
hank.cy
的使用
將hank.cy
拷貝到越獄手機指定文件夾之后,我們就可以來是使用了。- 通過
cycript
指令,連接正在運行的APP。
這里我們可以通過ps -A
指令來查看當前運行的進程都有哪些。
連接APP:
- 通過
$ cycript -p <進程名>
或者
$ cycript -p <進程編號>
- 使用
hank.cy
使用之前要先引入hank.cy
,由于我們沒有直接放在cycrity0.9
這個文件夾里面,所有引入的時候需要加上路徑:
$ @import com.Jax.hank
// 獲取ROOT VC
$ HKRootvc ()
// 獲取當前控制器
$ HKCurrentVC ()
1.2、theos && ldid 的配置
我們在安裝MonkeyDev
的時候,已經安裝了theos
,同時也安裝了ldid
。我們可以通過brew list
指令來查看一下:
theos
我安裝在了opt
目錄下(cmd + shift + .
可以查看隱藏文件夾):確保了
theos
安裝完畢之后,也好確保其環境變量也配置好了:1.3、查看圖層信息
接著上面的,我們已經通過HKCurrentVC ()
拿到了APP當前頁面的控制器,那么我們來打印一下當前的圖層信息:
$ #0x13a041600.view.recursiveDescription() .toString ()
由于
Unicode
編碼問題,打印出來的圖層信息里面,漢字顯示的是Unicode
編碼。這個時候我們可以使用在線轉換的形式,知道我們想要找的控件,當然我們頁面通過Python 指令
將APP頁面中的漢字轉換為Unicode
編碼,再搜索編碼定位到控件。1.4、定位Target && Function
比如我們上面定位到了一個UIButton
,那么我們可以繼續查找UIButton
所對應的Target
和觸發事件。
- 獲取所有的
Target
$ #<組件地址>.allTargets
- 獲取控件所有的
Events
$ #<組件地址>.allControlEvents
64
。其實
UIControlEventTouchUpInside
就是64:- 獲取觸發事件
在得到了Target
和Event
之后,我們就可以獲取到當前控件所觸發的方法是什么了。
$ [#<組件地址> actionsForTarget: #<Target地址> forControlEvent: <Event編號>]
此時我們已經知道了,我們想要HOOK的方法,以及對應的控件名,
Target
名等等。這個時候我們只需要去砸殼APP,HOOK對應的方法就可以了。這個時候其實我們嚴謹一點,還要確認
tipButtonAction
是否有參數和返回值。此時我們利用class_dump
去導出所有的頭文件。
二、class-dump的使用
同樣的我們之前在安裝MonkeyDev
的時候,已經安裝了class-dump
:
如果沒有安裝可以按一下步驟安裝官方網站:
- 下載
class-dump
:$ git clone https://github.com/nygard/class-dump
。 - 編譯項目,生成命令行工具??芍苯邮褂?。
- 將命令行工具導入
/usr/local/bin/class-dump
,給權限:$ sudo chmod +x class-dump
。
-
使用class-dump
在得到砸殼的APP包之后,使用class-dump
。17、應用砸殼單一架構
$ class-dump -H <MachO文件> -o <頭文件存放的目錄>
多種架構
比如arm64
的
$ class-dump --arch arm64 -H <MachO文件> -o <頭文件存放的目錄>
拿到所有的頭文件之后,全局搜所一下(注:我這里使用的是
Sublime Text
打開的所有頭文件,使用cmd + shift + F
全局搜索):
image
三、Theos 的使用
3.1、tweak
tweak
代表越獄手機中Cydia
里面的插件。
運行成功之后,我們會得到如下文件,這就是我們的
teak
工程:3.2、接下來我們就要配置tweak
工程:
- 配置
Makefile
文件,由于此時用的是USB連接,所有我是這樣配置的。(如果是WiFi連接,修改一下就好了):
image
注意:
tweak
工程不要放在有中文的路徑下,否則后面的執行會報錯
3.3、注入HOOK代碼:
撰寫HOOK
代碼
注:
HOOK
代碼的注入分為三個步驟
1、make
--- 編譯
2、make package
--- 打包
3、make install
--- 注入
- 執行
make
(此時我將工程文件夾放在了桌面)
此時我執行make
指令,遇到了下面的錯誤:
image
這是因為我們使用了NSLog
但是并沒有引入Foundation
框架。此時我們可以引入Foundation
框架,也可以引入UIKit
框架:
image
再次make
就成功了:
image
這里有個坑,大家要注意了,這里我之前的是輸出是
NSLog(@"\n\n\n\nHOOK到了\n\n\n\n\n\");
但是一直報錯,我就給改成了NSLog(@"hook");
就成功了。
Tweak.x
Tweak.xm
;Makefile
tuyaSmartDemo_FILES = Tweak.x
tuyaSmartDemo_FILES = Tweak.xm
。這里還是
theos
的適配問題,大家注意一下。
-
執行
make package
--- 打包
image -
執行
make install
--- 注入
image
執行成功之后,在控制臺可以看到我們HOOK
的代碼。
注意:上面的流程執行完以后,我們就已經使用
theos
完成了HOOK
,這個過程其實是我們自己寫了一個插件,并安裝到了預約手機??梢栽?code>Cydia里面看到(注:如果插件失效,直接卸載掉,重復上面的流程就可以了。):
image
- 其他指令
make clean
清理緩存。
3.4、theos 注意事項
- 注意事項1
theos
和Xcode是對應的。如果有多個Xcode,一定要指定Xcode。
不如我現在的Xcode Select路徑是:
這個時候可以使用如下指令自定Xcode Select:
xcode-select --switch <Xcode Select路徑>
- 注意事項2
theos
創建的tweak
工程路徑不能有中文。
四、 Reveal
- 手機端安裝插件
在越獄手機里面安裝Reveal Loader
插件:
image
安裝完成之后,我們會在手機的設置頁面發現,多了一個Reveal
:
在這里面我們可以選自需要
Reveal
的APP:- Mac端操作
此時我們打開Mac端的Reveal
發現并沒有任何的變化。這是因為有一個關鍵的步驟我們還沒做。
image
這個時候,我們點擊help -> Show Reveal Library in Finder -> iOS Library
:
來到這里:
這里面的RevealServer
可執行文件是關鍵。我們要把它拷貝到越獄手機里面。
步驟如下:
USB連接手機。
-
進入根部目錄的
Library
文件夾。(注意:一定要進入根目錄下,否則路徑不對,是沒有效果的。下圖是我如何找到根目錄的,僅供參考)
image 創建
RHRevealLoader
文件夾:mkdir RHRevealLoader
。-
將
RevealServer
拷貝到RHRevealLoader
文件夾下,并改名為:libReveal.dylib
image -
上面的配置完之后,我們會在Mac端
Reveal
里面看到我們連接的APP,并且可以進行UI調試:
image
注:
Reveal
調試不會阻塞進程,可以試試更改UI內容。
五、debugserver
5.1 debugserver原理與簡單使用
我們Xcode中的lldb可以調試手機中的應用,是因為手機中的debugserver
開啟的相關服務。所以在越獄環境中,我們只需要開啟debugserver
服務,就可以利用LLDB遠程調試三方應用了。
- 舉個例子,我們上面對正版應用進行了
reveal
。但是如果逆向正版應用的過程中,希望進行斷點調試該怎么做呢?這個使用可以通過LLDB
來進行斷點調試,前提是我們要附加進程。LLDB的安裝與使用
1、首先,我們創建一個Xcode工程(隨便創建一個就可以)。
2、在Debug -> Attach to Process
中選擇我們要逆向的APP進程,附加上去:
3、在控制臺,我們就可以驚醒調試了,而且還可以ViewDebug
:
5.2、debugserver的位置探索
在/Applications/Xcode.app/Contents/Developer/Platforms
里面,我們找到iPhoneOS.platform -> DeviceSupport
,在這個文件夾里面有很多系統版本,我們隨便找一個系統版本中,找到DeveloperDiskImage.dmg
,打開它。
找到
usr -> bin -> debugserver
。這就是debugserver
的位置。我們的Xcode在第一次連接手機的時候,會將對應系統里面的信息拷貝到手機,其中就包含
debugserver
。位置如下:/Developer/usr/bin
那么我們怎么驗證這兩個debugserver
是同一個呢?
這個時候,我們可以對兩個debugserver
進行md5
運算,如果得到的結果一樣,那么這兩個debugserver
就一樣的。
-
對Mac端對應系統里面的
debugserver
進行md5
運算:
得到的結果是:b771aad8917de2ff41feb5acfe4a9b15
image -
將手機端的
debugserver
拷貝出來,進行md5
運算:
得到的結果是:b771aad8917de2ff41feb5acfe4a9b15
image
可以發現,得到的結果是一樣的,所以兩個debugserver
是一樣的;換句話說,手機端的debugserver
就是從Mac端拷貝過去的。
5.3、啟動debugserver
我們上面使用Xcode附加進程的形式,啟動了debugserver
;其實我們還可以手動去啟動debugserver
。
步驟如下:
- iPhone中開啟
debugserver
服務。
image
可以看到debugserver
有很多的服務。
我們要使用的是:
$ ./debugserver <主機地址>:<端口號> -a <應用進程名/進程編號>
- 由于主機地址是當前手機,可以使用
localhost
代替 - 端口號:啟動
server
服務,開發端口,讓遠程的lldb
通過server
調試進程
image
- 由于主機地址是當前手機,可以使用
這個時候,手機端就進入了等待連接的狀態。
-
Mac端啟動LLDB連接iPhone
- 啟動
lldb
$ lldb
- 連接
debugserver
$ process connect connect://<手機IP>:<服務端口號> // eg: `(lldb) process connect connect://192.168.50.173:12346`
- 如果Mac端的連接不成功,我們可以使用USB連接的方式。
這個時候,我們要做的是,在進行USB端口映射
的時候,添加12346:12346
:
python tcprelay.py -t 22:2222 12346:12346
這樣我們就可以把上面連接
debugserver
中的<手機IP>
換成localhost
。 - 啟動