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()→ 返回 intread([B)read([B, int, int)← hook 这个
兜底作用
当 native SSL_read 抓不到时(自带 SSL/新版 Conscrypt),Java InputStream hook 可作为后备捕获解密后的明文。见 write-but-no-read。