一丶介绍
“LLDB全称为“Low Level Debugger”,是由苹果出品,内置于Xcode中的动态调试工具,不但通吃C、C++、Objective-C,还全盘支持OSX、iOS,以及iOS模拟器。
LLDB的功能可以概括为以下四点:
·在指定的条件下启动程序;
·在指定的条件下停止程序;
·在程序停止的时候检查程序内部发生的事;
·在程序停止的时候对程序进行改动,观察程序的执行过程有什么变化。”
“debugserver运行在iOS上,顾名思义,它作为服务端,实际执行LLDB(作为客户端)传过来的命令,再把执行结果反馈给LLDB,显示给用户,即所谓的“远程调试”。
在默认情况下,iOS上并没有安装debugserver,只有在设备连接过一次Xcode,
并在Window→Devices菜单中添加此设备后,debugserver才会被Xcode安装到iOS的“/Developer/usr/bin/”目录下。
二丶debugserver
1.减肥
找到你手机对应的ARM架构;
1.1“将未经处理的debugserver从iOS拷贝到OSX中的“/Users/snakeninny/”目录下,命令如下:
$scp root@iOSIP:/Developer/usr/bin/debugserver ~/debugserver
1.2减肥 armv7s == 你iPhone的架构
$ lipo -thin armv7s ~/debugserver -output ~/debugserver
2.给debugserver添加task_for_pid权限
下载http://iosre.com/ent.xml 放到 ~/User/用户名/
#方法一:
$/opt/theos/bin/ldid -Sent.xml debug server
#方法二:
$ codesign -s - --entitlements ent.plist -f
3.将经过处理的debugserver拷回iOS,并添加执行权限
$scp ~/debugserver root@iOSIP:/usr/bin/debugserver
$ ssh root@iOSIP
$chmod +x /usr/bin/debugserver
4.用debugserver启动或附加进程
启动executable,并开启port端口,等待来自IP的LLDB接入。
debugserver -x backboard IP:port /path/to/executable
附加ProcessName,并开启port端口,等待来自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 *...
上面的代码会启动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...
会附加MobileSMS,并开启1234端口,等待来自192.168.1.6的LLDB接入。
如果上面的命令在执行时报错,如下:
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
说明iOS上的“/Developer/”目录下缺少必要的调试数据。这种情况一般是因为没有在Xcode的Window→Devices菜单中添加此设备,重新添加设备就可以解决问题。”
摘录来自: 沙梓社 吴航 著.iOS应用逆向工程(第2版)
三丶LLDB
1.image list
(lldb)image list -o -f
列举当前进程中的所有模块(image)
2.breakpoint
设置断点
breakpoint
b function
br s -a address
br s -a 'ASLROffset+address'
//例子:
函数的起始位置设置断点;
(lldb)b NSLog
在地址处设置断点
(lldb)bs s -a 0xCCCCC
(lldb)bs s -a '0x6+0x9'
禁用所有断点
(lldb)br dis
禁用某个断点
(lldb)br dis 6
启用所有断点
(lldb)br en
启用所有断点
(lldb)br en 6
删除所有断点
br del
删除某个断点
br del 8
指定在某个断点得到出发的时候,执行预先设置指令:
(lldb) br com add 1
3.print
打印某处的值
po 打印Object-C对象
p(char*) 通过强制转换的方式打印了C语言基本数据类型对象
4.nexti与stepi
“nexti”与“stepi”的作用都是执行下一条机器指令,它们最大的区别是前者不进入函数体,而后者会进入函数体。它们可分别简写为“ni”与“si”,是调试时使用最多的指令之一”
5.register write
“register write”命令用于给指定的寄存器赋值,从而“对程序进行改动,观察程序的执行过程有什么变化”。”
四丶LLDB使用小提示
4.1.调试的二进制文件必须从iOS中提取
4.2.LLDB中的简化输入
4.2.1.在使用LLDB时,如果想重复执行上一条指令,直接按回车键
4.2.2.如果想查看以前执行过的指令,按方向键的向上和向下键就可以了。
五丶总结:
...除了lldb;其他还需要具体情况,具体使用;实践后才能领会;