首页
社区
课程
招聘
[原创]lldb/gdb通信协议研究
发表于: 2017-1-7 22:53 7001

[原创]lldb/gdb通信协议研究

2017-1-7 22:53
7001

lldb协议在gdb协议基础上进行了扩展

gdb协议通用格式:
$packet-data#checksum         单个包
$sequence-id:packet-data#checksum    分包
+传输正常
-传输错误

其中packet-data字段预置如下值:
5b2K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6L8%4g2J5j5$3g2%4j5i4u0W2i4K6u0W2L8%4u0Y4i4K6u0r3k6$3c8T1i4K6u0r3j5%4g2J5M7X3g2F1N6q4)9J5c8X3!0F1L8r3W2F1k6h3c8G2j5%4y4Q4x3V1k6Y4k6r3u0Q4x3V1k6d9k6h3#2G2N6r3g2Q4x3X3c8b7M7X3!0@1L8$3y4G2L8q4)9J5k6h3S2@1L8h3H3`.
?                                                停止原因
!                                                扩展模式                           
A arglen,argnum,arg,...        传入参数        
B addr,mode                                设置断点            
bc                                                反向调试 continue         
bs                                                反向调试 singlestep      
c [addr]                      从地址 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 [addr[,nnn]]                   
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 [addr]                      单步
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 bp  kind=>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


[培训]科锐软件逆向54期预科班、正式班开始火爆招生报名啦!!!

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回