.NET Reactor加密与混淆

时间:2017-06-14 20:09:28

标签: c# serialization obfuscation net-reactor

我要求保护我们的组件免受逆向工程,以减少IP盗窃或许可黑客攻击的风险。 .NET Reactor看起来很强大,我们已经拥有它的许可证。

通过文档阅读,除了混淆之外,似乎有几种机制可以防止反编译。我已经读过,混淆可能会导致序列化,这是我们系统的一个重要部分,我希望完全避免它。

我主要对NecroBit感兴趣,后者声称加密CIL,使其“无法进行反编译/反向工程”。在我看来,如果这是真的,混淆或任何其他设置将毫无意义。

任何有经验的.NET Reactor用户是否可以对各种选项进行更实际的解释和/或建议对序列化系统进行良好的排列?有哪些好的工具可以测试这个软件的声明?

3 个答案:

答案 0 :(得分:1)

希望这有助于其他人使用.NET Reactor或类似工具。我知道任何工具的局限性。目标是尽可能以最小的努力降低许可黑客的风险。我的公司之前已被烧毁,老板想要它。

我们的项目特别是使用Prism的WPF桌面。我发现当我尝试将我的程序集合并到一个胖程序时,我的一些界面注册无法在Unity容器中解析。我们认为可以单独保护每个dll而不是用它来对抗。一旦我这样做,这个工具很好地工作。我确实检查了桌面的每个保护选项。

我们的服务在自托管的OWIN流程中运行SignalR集线器。在这种情况下,Native EXE File选项不起作用。我们运行服务时遇到了Bad Image Format异常。否则检查所有选项。

除此之外,我遇到了一些棘手的问题,我们使用Type.GetMethod(字符串)形式的反射。我不得不用ObfuscationAttribute排除一些方法和类。

我期待JSON序列化的问题,但没有得到任何问题。一切正常:)

答案 1 :(得分:1)

只要相应的类被标记为可序列化,您就可以告诉.NET Reactor从混淆中排除此类:

enter image description here

答案 2 :(得分:0)

我多年来一直在使用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

       }
   }