RPC 机制总览
🔗 r0capture.py(Python host)与 script.js(设备端注入脚本)之间的双向通信。
两个方向
| 方向 | 设备端 | Python 端 | 用途 |
|---|---|---|---|
| 设备 → Python | send(msg, data) | on_message(msg, data) | 回传抓到的流量/事件 |
| Python → 设备 | rpc.exports.xxx 实现 | script.exports.xxx() 调用 | 远程下发指令 |
send 消息结构
设备端 send 的第一个参数是 message 对象,Python 端在 message["payload"] 取到:
javascript
{
function: "SSL_read" | "SSL_write" | "HTTP_send" | "HTTP_recv"
| "dumpClinetCertificate=>..." | "SSLpinning position locator => ...",
ssl_session_id: "59FD71B7...", // 空=非SSL流量
src_addr: <uint32 网络序>,
src_port: <int>,
dst_addr: <uint32 网络序>,
dst_port: <int>,
stack: "at com.example...\n..." // 调用栈,可能 null
}第二个参数 data 是 ArrayBuffer,即本次收/发的明文字节。
data 长度==1 的事件约定
当 data 长度为 1 字节时,Python 端认为是「事件通知」(证书导出、pinning 定位),只打印 function + stack,不走流量/pcap 逻辑。
现有 RPC 导出
| 名称 | 作用 |
|---|---|
setssllib(name) | 切换要 hook 的 SSL 库通配符 |
frida 17 的特殊消息
frida 17 下,设备端首次访问 Java 会发 {type:"frida:load-bridge", name:"Java"},Python 端 on_message 识别后调 serve_bridge 把桥接源码 post 回去。详见 frida 17 兼容。