一丶介紹
“LLDB全稱為“Low Level Debugger”诺苹,是由蘋果出品银亲,內(nèi)置于Xcode中的動(dòng)態(tài)調(diào)試工具亭珍,不但通吃C命辖、C++、Objective-C袄友,還全盤支持OSX挖炬、iOS传泊,以及iOS模擬器雪情。
LLDB的功能可以概括為以下四點(diǎn):
·在指定的條件下啟動(dòng)程序遵岩;
·在指定的條件下停止程序;
·在程序停止的時(shí)候檢查程序內(nèi)部發(fā)生的事巡通;
·在程序停止的時(shí)候?qū)Τ绦蜻M(jìn)行改動(dòng)尘执,觀察程序的執(zhí)行過(guò)程有什么變化⊙缌梗”
“debugserver運(yùn)行在iOS上誊锭,顧名思義,它作為服務(wù)端弥锄,實(shí)際執(zhí)行LLDB(作為客戶端)傳過(guò)來(lái)的命令丧靡,再把執(zhí)行結(jié)果反饋給LLDB,顯示給用戶叉讥,即所謂的“遠(yuǎn)程調(diào)試”窘行。
在默認(rèn)情況下,iOS上并沒有安裝debugserver图仓,只有在設(shè)備連接過(guò)一次Xcode,
并在Window→Devices菜單中添加此設(shè)備后但绕,debugserver才會(huì)被Xcode安裝到iOS的“/Developer/usr/bin/”目錄下救崔。
二丶debugserver
1.減肥
找到你手機(jī)對(duì)應(yīng)的ARM架構(gòu);
1.1“將未經(jīng)處理的debugserver從iOS拷貝到OSX中的“/Users/snakeninny/”目錄下,命令如下:
$scp root@iOSIP:/Developer/usr/bin/debugserver ~/debugserver
1.2減肥 armv7s == 你iPhone的架構(gòu)
$ lipo -thin armv7s ~/debugserver -output ~/debugserver
2.給debugserver添加task_for_pid權(quán)限
下載http://iosre.com/ent.xml 放到 ~/User/用戶名/
#方法一:
$/opt/theos/bin/ldid -Sent.xml debug server
#方法二:
$ codesign -s - --entitlements ent.plist -f
3.將經(jīng)過(guò)處理的debugserver拷回iOS捏顺,并添加執(zhí)行權(quán)限
$scp ~/debugserver root@iOSIP:/usr/bin/debugserver
$ ssh root@iOSIP
$chmod +x /usr/bin/debugserver
4.用debugserver啟動(dòng)或附加進(jìn)程
啟動(dòng)executable六孵,并開啟port端口,等待來(lái)自IP的LLDB接入幅骄。
debugserver -x backboard IP:port /path/to/executable
附加ProcessName劫窒,并開啟port端口,等待來(lái)自IP的LLDB接入拆座。
debugserver IP:port -a "ProcessName"
例如:
FunMaker-5:~ root# debugserver -x backboard *:1234 /Applications/MobileSMS.app/MobileSMS
debugserver-@(#)PROGRAM:debugserver PROJECT:debugserver-320.2.89
for armv7.
Listening to port 1234 for a connection from *...
上面的代碼會(huì)啟動(dòng)MobileSMS主巍,并開啟1234端口冠息,等待任意IP地址的LLDB接入。而:
“FunMaker-5:~ root# debugserver 192.168.1.6:1234 -a "MobileSMS"
debugserver-@(#)PROGRAM:debugserver PROJECT:debugserver-320.2.89
for armv7.
Attaching to process MobileNotes...
Listening to port 1234 for a connection from 192.168.1.6...
會(huì)附加MobileSMS孕索,并開啟1234端口逛艰,等待來(lái)自192.168.1.6的LLDB接入。
如果上面的命令在執(zhí)行時(shí)報(bào)錯(cuò)搞旭,如下:
FunMaker-5:~ root# debugserver *:1234 -a "MobileSMS"
dyld: Library not loaded: /Developer/Library/PrivateFrameworks/ARMDisassembler.framework/ARMDisassembler
Referenced from: /usr/bin/debugserver
Reason: image not found
Trace/BPT trap: 5
說(shuō)明iOS上的“/Developer/”目錄下缺少必要的調(diào)試數(shù)據(jù)散怖。這種情況一般是因?yàn)闆]有在Xcode的Window→Devices菜單中添加此設(shè)備,重新添加設(shè)備就可以解決問(wèn)題肄渗≌蚓欤”
摘錄來(lái)自: 沙梓社 吳航 著.iOS應(yīng)用逆向工程(第2版)
三丶LLDB
1.image list
(lldb)image list -o -f
列舉當(dāng)前進(jìn)程中的所有模塊(image)
2.breakpoint
設(shè)置斷點(diǎn)
breakpoint
b function
br s -a address
br s -a 'ASLROffset+address'
//例子:
函數(shù)的起始位置設(shè)置斷點(diǎn);
(lldb)b NSLog
在地址處設(shè)置斷點(diǎn)
(lldb)bs s -a 0xCCCCC
(lldb)bs s -a '0x6+0x9'
禁用所有斷點(diǎn)
(lldb)br dis
禁用某個(gè)斷點(diǎn)
(lldb)br dis 6
啟用所有斷點(diǎn)
(lldb)br en
啟用所有斷點(diǎn)
(lldb)br en 6
刪除所有斷點(diǎn)
br del
刪除某個(gè)斷點(diǎn)
br del 8
指定在某個(gè)斷點(diǎn)得到出發(fā)的時(shí)候,執(zhí)行預(yù)先設(shè)置指令:
(lldb) br com add 1
3.print
打印某處的值
po 打印Object-C對(duì)象
p(char*) 通過(guò)強(qiáng)制轉(zhuǎn)換的方式打印了C語(yǔ)言基本數(shù)據(jù)類型對(duì)象
4.nexti與stepi
“nexti”與“stepi”的作用都是執(zhí)行下一條機(jī)器指令,它們最大的區(qū)別是前者不進(jìn)入函數(shù)體翎嫡,而后者會(huì)進(jìn)入函數(shù)體欠动。它們可分別簡(jiǎn)寫為“ni”與“si”,是調(diào)試時(shí)使用最多的指令之一”
5.register write
“register write”命令用于給指定的寄存器賦值钝的,從而“對(duì)程序進(jìn)行改動(dòng)翁垂,觀察程序的執(zhí)行過(guò)程有什么變化”∠踝”
四丶LLDB使用小提示
4.1.調(diào)試的二進(jìn)制文件必須從iOS中提取
4.2.LLDB中的簡(jiǎn)化輸入
4.2.1.在使用LLDB時(shí)沿猜,如果想重復(fù)執(zhí)行上一條指令,直接按回車鍵
4.2.2.如果想查看以前執(zhí)行過(guò)的指令碗脊,按方向鍵的向上和向下鍵就可以了啼肩。
五丶總結(jié):
...除了lldb;其他還需要具體情況,具體使用;實(shí)踐后才能領(lǐng)會(huì);