如何嗅探和分析 Java RMI 流量?在wireshark 中只有非常部分的解决方案。我需要通过嗅探 TCP 连接确切地知道调用了哪些方法以及传递了哪些参数。
4 回答
您可以设置一些java 属性以使 rmi 更详细。
可能你需要这个设置:
sun.rmi.client.logCalls(1.4 及更高版本)
如果此属性的值为 true,则 sun.rmi.client.call 记录器将设置为 Level.FINER 级别。远程调用记录在 Level.FINER 级别,远程调用的异常记录在 Level.FINE 级别。
您需要“嗅探”它,还是可以在客户端或服务器上部署自定义套接字工厂?
过去,我创建了一个自定义 RMI 服务器套接字工厂,它在 RMI 服务读取的流上创建了一个“tee”。当 RMI 运行时正常读取其中一个流时,我的代码也得到了 JRMP 的副本来解析。在我的例子中,我记录了远程调用,包括它们以序列化形式出现的参数,以便稍后我可以“重放”它们以进行负载测试。仅仅启用 RMI 日志记录选项是不够的。
一个问题是 JRMP 文档很差,而且在某些情况下不准确。另一个是许多必要的代码不是核心 Java API 的一部分。这很复杂。在开始之前,我以为我对 RMI 很了解,但是在完成了这个小项目之后,我很惊讶我还需要学习多少东西。
类似的方法可以应用于 Wireshark 捕获的应用程序数据,但我从未为 Wireshark 编写过分析器,我不确定它有多复杂。
空灵可能会有所帮助,但它的水平很低。
我不知道有什么工具可以从网络上嗅探和破译 RMI 流量。如果没有其他人这样做,那么一个不太理想的解决方案可能是检测您的存根/骨架(如果您使用 Java 5 或更高版本,可能会自动生成)或带有代码的 RMI 基础架构的一部分以输出日志消息。
您可以使用 AOP 或一些字节码操作工具来实现这一点。我已成功使用JavaAssist完成与您类似的任务。对于这种性质的工具来说,它非常友好。