.NET中的序列化和混淆

10

我有一个二进制文件需要混淆并分发给用户。假设我使用未经混淆的二进制文件来使用现成的.NET二进制格式化程序序列化数据,那么我们能否使用混淆后的二进制文件对数据进行反序列化?

我想分发混淆后的二进制文件和序列化数据。如果上述问题的答案是肯定的,我可以将序列化数据分享给所有用户。否则,我将不得不为每个用户提供单独的序列化数据。

3个回答

11

似乎存在混淆二进制文件和序列化数据的混淆。如果您使用默认的序列化程序对类进行序列化,则该序列化数据中将使用类名和属性/字段值作为字符串。因此,如果您混淆了二进制文件,则使用该二进制文件的序列化数据将具有混淆的名称。如果您执行以下任何操作,则非混淆的二进制文件将无法读取由混淆的二进制文件创建的序列化数据:

  1. 对序列化类使用类重命名
  2. 对序列化类使用成员重命名

以下是一些解决此问题的选项:

  1. 我已经有一段时间没有使用这个方法了(所以您需要验证它是否适用于您的情况),但是如果您使用二进制格式化程序,则可以通过提供处理SerializationInfo和StreamingContext的构造函数来控制数据在序列化文件中的存储方式。如果您搜索示例,您应该会找到一个(这是我找到的一个:将对象序列化到文件)。您可能不会找到很多关于使用此方法的新文章,因为大多数人不认为它非常有趣,但它确实是指定如何使用二进制格式化程序保存和重新填充类的最简单方法。

    在您必须实现的构造函数中,您可以使用字符串作为键/值对进行序列化。在混淆中,这些字符串可能会被加密(这是可以的),并且属性设置语句将被重命名并与您的混淆类/成员名称保持同步-因此它应该适用于混淆和非混淆的程序集。

  2. 另一种选择是排除要序列化的类不参与混淆,并仅加密数据文件。


这里实际使用的技术被称为序列化代理,如果有人在搜索序列化代理,可能需要在某个地方添加这一信息。 - Brian Deragon
答案中的链接已失效 - “无法访问此网站”。 - Pang

3
误读了问题。当二进制文件被混淆时,如果类名/命名空间发生更改等,需要小心。这不仅会在混淆/未混淆的二进制文件之间产生问题,而且通常还会在不同版本之间产生问题。
据说此产品排除了标记为:http://www.ssware.com/cryptoobfuscator/obfuscator-net.htm 的类(这并不是推荐,我从未使用过-您将不得不测试一下并看看其是否值得)。
除此之外,根据您序列化的数据量,您可以编写自定义序列化器。
[原始回答]
你为什么要混淆数据?我只能想象这是为了防止有人编辑它或防止有人阅读内容。
如果是为了防止别人编辑,那么我建议您包含数据的哈希值,然后不要对其进行混淆。
如果是为了防止别人阅读,则建议您在序列化后加密数据。
这两者都有很多例子,如果您需要示例,请告诉我。

这个问题不是关于混淆的数据,而是关于混淆的二进制文件。你能用它序列化数据并在同一程序的未混淆版本中反序列化吗? - tanascius

2
您尝试过使用EazFuscator吗?它允许您使用一些自定义重命名方案,以便在某些情况下保留确切的名称,例如外部方法。但它不支持最新版本的.NET 4.0+或WCF。
您还可以使用.NET Reactor,这是另一个混淆服务,其功能远远超出EazFuscator和Dotfuscator,但需要付费。
.NET Reactor还允许代码加密,而不是混淆,如先前建议的那样,这将解决问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接