Skip to content

hook SocketInputStream.read 详解 ​

📥 script.js hook Java 层裸 TCP 接收。

📎 源码在线查看:script.js(socketRead0)

hook 目标 ​

与 write 对应的 InputStream 类:

javascript
Java.use("com.android.org.conscrypt."
    + "ConscryptFileDescriptorSocket$SSLInputStream");

hook 实现 ​

javascript
OSInput.read.overload('[B', 'int', 'int').implementation = function (buf, off, len) {
    var ret = this.read(buf, off, len);  // 先调原方法填充 buf
    if (ret > 0) {
        var sub = Java.array('byte', 
            Array.from(buf).slice(off, off + ret));
        var addrs = getPortsAndAddressesFromSocket(this.socket);
        send({ "type": "socket_read", ... }, sub);
    }
    return ret;
};

关键:先调原方法再读 ​

与 SSL_read 不同,Java read 的 buf 是调用方传入的数组,hook 里先调原 read 填充 buf,再读 buf 的前 ret 字节。

方向处理 ​

read 是对端→本端,pcap 包 src/dst 对调(与 socket_write 相反,与 SSL_read 一致)。

重载 ​

read 重载:

  • read() → 返回 int
  • read([B)
  • read([B, int, int) ← hook 这个

兜底作用 ​

当 native SSL_read 抓不到时(自带 SSL/新版 Conscrypt),Java InputStream hook 可作为后备捕获解密后的明文。见 write-but-no-read。

相关文档 ​

基于 VitePress 构建 · 教学用途