java序列化的逆向工程

java序列化的逆向工程,java,serialization,deserialization,Java,Serialization,Deserialization,首先让我解释一下我们的项目 我们有一个客户机-服务器系统。客户机和服务器都是用java实现的。我们正在用C重新实现客户机,保持接口不变,而服务器仍使用java 客户端和服务器通信的方式是通过java动态代理,remoteid是网络连接。现在,客户机调用在服务器上调用的方法。很明显,序列化和反序列化正在进行。我想实现服务器在C中期望的相同格式。作为一名C黑客,我通过wireshark打开了数据包,并开始在java代码中映射实际字节,这对我帮助不大。代码中有几个字节我无法映射(显然我没有看到正确的代

首先让我解释一下我们的项目

我们有一个客户机-服务器系统。客户机和服务器都是用java实现的。我们正在用C重新实现客户机,保持接口不变,而服务器仍使用java

客户端和服务器通信的方式是通过java动态代理,remoteid是网络连接。现在,客户机调用在服务器上调用的方法。很明显,序列化和反序列化正在进行。我想实现服务器在C中期望的相同格式。作为一名C黑客,我通过wireshark打开了数据包,并开始在java代码中映射实际字节,这对我帮助不大。代码中有几个字节我无法映射(显然我没有看到正确的代码)

我还没有完全理解java dynamic proxy是用它的库自动序列化,还是需要在类中实现一些函数,以便将内容写入网络

有谁能建议我用更人性化的方法来解决这个问题吗


PS:我对java编程不是很在行。

我建议使用类似的工具。在C语言中重新实现Java序列化,您就如履薄冰,如果它能在您的测试环境中工作,那么在现实世界中,它很可能在真实数据上失败。

我非常喜欢维护跨语言兼容的序列化接口。您可以用一种非常简单的格式编写消息格式,
protoc
为消息对象生成您想要的任何语言的代码,并兼容地序列化它们。(它还非常擅长确保以后可以添加更多字段而不破坏所有内容,这对于轻松维护非常重要。)


默认情况下只处理java、C++和python,但是.< /p> 作为建议之一——建议您切换协议。BR> 代理本身只是调用的拦截器
我猜是执行实际通信的那个
例如,在使用框架时,许多实现都允许客户机指定它希望响应的格式—JSON、XML或其他格式
在服务器端,有一些类负责根据请求的格式“呈现”结果
我建议您实现一种机制来区分C客户机和java客户机,
并根据客户机类型使用适当的“请求解析器”和“响应编写器”
这样,您还可以实现与现有Java客户端的向后兼容性


另一个选择当然是使用相同的协议,并决定更改现有的Java客户端,
在该选项中,您可以使用DataInputStream和DataOutputStream从流中读取和写入数据,该流不只是一个字节数组或单个字节
我认为,通过一些使用wireshark的实验,例如在编写长值的情况下,您将了解正确的字节对齐方式
过去,我使用
DataInputStream和DataOutputStream,其中客户端不仅仅是Java(例如,我们有一个iOS/objective-C客户端)

我想实现服务器在C中所期望的格式

算了吧。这基本上是不可能的,除非你手头有一个JVM为你做这件事。任何Java类都可以定义自己的序列化格式,JDK中的许多类都可以这样做


考虑另一个协议,或者忘记在C中重新实现客户机。这样做的目的是什么?通常是一个反向步骤。

实现可序列化接口的任何Java类都使用此处指定的序列化协议(使用BNF语法):


如果您对编写解析器感到满意,那么您肯定可以用C实现这种语法,并使用它来反序列化和重新序列化Java对象

我建议更改协议
java.lang.reflect.Proxy
s被正确序列化-在
java.io.Object[in | Out]putStream中有特殊支持为什么要将客户机从现代(90年代中期)Java转换为C?因为性能原因。Java不能像C那样利用硬件。Java是为可移植性而不是性能而编写的。客户端性能取决于磁盘使用情况,磁盘使用情况可以在C中进行调整。难道您不能只编写一点点本机代码来使用Java中不可用的相关本机API吗?使用JNI是粗糙的,而不是我们作为设计人员满意的方法。虽然它将与一些黑客工作,但这不是一个好的解决方案。我不寒而栗地想到你的道路开始。序列化非常复杂-除非您的客户机->服务器通信非常简单且非常、非常稳定(在这种情况下,只需重新编写它以使用简单的流),否则您将受到极大的伤害。我不确定使用JNI的反对意见是什么——我们一直在使用JNI,以允许我们使用C进行高性能的低级操作,但将应用程序的大部分保留在Java中。有一些用例(你可能就是其中之一)JNI仍然有太多的开销,但我想确保这一点……好吧,这样做的原因是为了获得性能。我们的研究表明,由于java不利用硬件,磁盘和CPU利用率较低。我们不想使用JNI作为它的原始版本。好吧,如果我试图坚持使用当前的java协议,它不可能在C中实现吗?如果我在不接触服务器代码的情况下工作,我会很高兴:)我理解。我只是认为这是实现互操作性的错误方法。