我正在尝试让 {smartassemble} .NET 混淆器与我的系统一起使用。我目前将用户数据存储在一系列序列化字典类中,然后反序列化这些类以取回数据。我已经忽略了程序集版本信息,只是因为那样会让生活变得痛苦。该代码是 改编自MSDN:

//to avoid cross-versioning problems
public sealed class CrossVersionDeserializationBinder : SerializationBinder {
    public override Type BindToType(string assemblyName, string typeName) {
        Type typeToDeserialize = null;

        typeToDeserialize = Type.GetType(String.Format("{0}, {1}",
            typeName, assemblyName));

        return typeToDeserialize;
    }
}

问题是,现在我的混淆应用程序将忽略版本控制信息,但无法读取非混淆应用程序保存的数据,反之亦然。我们需要一个非混淆版本来调试应用程序,所以这对我们来说是一个相当大的阻碍。有什么办法可以解决这个问题吗?我不应该混淆数据类吗?这似乎是一个相当大的安全漏洞。

有帮助吗?

解决方案

也许考虑一个与类型和字段名称无关的序列化器?例如, protobuf网络 是一个二进制序列化器,但对每个成员使用数字标签集(通过属性)。这意味着:

  • 序列化根本不依赖于程序集版本
  • 字段名称信息不在序列化文件中
  • (根据上述)代码是否被混淆并不重要
  • (并且)该文件不能用于简单地打破混淆(尽管数据可能仍然表明意图,除非加密)

例如:

[ProtoContract]
public class Foo {
    [ProtoMember(1)]
    public string Bar {get;set;}
}

在这里, 1 是文件中识别该成员的全部信息。这里的关键是它是基于契约的,因此可以稍后使用不相关的类型进行反序列化:

[ProtoContract]
public class a12 {
    [ProtoMember(1)]
    public string a {get;set;}
}

(这很好,因为混淆保留了元数据,IIRC)。

将此与其他基于合约的序列化器(例如 XmlSerializer 或者 DataContractSerializer) - 您将被迫将成员名称放入属性中,这几乎会使混淆变得毫无意义:

[DataContract]
public class a12 {
    [DataMember(Name="Bar")]
    public string a {get;set;}
}

其他提示

首先,混淆并不能提供安全性。所以,你可能要考虑放弃它,就这样。

我看到的两个选项是:

  1. 不要混淆这些类型。这将使事情顺利进行。
  2. 编写您自己的序列化器代码。

由于混淆不会带来任何好处,所以我会选择#1。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top