You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 22:29:52