.NET Reactor加密 vs 混淆

8

我有一个要求,需要保护我们的程序集免受反向工程的威胁,以降低知识产权盗窃或许可证黑客的风险。.NET Reactor看起来非常强大,而且我们已经拥有了它的许可证。

通读文档后,似乎除了混淆之外,还有几种机制可以防止反编译。我已经了解到混淆可能会影响序列化,而这是我们系统的重要组成部分,我希望完全避免使用。

我主要关注NecroBit,它声称加密CIL,使其“无法反编译/逆向工程”。我认为如果这是真的,混淆或其他任何设置都将毫无意义。

有没有经验丰富的.NET Reactor用户能够提供更多关于不同选项的实用解释和/或建议一个序列化系统的好排列方式?有哪些好的工具可以测试这个软件的说法?


1
我一直认为像“无法反编译/逆向工程”这样的声明只是营销手段。要被CLR加载,程序集必须至少在内存中,并且当然不能加密。我相信任何方法(包括混淆)只会使反汇编过程更加困难,但永远不会变得不可能。 - Federico Dipuma
这可能会帮助您澄清有关程序集保护的最新技术。 - Federico Dipuma
1
如果你把汇编代码发给我,我可以花费所有时间尝试逆向工程。最终它将作为可执行指令加载(否则它将无法工作),所以我只需获取内存转储即可。如果你有非常重要的算法,请将它们隐藏在 Web 服务后面,不要分发它们。 - PhillipH
1
所有这些都是为了增加工作因素,即它需要多么困难和多长时间。没有什么是100%的,Gemalto“数字安全世界领导者”和RSA都被黑客攻击了,它们都是一线加密公司。也就是说:定义您的威胁模型,即您需要隐藏的任何内容的价值、攻击者的技能以及攻击者将花费多少时间。然后选择您需要的保护级别。请记住,您的安全努力将对您的开发努力产生负面影响,并且很可能会增加错误计数。 - zaph
如果您想要真正的安全,请像普通医生(MD)转诊专家一样聘请安全专业人员。正如俗话所说:“你需要知道自己的限制”。 - zaph
3个回答

3
只要将相应的类标记为可序列化,您就可以告诉.NET Reactor排除这些类不进行混淆:

enter image description here


我在类声明上使用了 [ObfuscationAttribute(ApplyToMembers = true, Exclude = true)],但好像没有起作用。为什么只有标记为可序列化的类才能使用混淆?在.NET Reactor的文档中没有看到这样的要求,请帮忙解决一下,我的版本是5.9.8.0。 - zhaorufei
我刚看到你在 https://stackoverflow.com/questions/60855183/migration-from-dotfuscator-to-net-reactor-what-obfuscation-attributes-are-sup 上的帖子,关于辅助工具。我正在尝试使用它。谢谢! - zhaorufei
不起作用,我使用的是 .net reactor 5.9.8.0,我试图从 .Net reactor 的所有保护方法中排除整个类,因为 .net reactor 破坏了跨 AppDomain 代码, [System.Reflection.Obfuscation(Feature = "EXCLUDE:NECROBIT,OBFUSCATION,STRINGENCRYPTION,ANTITAMP,CONTROLFLOW,SNREMOVAL")] 在使用 .net reactor 后,我通过 dnspy 打开程序集,发现这个类仍然被加密/混淆。 - zhaorufei
没有必要将一个类标记为可序列化以使用混淆。我展示了一种如何轻松地从序列化中排除类/成员的方法(grinder22提到了一个序列化系统)。 混淆排除选项仅防止对相应的类/成员进行重命名,但其他保护功能仍然适用。 - Eziriz
为了排除除混淆之外的保护功能,您需要设置一种特殊的程序集属性以启用声明式保护: [assembly: System.Reflection.Obfuscation(Feature = "DECLARATIVEPROTECTION")]它在最新的.NET Reactor版本上可以很好地工作,并且在5.9.8.0上也应该可以正常工作。 - Eziriz

2
希望这对使用.NET Reactor或类似工具的其他人有所帮助。我知道任何工具都有其限制。目标是尽可能减少许可证黑客风险,同时尽量少花力气。我们公司以前曾经受到过损失,老板想要这样做。
我们的项目特别是一个使用Prism的WPF桌面应用程序。当我试图将我的程序集合并为单个fat exe时,发现一些接口注册无法在Unity容器中解析。我们决定保护每个dll而不是与此作斗争。一旦我这样做了,这个工具就很好用了。我字面上检查了桌面的每个保护选项。
我们的服务在自托管的OWIN进程中运行SignalR hubs。在这种情况下,本机EXE文件选项将无法工作。当我们运行服务时,会出现Bad Image Format异常。除此之外,所有选项都已检查。
除此之外,我遇到了一些零散的问题,其中我们使用Type.GetMethod(string)的反射形式。我不得不使用ObfuscationAttribute排除一些方法和类。
我预计会遇到JSON序列化问题,但没有遇到任何问题。一切都正常工作 :)

1

我已经使用Netreactor很多年了。我使用iserialization接口和序列化绑定器来绕过混淆等问题。它可以通过Netreactor的每种保护方法。

        Stream s = null;

        BinaryFormatter b = new BinaryFormatter();
        Binder CB = new Binder();
        b.Binder = CB;

        try
        {
            s = File.Open(fileName, FileMode.OpenOrCreate);
            //to serialize
            b.Serialize(s, yourObject);
            // to deserialize
            yourObject = (YourClass)b.Deserialize(s);
        }
        catch
        {

        }


        finally
        {
            s.Close();
        }

    [Serializable]
    public class YourClass : System.Runtime.Serialization.ISerializable
    {
       //Explicit serialization function
       public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
       {

          info.AddValue("stringVar", stringVar); 
          // and so forth...
       }

       // Deserialization
       public YourClass(SerializationInfo info, StreamingContext ctxt)
       {
          stringvar = (string)info.GetValue("stringVar", typeof(string));
          // and so forth
       }
    }
    // the serialization binder
    public class Binder : SerializationBinder
    {

       public override Type BindToType(string assemblyName, string typeName)
       {
            return System.Type.GetType(typeName); // Get it from this 
            //assembly

       }
   }

我无法从你的介绍中确定 - 你是在说这是一种方法,可以在 .Net Reactor 的情况下获取源代码,还是说这是一种使你的代码与之正确序列化的方法? - Bobson

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