吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6599|回复: 5
收起左侧

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

[复制链接]
lichao890427 发表于 2017-1-7 22:57
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 [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

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
a40810907 + 1 + 1 已答复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

心灵手巧 发表于 2017-1-7 23:12
看天书一般啊,啥时候能懂
L__ 发表于 2017-1-8 14:34
黑狼战神 发表于 2017-3-17 17:32
ztxbeyond 发表于 2017-3-19 17:24
完全看不懂 要是配上图可能好点
djcsdjcs 发表于 2017-4-17 16:00
太底层了,实际工作中用不到,还不如写写LLDB的小技巧哈哈
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-26 16:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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