18、越獄調試

image

本章中我們會在越獄手機上對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
image
// 獲取ROOT VC
$ HKRootvc ()

// 獲取當前控制器
$ HKCurrentVC ()

1.2、theos && ldid 的配置

我們在安裝MonkeyDev的時候,已經安裝了theos,同時也安裝了ldid。我們可以通過brew list指令來查看一下:

image

theos我安裝在了opt目錄下(cmd + shift + .可以查看隱藏文件夾):
image

確保了theos安裝完畢之后,也好確保其環境變量也配置好了:
image


1.3、查看圖層信息

接著上面的,我們已經通過HKCurrentVC ()拿到了APP當前頁面的控制器,那么我們來打印一下當前的圖層信息:

$ #0x13a041600.view.recursiveDescription() .toString ()

image

由于Unicode編碼問題,打印出來的圖層信息里面,漢字顯示的是Unicode編碼。這個時候我們可以使用在線轉換的形式,知道我們想要找的控件,當然我們頁面通過Python 指令將APP頁面中的漢字轉換為Unicode編碼,再搜索編碼定位到控件。
image

image


1.4、定位Target && Function

比如我們上面定位到了一個UIButton,那么我們可以繼續查找UIButton所對應的Target和觸發事件。

  • 獲取所有的Target
$ #<組件地址>.allTargets
image
  • 獲取控件所有的Events
$ #<組件地址>.allControlEvents

image
這里看到,輸出了一個64
其實UIControlEventTouchUpInside就是64:
image

  • 獲取觸發事件
    在得到了TargetEvent之后,我們就可以獲取到當前控件所觸發的方法是什么了。
$ [#<組件地址> actionsForTarget: #<Target地址> forControlEvent: <Event編號>]
image

此時我們已經知道了,我們想要HOOK的方法,以及對應的控件名,Target名等等。這個時候我們只需要去砸殼APP,HOOK對應的方法就可以了。

這個時候其實我們嚴謹一點,還要確認tipButtonAction是否有參數和返回值。此時我們利用class_dump去導出所有的頭文件。


二、class-dump的使用

同樣的我們之前在安裝MonkeyDev的時候,已經安裝了class-dump:

image

如果沒有安裝可以按一下步驟安裝官方網站

  1. 下載class-dump$ git clone https://github.com/nygard/class-dump
  2. 編譯項目,生成命令行工具??芍苯邮褂?。
  3. 命令行工具導入/usr/local/bin/class-dump,給權限:$ sudo chmod +x class-dump
  • 使用class-dump
    在得到砸殼的APP包之后,使用class-dump17、應用砸殼

    • 單一架構
      $ 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里面的插件。

image

運行成功之后,我們會得到如下文件,這就是我們的teak工程:
image


3.2、接下來我們就要配置tweak工程:
  • 配置Makefile文件,由于此時用的是USB連接,所有我是這樣配置的。(如果是WiFi連接,修改一下就好了):
    image

注意:tweak工程不要放在有中文的路徑下,否則后面的執行會報錯

3.3、注入HOOK代碼:

撰寫HOOK代碼

image

注: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");就成功了。

\color{red}{我后來發現我是多寫了一個`\`;當然,如果檢查代碼沒有問題,還是報錯,那就將}Tweak.x\color{red}{改成}Tweak.xm\color{red}{同時}Makefile\color{red}{里面的}tuyaSmartDemo_FILES = Tweak.x\color{red}{也要改成}tuyaSmartDemo_FILES = Tweak.xm。

這里還是theos的適配問題,大家注意一下。

  • 執行make package --- 打包

    image

  • 執行make install --- 注入

    image

執行成功之后,在控制臺可以看到我們HOOK的代碼。

image

注意:上面的流程執行完以后,我們就已經使用theos完成了HOOK,這個過程其實是我們自己寫了一個插件,并安裝到了預約手機??梢栽?code>Cydia里面看到(注:如果插件失效,直接卸載掉,重復上面的流程就可以了。):

image

  • 其他指令

make clean 清理緩存。


3.4、theos 注意事項
  • 注意事項1

theos和Xcode是對應的。如果有多個Xcode,一定要指定Xcode。

不如我現在的Xcode Select路徑是:


image

這個時候可以使用如下指令自定Xcode Select:

xcode-select --switch <Xcode Select路徑>
  • 注意事項2

theos創建的tweak工程路徑不能有中文。


四、 Reveal

  • 手機端安裝插件
    在越獄手機里面安裝Reveal Loader插件:
    image

安裝完成之后,我們會在手機的設置頁面發現,多了一個Reveal:

image

在這里面我們可以選自需要Reveal的APP:
image

  • Mac端操作
    此時我們打開Mac端的Reveal發現并沒有任何的變化。這是因為有一個關鍵的步驟我們還沒做。
    image

這個時候,我們點擊help -> Show Reveal Library in Finder -> iOS Library

image

來到這里:
image

這里面的RevealServer可執行文件是關鍵。我們要把它拷貝到越獄手機里面。

步驟如下:

  1. USB連接手機。

  2. 進入根部目錄的Library文件夾。(注意:一定要進入根目錄下,否則路徑不對,是沒有效果的。下圖是我如何找到根目錄的,僅供參考)

    image

  3. 創建RHRevealLoader文件夾:mkdir RHRevealLoader

  4. RevealServer拷貝到RHRevealLoader文件夾下,并改名為:libReveal.dylib

    image

  5. 上面的配置完之后,我們會在Mac端Reveal里面看到我們連接的APP,并且可以進行UI調試:

    image

注:Reveal調試不會阻塞進程,可以試試更改UI內容。


五、debugserver

5.1 debugserver原理與簡單使用

我們Xcode中的lldb可以調試手機中的應用,是因為手機中的debugserver開啟的相關服務。所以在越獄環境中,我們只需要開啟debugserver服務,就可以利用LLDB遠程調試三方應用了。

image

  • 舉個例子,我們上面對正版應用進行了reveal。但是如果逆向正版應用的過程中,希望進行斷點調試該怎么做呢?這個使用可以通過LLDB來進行斷點調試,前提是我們要附加進程。LLDB的安裝與使用

1、首先,我們創建一個Xcode工程(隨便創建一個就可以)。
2、在Debug -> Attach to Process中選擇我們要逆向的APP進程,附加上去:

image

3、在控制臺,我們就可以驚醒調試了,而且還可以ViewDebug

image


5.2、debugserver的位置探索

/Applications/Xcode.app/Contents/Developer/Platforms里面,我們找到iPhoneOS.platform -> DeviceSupport,在這個文件夾里面有很多系統版本,我們隨便找一個系統版本中,找到DeveloperDiskImage.dmg,打開它。

image

image

找到usr -> bin -> debugserver。這就是debugserver的位置。
image

我們的Xcode在第一次連接手機的時候,會將對應系統里面的信息拷貝到手機,其中就包含debugserver。位置如下:
/Developer/usr/bin
image

那么我們怎么驗證這兩個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。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容