根據(jù):http://bbs.iosre.com./t/debugserver-lldb-gdb/65
在具體操作過程中走了很多彎路,現(xiàn)在記下來,以便使用
設(shè)備:越獄后的iphone4s
iOSIP:手機(jī)的ip
~/debugserver:mac上的路徑
一、配置debugserver
- 在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/”目錄下。
- 幫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。
- 給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
-
將經(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ì)顯示:

此時(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

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


到這里就算lldb調(diào)試成功了,接下來獲取更多信息
獲取ASLR的offset
image list -o -f
顯示如下圖片:

其中第一列[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í)行成功后顯示:

六、更改寄存器的值(我沒實(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

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

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

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


此時(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起來吧~!