如何在LLDB中打印OpenSSL SSL_read()接收的数据?
ARM64架构下调试SSL读写数据
打印SSL_write发送的 outgoing 数据
在ARM64架构下,要打印SSL_write()发送的 outgoing 数据很简单,使用以下调试器命令:
break set --auto-continue true -n SSL_write break command add memory read -f Y -c `$x2` $x1 DONE
SSL_write()的函数签名:
int SSL_write(SSL *ssl, const void *buf, int num);
ARM64架构中,前8个寄存器用于传递可放入寄存器的参数,因此buf对应寄存器$x1,num对应寄存器$x2。命令中的-f Y参数表示以十六进制加ASCII的格式转储内存。
打印SSL_read读取的 incoming 数据的问题解决
问题说明
SSL_read()的函数签名:
int SSL_read(SSL *ssl, void *buf, int num);
和SSL_write()不同,SSL_read()只有在函数返回后,读取的数据才会存入buf,且函数返回值才是实际读取的字节数,参数num只是缓冲区的容量。
直接在SSL_read()的返回地址设置断点不可行,因为每次二进制加载时该地址都会变化;尝试用finish跳出函数的方法也失败:一是finish会中断断点命令的执行,二是函数返回后$x1不再指向缓冲区,无法获取缓冲区地址。
解决方案
我们可以在SSL_read()入口处保存缓冲区地址,再设置临时断点在函数返回时读取数据,具体命令如下:
break set --auto-continue true -n SSL_read break command add # 将缓冲区地址保存到调试器临时变量 set $saved_buf = $x1 # 设置临时断点在当前函数的返回地址,仅触发一次 break set -o $pc -t 1 # 为临时断点添加数据读取命令 break command add # 以十六进制+ASCII格式读取实际返回长度的数据 memory read -f Y -c `$x0` $saved_buf DONE DONE
原理说明:
- 在
SSL_read()入口断点触发时,将缓冲区地址($x1)保存到自定义临时变量$saved_buf,避免函数返回后寄存器值被覆盖; - 设置的临时断点(
-t 1)会在函数返回时触发,此时$x0寄存器存储的是SSL_read()的返回值,即实际读取的字节数; - 最后用
memory read命令,根据保存的缓冲区地址和实际读取长度转储数据。
内容的提问来源于stack exchange,提问作者Mecki
相关产品推荐
相关产品推荐

