首页 > 解决方案 > 使用 pcap4j 模拟 HTTP/2 流

问题描述

我正在尝试捕获 TLS 连接的未加密字节并将它们记录到 cap 文件中以分析 HTTP/2 流量。我做了很多假设,这甚至是可能的。但是,如果我可以在 Wireshark 等有用的工具中看到流量,我愿意捏造 HTTP/2 层以下的几乎所有内容。

https://github.com/yschimke/okhttp/commit/c6b0b4c0ba3b59d44cf292955eef2685ed6094e7#diff-d4b38ff70d61641e49af93db2892080f47a2480af92ca151b2daabb50bbc459b

我的方法最终归结为

return object : DelegatingSSLSocket(socket) {
   override fun getInputStream(): InputStream {
     return object : FilterInputStream(socket.inputStream) {
       override fun read(b: ByteArray, off: Int, len: Int): Int {
         return super.read(b, off, len).also { readLen ->
           dumper.dump(
             ipv4ReadPacketBuilder.payloadBuilder(
               tcpReadPacketBuilder
                 .payloadBuilder(
                   UnknownPacket.Builder().rawData(
                     b.sliceArray(off.rangeTo(off + readLen))
                   )
                 )
             )
               .build()
           )
         }
       }
     }
   }

   override fun getOutputStream(): OutputStream {
     return object : FilterOutputStream(socket.outputStream) {
       override fun write(b: ByteArray, off: Int, len: Int) {
         super.write(b, off, len)

         dumper.dump(
           ipv4WritePacketBuilder.payloadBuilder(
             tcpWritePacketBuilder
               .payloadBuilder(
                 UnknownPacket.Builder().rawData(b.sliceArray(off.rangeTo(off + len)))
               )
           )
             .build()
         )
       }
     }
   }
 }

有没有人对 pcap4j 或 pcap 文件有任何建议,看看我做错了什么?

我正在写的数据包是 IPv4>TCP>Data

tcp 转储数据包

但 Wireshark 显示

HTTP/2 序言

标签: wiresharklibpcappcap4j

解决方案


对于 IPv4,版本始终等于 4。您的图像表明您正在尝试编写 IPv4 标头,但十六进制代码显示它不是 IPv4 标头。

在此处输入图像描述

第一个突出显示的数字是 56。应该是 4 而不是 5。因此 Wireshark 无法将其检测为 IPv4 数据包。

在此处输入图像描述

请参阅我的以下链接,它将帮助您了解示例格式。

如何从 HTTP GET 请求的 Wireshark 转储中获取源 IP

对于 TCP,它应该是 06 而不是 bb。

在此处输入图像描述

您的源 IP 也是 0.0.0.0。它不会产生任何错误,但您可以根据需要更改它。

在此处输入图像描述


推荐阅读