【问题标题】:.NET Binary serialization metadata.NET 二进制序列化元数据
【发布时间】:2013-08-16 19:18:27
【问题描述】:

一周前,我遇到了一种情况,我必须读取由其他人制作的另一个应用程序制作的二进制序列化对象。 我只有 someSerializedData.bin 文件,所以我尝试手动重新创建未知对象的类定义,并且我能够这样做,因为序列化文件中的元数据。 奇怪的是,我在 google 上找不到任何工具。

Q1:为什么没有工具可以从二进制序列化文件/数据重新创建类定义?

这就引出了我的第二个问题

Q2:是否存在无法从序列化数据中恢复类定义的情况? (假设它没有以任何方式加密或混淆,我对涉及“默认”.NET Binaryserializer 属性的情况感兴趣,以禁用包含的类型信息和元数据)

【问题讨论】:

  • 请不要只投反对票,告诉我哪里出了问题,以便我改进问题。
  • 我认为您正在寻找的东西称为反射(获取机器代码并将其反转回 C#)对吗?
  • 您有制作 .bin 文件的应用程序的副本吗?如果是这样,您可以对其进行反编译并查看代码。见dotPeak:jetbrains.com/decompiler
  • 也许这个链接可以帮助你。 msdn.microsoft.com/en-us/library/cc236844.aspx
  • 二进制序列化通常由实现 ISerializable 的类自定义。例如,有很多 .NET 类。您无法从二进制数据中恢复。

标签: c# class metadata definition binary-serialization


【解决方案1】:

在不知道其中内容的情况下,不可能反序列化二进制数据。做到这一点的唯一方法是使用 JSON 或 XML 对其进行序列化。 举例说明:

你的名字“Casual”可以这样序列化:67,97,115,117,97,108。如果您没有注意到:这是使用 ASCII 编码完成的(如果我没有犯任何错误)。所以现在,假设你不知道这是用 ASCII 完成的,谁说这不仅仅是一个带有数字的数组?还是 2 个数字的 3 个数组?或者一个 ID 为 67 的对象和一个 ID 为 117 的对象。没人知道,所以你的任务是不可能的。

唯一的选择是与最初序列化它的人沟通,并询问他/她这是如何完成的以及在这个二进制对象中序列化了哪些对象。

亲切的问候

【讨论】:

  • 我们说的是 .NET 二进制序列化,而不是自定义序列化。我的问题不是我是否可以反序列化一个未知对象。 (顺便说一句,由于包含元数据-> questions/17996701/binary-deserialization-without-object-definition)我的问题是您是否可以在没有那么多元数据的情况下使用Binaryformatter(不是自定义!)进行序列化,这将有所帮助任何人都可以恢复对象的原始类定义。无论如何谢谢你的回答:)
  • @Casual 我的问题是您是否可以在没有那么多元数据的情况下使用 Binaryformatter(不是自定义的!)进行序列化,这将有助于任何人恢复对象的原始类定义 ,你的问题不是这个...不等于是否存在无法从序列化数据中恢复类定义的情况?跨度>
【解决方案2】:

Q1:为什么没有从二进制序列化文件/数据重新创建类定义的工具?

我猜很少有人需要这个。首先,二进制序列化不如 XML、JSON 和其他标准化且几乎在任何地方都受支持的格式流行。

没有关于二进制格式的文档。需要深入研究 .NET Framework 源代码才能理解它。不好玩。

Q2:是否存在无法从序列化数据中恢复类定义的情况?

看起来二进制格式包含足够的数据。如果您绝对需要一个工具来从序列化文件中对原始类及其字段进行逆向工程,您可以从 mscorlib 中读取System.Runtime.Serialization.Formatters.Binary.BinaryFormatterSystem.Runtime.Serialization.Formatters.Binary.ObjectReader 和其他类的源代码开始。

但是,如果生成文件的应用程序没有被混淆,我建议先尝试反编译它。这可能会容易得多。

附:不要忘记咨询您的律师。

【讨论】:

  • #Athari “别忘了咨询你的律师”是什么意思。 ? :P
  • @Casual 反编译您不拥有的软件在许多国家都是非法的。拥有商业软件是指实际拥有,而不是购买副本以供使用,因为许多 EULA 不允许反编译。有一些国家,包括澳大利亚和俄罗斯,总是允许为特定目的反编译,覆盖所有 EULA。我不确定逆向工程文件格式和协议。总的来说,如果您不确定,最好咨询律师。附言它不是 ”#”。并且有关 cmets 的通知始终发送给问题和答案的作者。
【解决方案3】:

没有工具存在的原因是因为创建一个只包含数据的类型通常是不够的。这些方法通常与数据一样重要,尤其是对于不只是设置其私有变量的属性。没有人知道这些方法是什么。

话虽如此,拥有一个至少能够生成一种类型来保存数据的工具可能会很有用。也许你会是第一个创建这样一个工具的人?

【讨论】:

    【解决方案4】:

    我不确定元数据中是否有足够的信息来重新创建该类型。想象一下复杂的(如嵌套的)对象图。在您之前的问题中,成员类型(String vs int)一直是个问题。

    关于您的第二个问题,我不确定您要达到什么目标。我不确定您是否可以使用 BinaryFormatter 以不太容易进行逆向工程的方式输出数据,但其他方法应该易于实现。

    【讨论】:

    • string vs int 只是一个问题,因为他猜测类型而不是读取实际的二进制数据。
    猜你喜欢
    • 2016-09-15
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2023-03-05
    • 2014-01-04
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    相关资源
    最近更新 更多