加密可执行文件会导致BinaryAssemblyInfo.GetAssembly

时间:2015-05-06 09:29:32

标签: c# encryption dongle source-code-protection

我使用加密狗来保护我的可执行文件。加密狗以两种方式保护软件:

  1. 在代码内部,调用读/写加密狗内存(例如存储功能数据),使用驻留在加密狗中的算法加密/解密数据。加密密钥只能写入。
  2. 加密EXE文件并使用通过加密狗解密它的加载程序。如果正在运行softice之类的调试器,则软件将终止或不启动。
  3. 它可以很好地运行并且购买许可证比破解我的软件更便宜,这是我唯一的目标。

    问题是我不能再序列化了!如果我尝试,我会得到以下例外:

    SerializationException
    Source = mscorlib
    Message = Unable to find assembly 'MyApp, Version=1.0.0.3, Culture=neutral, PublicKeyToken=null'.
    TargetSite = System.Reflection.Assembly GetAssembly()
    Stack =
        System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssembly()
        System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType(BinaryAssemblyInfo assemblyInfo, String name)
        System.Runtime.Serialization.Formatters.Binary.ObjectMap..ctor(String objectName, String[] memberNames, BinaryTypeEnum[] binaryTypeEnumA, Object[] typeInformationA, Int32[] memberAssemIds, ObjectReader objectReader, Int32 objectId, BinaryAssemblyInfo assemblyInfo, SizedArray assemIdToAssemblyTable)
        System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryObjectWithMapTyped record)
        System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryHeaderEnum binaryHeaderEnum)
        System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
        System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
        System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
    

    我必须使用二进制序列化,因为数据的性质是持久的。

    如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我花费了大量时间来解决这个问题,我得到了一个解决方法,而不仅仅是一个真正的解决方案。

我分享我学到的东西。序列化需要加载生成永久流的程序集,以便准确了解已保存数据的结构。使用“黑盒”EXE加密系统,组件不可用。一种可能的解决方案可能是编写一个自定义的BynaryFormatter:确定它不值得付出努力。

解决方法是将类序列化为未加密的DLL,然后在加密狗运行时在内存中解密。这个想法源自我为类似问题找到的建议:一个想要在应用程序中反序列化从应用程序B写入的数据。