.net - 如何在混淆和调试版本之间保持反序列化兼容性?

标签 .net obfuscation serialization smartassembly

我正在尝试使{smartassembly} .NET模糊处理程序可以与我的系统一起使用。我目前将用户数据存储在一系列序列化的字典类中,然后反序列化这些类以取回数据。我已经忽略了程序集版本信息,仅因为那样会使生活变得痛苦。该代码是adapted from 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-net是一个二进制序列化程序,但是对每个成员使用数字标签集(通过属性)。这表示:

  • 序列化与
  • 的程序集版本完全无关
  • 字段名称信息不在序列化文件
  • (通过上面的代码)不管代码是否被混淆
  • (和)不能使用该文件来轻松消除混淆(尽管除非加密,否则数据仍可能表明意图)

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

    在这里,1是标识文件中成员的全部。这里的关键是它是基于契约(Contract)的,因此以后可以使用不相关的类型进行反序列化:
    [ProtoContract]
    public class a12 {
        [ProtoMember(1)]
        public string a {get;set;}
    }
    

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

    将此与其他基于合约的序列化器(例如XmlSerializerDataContractSerializer)进行对比-您将不得不在其中将成员名称放入属性中,这几乎会使混淆变得毫无意义:
    [DataContract]
    public class a12 {
        [DataMember(Name="Bar")]
        public string a {get;set;}
    }
    

    关于.net - 如何在混淆和调试版本之间保持反序列化兼容性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/514332/

    相关文章:

    c# - 如何从 C# 更新文件的更改时间?

    asp.net - 哪个更好 : to sort results at the database level or at the application level

    java - 启用 Proguard 后应用程序崩溃

    java - 将序列化对象作为流读取

    c# - 如何使用 .NET Framework 获取所有事件的 TCP 连接(无非托管 PE 导入!)?

    c# - linq2sql 如何跟踪数据库对象?

    android - 如何使用模糊代码创建适用于 Android 的 Cordova 插件?

    java - 如何为 JBCO(Java ByteCode Obfuscator)指定入口点类和 jar 存档?

    c# - 在 JsonConverter 中递归调用 JsonSerializer

    c# - 序列化已知的小结构数组的好方法