hook SocketOutputStream.write 详解
📤 script.js hook Java 层裸 TCP 发送,兜底抓非 TLS 流量。
📎 源码在线查看:
script.js(socketWrite0)
hook 目标
javascript
Java.use("com.android.org.conscrypt."
+ "ConscryptFileDescriptorSocket$SSLOutputStream");
// 或不同版本的:
Java.use("org.apache.harmony.xnet.provider.jsse."
+ "OpenSSLSocketImpl$SSLOutputStream");类名因 Android 版本而异,r0capture 处理多个候选。
hook 实现
javascript
OSOutput.write.overload('[B', 'int', 'int').implementation = function (buf, off, len) {
if (len > 0) {
var sub = Java.array('byte',
Array.from(buf).slice(off, off + len));
// 取 socket 五元组
var socket = this.socket; // 拿到关联的 Socket
var addrs = getPortsAndAddressesFromSocket(socket);
send({ "type": "socket_write", ... }, sub);
}
return this.write(buf, off, len);
};重载选择
write 有多个重载:
write([B)write([B, int, int)← r0capture hook 这个(带偏移+长度,最常调)write(int)
hook 指定 overload('[B','int','int') 精确匹配。
buf 处理
Java 字节数组 byte[],hook 时是 Java 数组对象。取 off..off+len 段,转成可 send 的二进制(Java.array + 转换)。
与 SSL_write 的关系
对 TLS 流量:
- App 调 SSL_write(明文 → 加密)→ r0capture SSL hook 抓到明文
- SSL_write 内部调 socket write(密文)→ 这个 hook 抓到密文
r0capture 主用 SSL hook 抓明文,socket hook 主要用于非 TLS 的裸 TCP(自定义协议)。为避免 TLS 流量被重复抓(一次明文一次密文),主机端按 type 去重。