元始天尊 发表于 2017-1-9 13:59:06

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]
查看完整版本: lldb/gdb通信协议研究