Защита программ .NET
При запуске защиты в Protection Studio в Linux выводится проблема с SSL
Признак:
При попытке защиты программы .NET в Protection Studio в Linux в Терминал выводится сообщение: No usable version of libssl was found
Решение:
Защита программ .NET происходит на версии Core 3.1, и для ее работы необходима библиотека SSL определенной версии (libssl.so.1.1, libssl.so.1.0.2, libssl.so.1.0.0 или libssl.so.10). Эта ошибка проявляется, если необходимая версия не найдена. Установить необходимую версию библиотеки можно с помощью приведенных ниже команд, при этом необходимо правильно указать ссылку для скачивания и точную версию библиотеки. Пример:
wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.0g-2ubuntu4_amd64.deb sudo dpkg -i libssl1.1_1.1.0g-2ubuntu4_amd64.deb
Запуск программ .NET
Примеры приводятся для файла программы .NET 8.0; для .NET Framework, .NET Core и .NET Standard детали (распечатанный stacktrace) могут отличаться, но выброшенные исключения имеют точно такие же типы.
Требуется hostpolicy
Признак:
При попытке запуске программы Project в консоли (для Windows) либо терминале (для Linux) выводится текст наподобие:
A fatal error was encountered. The library 'libhostpolicy.so' required to execute the application was not found in '/home/user/Documents/Project/'. Failed to run as a self-contained app. If this should be a framework-dependent app, add the /home/user/Documents/Project/Project.runtimeconfig.json file specifying the appropriate framework.
Решение:
Необходимо скопировать файл Project.runtimeconfig.json в папку с защищенной программой (в примере - в папку /home/user/Documents/Project/).
Исключение TypeInitializationException
Признак:
При попытке запуска программы Project в терминале (для Linux) выводится текст наподобие:
Unhandled exception. System.TypeInitializationException: The type initializer for '<Module>' threw an exception. ---> System.DllNotFoundException: Unable to load shared library 'protectstorage64' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: libprotectstorage64: cannot open shared object file: No such file or directory at Templates.CommonTemplate.Į(IntPtr Ǩ, IntPtr Ǩ) at Templates.CommonTemplate.į(IntPtr Ǩ, IntPtr Ǩ) at Templates.CommonTemplate.ĭ(Int32 Ǩ, Int32 Ǩ) at .cctor() --- End of inner exception stack trace --- Aborted (core dumped)
Решение:
Необходимо убедиться, что файл библиотеки защиты libprotectstorage64.so является видимым для защищенной программы. Этот файл находится в корне проекта защиты (в папке, задаваемой в Protection Studio на вкладке Настройки как Выходная папка), как правило в этой же папке находится запускаемая защищенная программа. С помощью задания переменной среды LD_LIBRARY_PATH можно задать необходимый абсолютный либо относительный путь. Например, если файл библиотеки защиты находится на уровень выше относительно текущей папки, то команды запуска будут выглядеть как:
LD_LIBRARY_PATH=.. ./ProjectилиLD_LIBRARY_PATH=.. dotnet Project.dll.
Кроме того, стоит проверить права доступа пользователя (флаги чтения и запуска, имя и группа владельца файла).
Эта ошибка проявляется только в ОС Linux.
Исключение TargetInvocationException
Признак:
При попытке запуска программы Project в консоли (для Windows) либо терминале (для Linux) выводится текст наподобие:
Unhandled exception. System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Exception at VM.VirtualMachine.Inject(String methodID) at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) --- End of inner exception stack trace --- at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) at System.Reflection.MethodBaseInvoker.InvokeWithOneArg(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at ĭ.ĭ(String[] ਈ) Aborted (core dumped)
Решение:
Эта ошибка характерна при защите файла программы с отключенной настройкой Проверка при запуске и с включенной настройкой Проброс исключений.
Необходимо реализовать правильную обработку исключений, выброшенных автоматической защитой. Как это сделать, см. здесь в разделе Обработка исключений.