2015-05-06 3 views
2

Я использую ключ для защиты своего исполняемого файла. Ключ защищает программное обеспечение двух способов:Шифрование исполняемого объекта вызывает исключение в BinaryAssemblyInfo.GetAssembly

  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) 

я должен использовать бинарную сериализацию в связи с характером данных, быть стойкими.

Как решить эту проблему?

+0

Это проблема с вашим поставщиком ключа/шифрования, и мы не можем помочь вам с - не в последнюю очередь, если вы не сообщите нам, какую систему вы используете. – Dai

+1

Также обратите внимание, что большинство систем шифрования EXE с «черным ящиком» (где вы просто передаете готовый EXE, а не те, которые используют API) по своей сути несовместимы с программами .NET благодаря компиляции JIT. – Dai

+0

Я не думаю, что это проблема с поставщиком ключей. Если EXE зашифрован и сжат, а загрузчик «расширяет» его в памяти, вероятно, сборка не существует на диске, и, вероятно, это причина, по которой System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssembly() throw исключение. Во всяком случае, это всего лишь моя гипотеза ... Я думаю, что это должно быть возможно обойти это, но я не знаю, как! Конечно, я не первый, кто использует этот ключ для защиты программного обеспечения и необходимости сериализации ... –

ответ

0

Я посвящаю огромное количество времени на эту проблему, и у меня есть обходное решение, более чем истинное решение.

Я разделяю то, что узнал. Сериализации необходимо загрузить сборку, которая сгенерировала постоянный поток, чтобы точно знать структуру сохраненных данных. При использовании систем шифрования EXE с «черным ящиком» сборка недоступна. Одним из возможных решений может быть создание пользовательского BynaryFormatter: наверняка это не стоит усилий.

Обходной путь состоит в том, чтобы поместить классы в сериализацию в DLL, которая не зашифрована и затем дешифрована в памяти во время выполнения с помощью ключа. Эта идея вытекает из предложений, которые я нашел для аналогичной проблемы: нужно десериализовать в приложении. Данные, записанные из приложения B.

 Смежные вопросы

  • Нет связанных вопросов^_^