从 Java Web 小程序解密 SSL/TLS 流量

逆向工程 解密 爪哇 协议
2021-07-02 13:01:18

我正在尝试对用 Java 编写的聊天协议进行逆向工程,以实现我自己的客户端。官方客户端是嵌入在网站中的 Java 小程序,所以我认为它可能只使用 https,但我发现使用 wireshark 时它使用通用协议和任意端口。我的第一种方法是使用 java 代理设置和代理来强制通过 fiddler 的流量,希望它可以给我一些关于协议结构的更多信息,但没有成功 - fiddler 甚至没有识别流量,但我猜那是因为它是仅为 http/s 流量开发。

所以我的问题是:如何对所使用的协议进行逆向工程?我认为必须有类似于 fiddler 的东西使用套接字代理或网桥(类似于许多 VPN 客户端使用的东西),但我在 windows 下找不到任何工作。另一种方法是反编译 java 二进制文件,但我对仅在协议中的代码本身并不真正感兴趣。任何建议如何从这里开始?

1个回答

如果您知道如何使用wireshark,您就真的不需要其他工具。Wireshark 将让您提取流的 TCP 部分,这正是您使用任何类型的代理或网桥所获得的。

根据您的描述,我认为该协议不仅仅是某种纯文本,例如您的聊天被封装到 XML 中的 SOAP 中 - 很容易分析这一点。二进制数据的问题在于您可以进行一些猜测,但如果它们不合适,您除了分析小程序之外实际上无能为力。

如果我是你,我会做的是:

  • 强制wireshark 将连接视为SSL(右键单击数据包,“解码为”,然后选择SSL)。如果通信是 SSL 加密的,wireshark 至少应该在开始时找到可解码的客户端 hello / 服务器 hello 数据包交换。如果该数据包交换有意义,您可以继续摆弄 DNS 以重定向客户端的请求,并设置 fiddler、stunnel 或 mitmproxy 来接收、解码和转发这些请求。

  • 捕获几十 KB 的流量,并将生成的 TCP 流保存到文件中。尝试使用 gzip 压缩此文件。如果它压缩得很好,那么 TCP 流可能没有被压缩,只是用一种弱的、类似 XOR 的算法加密。在聊天中输入“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”。然后在聊天中输入“bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb”。检查线路上的数据会发生什么。也许这会让你预感到数据是如何编码的,以及如何进行的想法。

  • 如果 TCP 流未压缩,则它要么是预压缩的,要么是使用增加大量熵的算法加密的。将聊天文本的大小与 TCP 流的大小进行比较可能会让您知道它是什么。如果是压缩的,请检查每个数据包的前几个字节,如果它们相似,则可能是每个数据包都有其单独的压缩。根据众所周知的压缩算法的签名检查这些前几个字节或流的前几个字节。

  • 如果所有这些都无济于事,您最好的猜测是通过 java 反编译器运行整个过程(http://www.javadecompilers.com/ 上有一个不错的集合),因为并没有真正好的方法来猜测加密算法和/或仅来自输出字节流的密钥。

顺便说一句,提及您在哪个网站上找到聊天内容并没有什么坏处(即使是像 littlenudegirls.com 这样的令人尴尬的网站,因为您在这里没有使用您的真实姓名);也许其他人正在阅读这篇文章并且有更详细的信息可以分享您的特定网站,或者也许将来有人会在谷歌上搜索并与您联系以共同处理它。