技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 506|回复: 0
收起左侧

lldb/gdb通信协议研究

[复制链接]

268

主题

441

帖子

4648

积分

用户组: 真·技术宅

UID
2
精华
61
威望
148 点
宅币
3480 个
贡献
126 次
宅之契约
0 份
在线时间
599 小时
注册时间
2014-1-25
发表于 2017-1-9 13:59:06 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

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

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

其中packet-data字段预置如下值:
https://sourceware.org/gdb/curre ... emote-Protocol.html
?            停止原因
!            扩展模式                           
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 addrP,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                  中断程序运行
vFileperation: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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2018-11-21 16:06 , Processed in 0.077932 second(s), 15 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表