【问题标题】:Recreate Class based on Serialized Byte Array基于序列化字节数组重新创建类
【发布时间】:2014-01-04 07:03:34
【问题描述】:

我想问这个问题。我在谷歌上没有找到任何关于此的内容。

有没有办法根据序列化的字节数组重新创建一个类? 我知道它是一个序列化的对象。那是从一个 c++ 对象创建的。但我对对象本身一无所知。

我想我可以自己重新创建对象的结构,但这将是很多工作。 那么有没有办法自动分析字节序列化对象呢?

否则我将不得不手动遍历每个字节并尝试将其转换为 int、float、string 等信息。

非常感谢您的帮助,我知道我并不具体,但这里有一个例子:

00000000  10 10 00 00 03 E3 00 2B  00 0C 36 BE 4F 56 31 00  .......+..6.OV1.
00000010  00 86 00 00 00 00 00 00  00 00 00 00 03 6B 67 6B  .............kgk
00000020  6B 6B 6B 6B 6B 6B AB 5D  C4 28 D3 4B 77 29 D0 6E  kkkkkk.].(.Kw).n
00000030  EB 54 6B 6B 6B 6B 6B 6B  6B 6B 64 43 FF 2E 9F A5  .TkkkkkkkkdC....
00000040  13 28 B2 BC F7 2E EB 1F  76 29 6C 5B 72 2A 6B 6B  .(......v)l[r*kk
00000050  6B 6B 6B 6B 6B 6B 6C AC  A5 2A 6B 6B A3 29 6B 94  kkkkkkl..*kk.)k.
00000060  6E 6B 6F 6B 6B 6B E2 3E  A6 6B 6B 6B 6B 6B 6E 75  nkokkk.>.kkkkknu
00000070  FF 2E 65 F9 E7 28 6F 8F  F7 2E 96 49 FF 2E AF 17  ..e..(o....I....
00000080  E7 28 88 B6 F7 2E                                 .(....          

提前致谢。

补充:它应该包含至少 6 个浮点值。位置 (x,y,z) 和视点坐标 (x,y,z,angle)。坐标将作为浮点值发送。此外,至少包含两个长度正好为 4 个字符的字符串。

Addition2:我不知道它是如何序列化的或用什么序列化的。我只能告诉你里面有什么。另外我正在寻找一种方法来自动将其转换为可读的数据结构。有什么方法可以尝试转换字节并检查输出值是否有意义,并自动执行此操作?

Addition3:我不知道c++类长什么样,我无权访问它。

【问题讨论】:

  • 您想将 C++ 对象反序列化为 C# 对象吗?我们需要更多信息。第一:用什么来序列化 C++ 对象?
  • 极不可能,相同的记忆可能意味着许多不同的东西,具体取决于它的上下文。例如,字节 0x0 可能表示布尔 false、字符 \0、空字符串等。如果您不知道上下文(或类定义),那么您将不知道正确的意图是什么。
  • 您可以使用一些密码分析技术,例如尝试序列化具有不同值的不同对象并尝试找出其编码方式。或者您可以尝试使用一些常见的序列化方案。
  • 至少应该包含位置信息。 3 浮点数表示位置 (x,y,z) 和基于 (x,y,z) 坐标的视点和视角的 4th。
  • 你可以访问c++类吗?

标签: c# serialization


【解决方案1】:

您的问题没有简单的答案,因为没有像 .NET 那样的默认 C++ 二进制序列化格式。因此,您必须对这些数据进行二进制逆向工程。

因为你说一个类至少包含几个浮点数和两个字符串,所以我将从使用两个典型的 C++ 序列化库的一个字符串和浮点字段序列化类似的类开始:

并与您的数据进行比较。如果您知道存储在示例数据中的值,请尝试找到它们并与来自这些序列化程序的类似数据进行比较。

但是,在回答您的主要问题时,确实存在可以帮助您的自动工具。我将从搜索自动协议分析开始,因为大部分工作和工具都与网络协议分析有关 - 这与您的问题相似,因为两者都试图理解二进制数据的未知结构。尽管如此,到目前为止我看到的大多数工具都比较学术,比如PolyglotThe Protocol Informatics ProjectPROTOS。如果你很高兴拥有基于 Mac OS X 的系统,你可以使用很棒的Synalaze It! 工具来帮助你一点。

【讨论】:

  • 感谢您的回答,但我正在寻找 .net 中的内容。外面有什么吗?是的,我可以使用 c++,但我不太喜欢这种语言。
  • @TheSky,我不知道有任何 .net 库/工具可以对此有所帮助,而且不太可能有。
  • 我开始手动处理它。我自己得到了一些位置数据并将它们转换为字节。并在字节数组中查找看起来像我的位置数据的值。手动完成需要一些时间,但我认为这种方式比学习如何自动完成要快。但是谢谢你的信息。学术部分很有用,而且仍然很有趣。我正在读它。
【解决方案2】:

可以在 C# 中进行序列化。 (请查看this 以获取更多信息。)但是,从 C++ 到 C# 将无法正常工作。但是,您需要做的就是设置协议/标准...然后让您的 C# 类读入(使用 BinaryReader 或其他东西)byte[] 并以这种方式构建类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    相关资源
    最近更新 更多