用debugserver + lldb代替gdb進(jìn)行動(dòng)態(tài)調(diào)試

根據(jù):http://bbs.iosre.com./t/debugserver-lldb-gdb/65
在具體操作過程中走了很多彎路,現(xiàn)在記下來,以便使用

設(shè)備:越獄后的iphone4s
iOSIP:手機(jī)的ip
~/debugserver:mac上的路徑

一、配置debugserver

  1. 在iOS中安裝debugserver

debugserver運(yùn)行在iOS上,顧名思義,它作為服務(wù)端,實(shí)際執(zhí)行LLDB(作為客戶端)傳過來的命令,再把執(zhí)行結(jié)果反饋給LLDB,顯示給用戶,即所謂的“遠(yuǎn)程調(diào)試”。在默認(rèn)情況下,iOS上并沒有安裝debugserver,只有在設(shè)備連接過一次Xcode,并在Window→Devices菜單中添加此設(shè)備后,debugserver才會(huì)被Xcode安裝到iOS的“/Developer/usr/bin/”目錄下。

  1. 幫debugserver減肥

將debugserver 從手機(jī)拷貝至MAC

   snakeninnysiMac:~ snakeninny$ scp root@iOSIP:/Developer/usr/bin/debugserver ~/debugserver

然后幫它減肥:

    snakeninnysiMac:~ snakeninny$ lipo -thin armv7 ~/debugserver -output ~/debugserver

注意把這里的“armv7s”換成你的設(shè)備所對(duì)應(yīng)的ARM。

  1. 給debugserver添加task_for_pid權(quán)限
    原文是debugserver 我測(cè)試的好像應(yīng)該為debugserver的路徑 ~/debugserver

下載ent.xml32到macOS的“/Users/iOS/”目錄,然后運(yùn)行:

   snakeninnysiMac:~ snakeninny$ /opt/theos/bin/ldid -Sent.xml debugserver

注意,此處的ldid來自joedj,且“-S”選項(xiàng)與“ent.xml”之間是沒有空格的。正常情況下,上面這條命令會(huì)在5秒內(nèi)執(zhí)行完畢。如果ldid卡住了,執(zhí)行超時(shí),就換一種方案:下載ent.plist到“/Users/snakeninny/”,然后運(yùn)行:

  snakeninnysiMac:~ snakeninny$ codesign -s - --entitlements ent.plist -f debugserver
  1. 將經(jīng)過處理的debugserver拷回iOS

    snakeninnysiMac:~ snakeninny$ scp ~/debugserver root@iOSIP:/usr/bin/debugserver
    snakeninnysiMac:~ snakeninny$ ssh root@iOSIP
    FunMaker-5:~ root# chmod +x /usr/bin/debugserver
    

這里之所以把處理過的debugserver存放在iOS的“/usr/bin/”下,而沒有覆蓋“/Developer/usr/bin/”下的原版debugserver,一是因?yàn)樵鎑ebugserver是不可寫的,無法覆蓋;二是因?yàn)椤?usr/bin/”下的命令無須輸入全路徑就可以執(zhí)行,即在任意目錄下運(yùn)行“debugserver”都可啟動(dòng)處理過的debugserver。

二、在iOS上用debugserver來attach進(jìn)程

01、攻擊,調(diào)試SpringBoard

   debugserver *:1234 -a "SpringBoard"

成功后會(huì)顯示:

屏幕快照 2017-08-01 18.53.03.png

此時(shí)會(huì)靜止在這里,手機(jī)開機(jī)什么的都不管用,其實(shí)沒有死機(jī),是代碼正在攻擊SpringBoard,我們接著做下一步,(可以通過結(jié)束程序(Control + c),重啟手機(jī),回復(fù)手機(jī),但沒必要,此時(shí)手機(jī)正在運(yùn)行,沒有任何問題)

02、在macOS上用lldb遠(yuǎn)程調(diào)試
首先在終端中運(yùn)行l(wèi)ldb,然后輸入以下命令:

     process connect connect://iOSIP:1234
屏幕快照 2017-08-01 18.58.35.png

注意,這條命令執(zhí)行耗時(shí)比較長,很多讀者可能會(huì)以為iOS/macOS死掉了,其實(shí)沒有,耐心等一會(huì),~執(zhí)行成功后會(huì)顯示:

屏幕快照 2017-08-01 19.00.11.png

屏幕快照 2017-08-01 19.00.26.png

到這里就算lldb調(diào)試成功了,接下來獲取更多信息
獲取ASLR的offset

 image list -o -f

顯示如下圖片:

屏幕快照 2017-08-01 19.04.33.png

其中第一列[X]是image的序號(hào),不用管;第二列是ASLR的offset(也就是對(duì)應(yīng)image的虛擬內(nèi)存slide);第三列是image的全路徑和slide之后的基地址,也不用管~所以第二列就是我們需要的信息。
五、在內(nèi)存地址上下斷點(diǎn)
五、在內(nèi)存地址上下斷點(diǎn)

 br s -a 0xb446+0x9a000

 br s -a 0xA5446

執(zhí)行成功后顯示:

屏幕快照 2017-08-01 19.06.19.png

六、更改寄存器的值(我沒實(shí)現(xiàn))

按下home鍵,觸發(fā)斷點(diǎn),顯示如圖:


可以看到,lldb把包括斷點(diǎn)在內(nèi)的4條指令顯示了出來,方便我們調(diào)試。這里,我們將r0的值設(shè)為0,讓其跳轉(zhuǎn)到0xa5470(0xb470 + 0x9a000)處。更改r0值的lldb命令是:

     register write r0 0

接著”ni“兩次,我們就可以看到程序執(zhí)行到了0xa5470處,如圖:


七、用lldb啟動(dòng)一個(gè)App

   debugserver -x backboard *:1234 /path/to/app/executable

      debugserver -x backboard *:1234 /Applications/MobileNotes.app/MobileNotes
屏幕快照 2017-08-01 19.22.24.png

此命令會(huì)啟動(dòng)記事本,并斷在dyld的第一條指令上,如圖所示:

屏幕快照 2017-08-01 19.28.39.png

接下來,在lldb中持續(xù)輸入“ni”,直到出現(xiàn)“error: invalid thread”的字樣,如圖所示:



稍等片刻,lldb即會(huì)停在程序的第一條指令上,如圖所示(這一步我自己做的和文章上的有所不同,還未找到原因,下面的是我自己的):


屏幕快照 2017-08-01 19.34.33.png

此時(shí)我們即已處在進(jìn)程內(nèi)部,可以開始一窺究竟啦~相較attach的半路出家,這種方式更有助于我們從頭調(diào)試一個(gè)程序,可以觀察到一些變量的初始化過程。

八、更多l(xiāng)ldb命令
經(jīng)過上面的操作,我們可以看到,lldb還是比較方便的,用慣了gdb而對(duì)它不熟悉的朋友可以通過lldb與gdb命令對(duì)照表來熟悉lldb的命令。其實(shí)有了上面的幾個(gè)操作,我們就可以開始簡單動(dòng)態(tài)分析程序了,相信能把上面六步走通的朋友,已經(jīng)具備了舉一反三的能力,其他需要用到的功能都可以Google到,論壇也匯總了一部分。好了,debugserver + lldb的簡單介紹到此結(jié)束,接下來趕緊打開Terminal(終端),hack起來吧~!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容