lldb/gdb通信协议研究
lldb协议在gdb协议基础上进行了扩展gdb协议通用格式:
$packet-data#checksum 单个包
$sequence-id:packet-data#checksum 分包
+传输正常
-传输错误
其中packet-data字段预置如下值:
https://sourceware.org/gdb/current/onlinedocs/gdb/Remote-Protocol.html
? 停止原因
! 扩展模式
A arglen,argnum,arg,...传入参数
B addr,mode 设置断点
bc 反向调试 continue
bs 反向调试 singlestep
c 从地址 continue
C sig[;addr] 以信号 Continue
D 分离gdb
D;pid 分离进程
F RC,EE,CF;XX File I/O Operation(lldb不支持)
g 读取通用寄存器(一般的),返回的数据为编码过的二进制数据,内容由对应架构文件定义(调试器常常先使用p命令,失败再使用g命令)
G XX… 写入通用寄存器(小写命令为读,大写为写,下同)
H op thread-id 设置线程状态
i ]
I
m addr,length 读取内存,返回16进制字符串(调试器会尝试x命令,失败会尝试m命令)
M addr,length:XX... 写内存
p n 读取指定寄存器,n为架构定义值
P n...=r... 写寄存器
q name params... 通用查询包,详细见后
Q name params... 通用查询包,详细见后
r 重启
R XX 重启进程
s 单步
S sig[;addr] 单步
t addr:PP,MM 按模式搜索内存
T thread-id 检测线程存在
vAttach;pid 附加进程
vCont[;action[:thread-id]]... continue
vCont? 获取coninue的action:c-continue;C sig-continue with sig;s-step;S sig-step with sig;t-stop
vCtrlC 中断程序运行
vFile:operation:parameter... 文件操作(lldb不支持)
vKill;pid 结束进程
vRun;filename[;argument]...运行进程
vStopped
x addr,length 读内存
X addr,length:XX... 写内存
z type,addr,kind 移除断点
Z type,addr,kind 增加断点
z0,addr,kind 移除软件断点
Z0,addr,kind[;cond_list...][;cmds:persist,cmd_list...]增加软件断点
z1,addr,kind 移除硬件断点
Z1,addr,kind[;cond_list...][;cmds:persist,cmd_list...]增加硬件断点
z2,addr,kind 移除观察写断点
Z2,addr,kind 增加观察写断点
z3,addr,kind 移除观察读断点
Z3,addr,kind 增加观察读断点
z4,addr,kind 移除观察访问断点
Z4,addr,kind 增加观察访问断点
{ARM Z0/Z1 kind=>2=16bitthumb mode bp kind=>3=32bit Thumb-2mode bpkind=>4=32bit ARM mode bp}
常用查询包:
qC 获取当前线程
qsThreadInfo/qfThreadInfo获取所有线程
QNonStop
qRcmd
QStartNoAckMode 关闭应答模式,这样响应就不会出现太多'+'
qSupported [:gdbfeature [;gdbfeature]... ]查询扩展特性(用于gdb,可获取host info, register layout,thread info,module memory,library info等)
lldb扩展包(由源码分析得到):
qHostInfo 系统信息
qLaunchGDBServer
qQueryGDBServer
qModuleInfo
qProcessInfoPID 进程信息
QSetDisableASLR
qPlatform_shell 远程命令
qPlatform_mkdir
qPlatform_chmod
vFile_ (未实现)
QRestoreRegisterState用于构造context执行任意地址
QSaveRegisterState
QThreadSuffixSupported
qGDBServerVersion
qMemoryRegionInfo 获取module memory
qRegisterInfo 获取寄存器信息(非值)
qShlibInfoAddr 获取library info
qVAttachOrWaitSupported
qWatchpointSupportInfo
_M malloc()
_m free()
lldb初始化通信分析
+同步
QStartNoAckMode
QThreadSuffixSupported
QListThreadsInStopReply
qHostInfo
vCont
qVAttachOrWaitSupported
qC
?
qProcessInfo
qRegisterInfo0->65获取所有寄存器信息(每个寄存器的属性,非值)
p0;thread:557 指定线程指定寄存器值
qShlibInfoAddr 获取_dyld_all_image_infos基址,用于后续解析各模块
...........解析各个macho结构和符号表........
qThreadStopInfo
qMemoryRegionInfo 内存块查询
gdb初始化通信分析
+
qSupported:multiprocess+;swbreak+;hwbreak+;qRelocInsn+;fork-events+;vfork-events+;exec-events+;vContSupported+;QThreadEvents+;no-resumed+;xmlRegisters=i386
+
QStartNoAckMode
+
QProgramSignals:
Hgp0.0 设置线程
qXfer:features:read:target.xml:0,fff 获取系统信息及寄存器内部数据
qXfer:features:read:32bit-Linux.xml:0,fff获取特殊寄存器(include在target.xml中)
qXfer:auxv:read::0,1000 获取/proc/pid/auxv
QNonStop:0
qTStatus
qTfV
qTsV
?
qXfer:threads:read::0,fff 读取线程详细信息
qAttached:640 读取第I个线程
qXfer:exec-file:read:640:0,fff 读取主模块文件
qXfer:libraries-svr4:read::0,fff 读取加载模块表
其他特性:
call stack是根据各架构指令特点来解析的
call api是set context方式运行的
po指令定义函数 临时编译成shellcode执行
其他命令:
gdbserver打印数据包:--remote-debug
lldbserver打印数据包:--log-file stdout --log-flags 8388608
页:
[1]