fanxs-t/Android-SSL_read-write-Hook

并不能获取https的报文

Opened this issue · 14 comments

在Interceptor.attach(addresses["SSL_read"]获取buf里面的数据,可以通过Memory.readByteArray(this.buf, retval)打印一下,全都是加密了的data。
图片

SSL_read() 函数的说明:

SSL_read() works based on the SSL/TLS records. The data are received in records (with a maximum record size of 16kB for SSLv3/TLSv1). Only when a record has been completely received, it can be processed (decryption and check of integrity).
请看最后一句话,这个脚本是如何做到去解密数据的。

SSL_read() 函数的说明:

SSL_read() works based on the SSL/TLS records. The data are received in records (with a maximum record size of 16kB for SSLv3/TLSv1). Only when a record has been completely received, it can be processed (decryption and check of integrity).
请看最后一句话,这个脚本是如何做到去解密数据的。

经过测试是能获取https的报文的。对这段话我的理解是,系统调用SSL_read获取数据时,只有当一个SSL/TLS record完整收到后,才会进行解密和校验完整性,否则将数据buffer,在下一次ssl_read时再进行这个步骤。如果SSL_read的返回值大于0时,就可以在this.buffer中读取到解密的数据。请先确认一下数据本身是否做了额外的加密。

okhttp3的网络框架。就算数据做了二次加密,但是http的报文头没法做二次加密,报文头是可以解析出来的哈,我的理解。

我的理解是这些数据已经被ssl整体加密了吧,不然咋个pcap抓包看https,全部都是解密了的data的呢。

报文头确实不加密,不知道你那个是什么情况,但我用burp验证过是可以抓到https请求的。这pcap不是用wireshark抓的,是Frida hook抓到了https的请求后,将报文写入了pcap文件。

@fanxs-t 你说得对,有一种情况可以抓到,那就是开代理,然后上frida,后来发现在html里面竟然有https的报文,在burp上也看到了,但是代理一关,html里面又抓取不到了,然后frida的打印就是我上面那个截图,一看就是整体加密了的报文。

我又测试了一下,的确存在这个问题,可能和你之前说的相关,我再看一下怎么去解决。非常感谢!

@fanxs-t 老外的原始js版本,都有问题,看起来其实很简单。主要是不不熟悉底层函数,例如那个获取不到ip的问题,看了那个函数原型,感觉偏移量看起也没问题。

@zxhubo 是的,他原始的脚本是针对Linux的,而且跑起来会有问题。关于获取不到ip的问题,我也看过了那个底层api,不知道哪里出了问题,还是得再研究一下…

@fanxs-t 咋样,有结果了的吗

这是http2的抓包结果,http2报头是hpack压缩了,不能直接看到明文,另外没有ip为0是因为连接尚未建立,hook accept()函数才能得到真正的ip,见https://stackoverflow.com/questions/5759031/getsockname-always-returning-0-0-0-0

@meanwhilehh 大佬啥意思? http 2.0协议的吗,那要如何处理的呢。

@meanwhilehh 大佬啥意思? http 2.0协议的吗,那要如何处理的呢。

你直接wireshark打开把它指定为http2消息就行了, 能看到header,看你这消息也是加密过的,没什么办法,回Java层分析加密逻辑吧

@meanwhilehh 加密也是加密了body,应该不会加密header的啊。我看有些人说hook SSL_read或者SSL_write是可以的拿到https报文的呢。