【问题标题】:Encrypting executable causes exception in BinaryAssemblyInfo.GetAssembly加密可执行文件导致 BinaryAssemblyInfo.GetAssembly 异常
【发布时间】:2015-07-16 08:31:34
【问题描述】:

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

  1. 在代码内部调用读取/写入加密狗内存(例如存储功能数据),使用加密狗中的算法加密/解密数据。加密密钥只能写。
  2. 加密 EXE 文件并使用加载程序通过加密狗对其进行解密。如果任何调试器(如 softice)正在运行,软件要么终止,要么不启动。

购买许可证会比破解我的软件更便宜,而且这是我唯一的目标。

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

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)

由于数据的性质,我必须使用二进制序列化。

如何解决这个问题?

【问题讨论】:

  • 这是您的加密狗/加密提供商的问题,我们无法为您提供帮助 - 尤其是在您没有告诉我们您使用的系统的情况下。
  • 另请注意,由于 JIT 编译,大多数“黑盒”EXE 加密系统(您只需传入完成的 EXE,而不是使用 API 的那些)本质上与 .NET 程序不兼容.
  • 我认为这不是加密狗提供商的问题。如果 EXE 被加密和压缩并且加载程序在内存中“扩展”它,则磁盘上可能不存在程序集,这可能是 System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssembly() 抛出的原因例外。无论如何,这只是我的一个假设......我认为应该可以绕过这个,但我不知道如何!当然,我不是第一个使用这个加密狗来保护软件并需要序列化的人......

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


【解决方案1】:

我在这个问题上投入了大量时间,我找到了一个解决方法,而不是真正的解决方案。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    相关资源
    最近更新 更多