:::tip
记录一下面对Okhttp开启了NO_PROXY后如何通过hook的方式抓取其https传输数据
:::

今天为了白嫖某隧道,想抓包一下试试,但是很奇怪的发现没有任何Http包,难道用的Socket的传输的?但是细想不至于,于是乎就分析了一下代码,结果分析的时候看到。

1
2
3
OkHttpClient.Builder newBuilder = new OkHttpClient().newBuilder();
newBuilder.proxy(Proxy.NO_PROXY);
newBuilder.addInterceptor(getHeaderIntercepter("api/v2.0/addTicket"));

嗨,原来我设置的Http代理服务器让他给reset了,不走我抓包软件的http隧道了。于是想利用Frida 的方法Hook掉这个(主要是Xposed在模拟器上兼容有点不太好),但是不能给空值,一筹莫展的时候,泉哥给了一个大佬的解决方案,遂记录再此。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 先构造一个 java.net.Proxy
const host = Java.use('java.lang.String').$new("192.168.0.123");
const port = 8888;
const ProxyClz = Java.use('java.net.Proxy')
const InetSocketAddressClz = Java.use('java.net.InetSocketAddress');
const addr = InetSocketAddressClz.$new.overload('java.lang.String', 'int').call(InetSocketAddressClz, host, port);
const HTTP = Java.use('java.net.Proxy$Type').class.getEnumConstants()[1]
console.log(addr);
console.log(HTTP)
const mProxy = ProxyClz.$new.overload('java.net.Proxy$Type', 'java.net.SocketAddress').call(ProxyClz, HTTP, addr);
console.log(mProxy);

Java.use('okhttp3.OkHttpClient')['proxy']
.overload()
.implementation = function () {
console.log("[OkHttpClient][proxy]");
return mProxy;
}

如上,自己new一个Proxy,然后set上去,让他走192.168.0.1238888端口的http代理,这样更好,连在wifi上配置http代理都省了,直接转发到抓包软件上去了。

参考资料:

  1. 抓包二三事