繁体   English   中英

逆向工程java序列化

[英]reverse engineer java serialization

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

我们有一个客户端服务器系统。 客户端和服务器都是用java实现的。 我们在C中重新实现客户端,保持接口相同并使服务器保持在java中。

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

我还没有完全理解java动态代理是否自动与其库串行化,或者你是否需要在类中实现一些函数,以便可以将内容写入线路。

任何人都可以建议我更人性化的方法来解决这个问题吗

PS:我对java编程不是很了解。

我是Google协议缓冲区的粉丝,用于维护跨语言兼容的序列化界面。 您以相当简单的格式编写消息格式,并且protoc以您希望的消息对象的任何语言生成代码并兼容地序列化它们。 (它也非常擅长确保您可以在不破坏所有内容的情况下添加更多字段,这对于轻松维护事物非常重要。)

它默认只处理Java,C ++和Python,但存在C插件

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

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

考虑另一个协议,或忘记在C中重新实现客户端。无论如何,目的是什么? 通常是逆行步骤。

我宁愿建议使用像Thrift这样的东西。 通过在C中重新实现Java序列化,您可以轻松实现,如果它可以在您的测试环境中运行 - 它可能会在现实世界中的真实数据上失败。

正如其中一条评论建议的那样 - 我建议你切换协议。
java.lang.reflect.Proxy本身只是一个调用的拦截器。
我猜InvocationHandler是执行实际通信的那个。
当使用例如REST框架时,许多实现让客户端指示它希望以哪种格式获得响应--JSON,XML或其他。
在服务器端,有些类负责根据请求的格式“呈现”结果。
我建议你实现一个区分C客户端和java客户端的机制,
并且基于客户端类型将使用适当的“请求解析器”和“响应编写器”
这样,您还将实现与现有Java客户端的向后兼容性


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

任何实现Serializable接口的Java类都使用指定的序列化协议(带有BNF语法): https//docs.oracle.com/javase/8/docs/platform/serialization/spec/protocol.html

如果您习惯编写解析器,您肯定可以在C中实现此语法,并使用它来反序列化和重新序列化Java对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM