我有一个二进制文件,我想对其进行混淆处理并分发给用户。让我们假设我使用我的二进制文件的未混淆版本使用现成的 .NET 二进制格式化程序来序列化数据。然后我们可以用混淆的二进制文件反序列化数据吗?
我想分发混淆的二进制文件和序列化的数据。如果上述问题的答案是肯定的,我可以在用户之间共享序列化数据。否则,我将不得不向每个用户提供单独的序列化数据。
我有一个二进制文件,我想对其进行混淆处理并分发给用户。让我们假设我使用我的二进制文件的未混淆版本使用现成的 .NET 二进制格式化程序来序列化数据。然后我们可以用混淆的二进制文件反序列化数据吗?
我想分发混淆的二进制文件和序列化的数据。如果上述问题的答案是肯定的,我可以在用户之间共享序列化数据。否则,我将不得不向每个用户提供单独的序列化数据。
混淆的二进制数据和序列化数据之间似乎存在混淆。如果您使用默认序列化程序序列化您的类,那么类名称和属性/字段值将用作该序列化数据中的字符串 - 因此,如果您混淆您的二进制文件,那么使用该二进制文件的序列化数据将具有混淆名称和您的非如果您执行以下任何操作,则混淆二进制文件将无法读取由您的混淆二进制文件创建的序列化数据:
以下是一些解决此问题的选项:
我已经有一段时间没有使用它了,(所以您需要验证它在您的情况下是否有效)但是如果您使用的是二进制格式化程序,那么您可以通过提供处理数据的构造函数来控制数据在序列化文件中的存储方式SerializationInfo 和 StreamingContext。如果您在 Google 上搜索示例,您应该会找到一个(这是我找到的一个:Serialize Objects to File)。你可能找不到很多关于使用这种方法的新文章,因为大多数人并不觉得它很有趣,但它确实是指定你的类如何保存自己并使用二进制格式化程序重新填充自己的最简单方法。
在您必须实现的构造函数中,您使用字符串作为键/值对来进行序列化 - 在混淆中,这些字符串可能会被加密(这没关系),并且属性设置语句将被重命名并与您的混淆类保持同步/member 名称 - 所以它应该适用于混淆和非混淆程序集。
从混淆中排除您正在序列化的类并仅加密数据文件的另一种选择。
误读了问题。当二进制文件被混淆时,当类名/命名空间发生更改等时需要小心。这不仅会在混淆/非混淆二进制文件之间中断,而且通常会在不同版本之间中断。
该产品显然不包括标记为:http ://www.ssware.com/cryptoobfuscator/obfuscator-net.htm 的类(这不是建议,我从未使用过 - 您必须对其进行测试,看看是否成本是值得的)。
除此之外,您可以根据要序列化的数据量编写自定义序列化程序。
[原答案]
为什么要混淆数据?我只能想象这是为了阻止某人编辑它或阻止某人阅读内容。
如果是为了防止有人对其进行编辑,那么我建议您包含数据的哈希值,然后不要费心混淆它。
如果是为了防止有人阅读它,那么我建议您在数据被序列化后加密数据。
两者都有很多例子,但如果你想要一个例子,请告诉我。
您是否尝试过使用EazFuscator?它允许一些自定义重命名方案,以允许您在某些情况下保留确切的名称,例如,外部方法。不过,它不是最新版本的 .NET 4.0+ 或 WCF。
你也可以使用.NET Reactor,这是另一种混淆器服务,其功能远远超出 EazFuscator 和 Dotfuscator,但它确实有成本。
.NET Reactor 还允许代码加密,而不是混淆,如前所述,这将解决问题。