Skip to content

Frida send/recv 机制 ​

📨 设备端 script.js 与主机端 r0capture.py 的消息通道。

是什么 ​

Frida 注入的脚本(设备端)和主机端通过 send/recv 通信:

  • 设备端 send(message, data) → 主机端 on_message 回调
  • 主机端 script.post(type, payload) → 设备端 recv 回调

r0capture 的用法 ​

设备端 → 主机端(主要方向) ​

javascript
// script.js
send(
    { "type": "SSL_write", "src_addr":..., "src_port":..., ... },
    this.buf.readByteArray(written)   // 二进制载荷
);

send 第一参是 JSON 可序列化的元数据,第二参是可选的 ArrayBuffer 二进制数据(明文)。

主机端接收 ​

python
# r0capture.py
def on_message(message, data):
    if message["type"] == "send":
        p = message["payload"]
        if p["type"] == "SSL_write":
            ssl_log(p, data)   # 写日志/pcap

主机端 → 设备端(RPC) ​

python
# 主机端调用设备端导出的函数
script.exports.setssllib("/system/lib64/libssl.so")
javascript
// script.js
rpc.exports = {
    setssllib: function(path) { ... }
};

详见 RPC exports。

消息类型 ​

来源方法用途
设备端send(meta, data)传抓到的明文+元数据
设备端console.log调试日志(也走 on_message)
主机端script.exports.xxx()RPC 调用
主机端script.post()发消息给设备端

为什么分两参 ​

send(meta, data) 把 JSON 元数据和原始二进制分开:

  • meta 走 JSON(便于主机端解析字段)
  • data 走二进制原样传输(避免 Base64 编码开销,保持字节准确)

r0capture 的明文载荷可能是任意二进制(含 \0),用 data 通道最稳。

相关文档 ​

基于 VitePress 构建 · 教学用途