C# Защита памяти в Assembly.Load()

137
18 мая 2019, 20:30

Я пытаюсь сделать протектор для программ на C#. Суть его в том, что защищаемый файл переводится в байты и шифруется. Затем в другой программе, которая расшифровывает этот массив из ресурсов, я произвожу запуск сборки через Assembly.Load(DecryptModule(Properties.Resources.Protected,"Pass")). Проблема заключается в незащищённой памяти, которая используется для Assembly.Load() и я могу снять эту защиту в 1 клик обычным дампом. Как можно защитить память(Если это возможно), которая используется для Assembly.Load() ?

Answer 1

Механизма защиты отдельной управляемой сборки в .NET не существует. В Windows, однако, существуют другие механизмы защиты памяти.

  1. Начиная с Windows 10, Trusted execution позволяет создавать изолированные области памяти, так что доступ к данным в такой области может быть получен только кодом, загруженным в эту же область. Требует аппаратной поддержки со стороны процессора (например, Intel Software Guard Extensions).

  2. Для антивирусных приложений, начиная с Windows 8.1 существует механизм защищенных сервисов, который ограничивает доступ к памяти целого процесса. Любые модули, загружаемые в защищенный сервис, должны быть подписаны специальным сертификатом.

  3. Приложения для обработки звука или видео, начиная с Windows Vista, могут использовать Windows Media Foundation, который в целях защиты авторских прав также предоставляет похожий функционал (см. Protected Media Path)

  4. Когда вышеперечисленное не применимо, приложение может попытаться защитится теми же методами, которыми действует вредоносное ПО: инжекция DLL в во все процессы и перехват вызовов функций работы с памятью (ReadProcessMemory и др.). Антивирусы в старых версиях Windows действуют именно так. Однако, этот метод очень ненадежен, ведь если в системе две программы пытаются применить его одновременно, они входят в конфликт и результат непредсказуем.

В общем, если вам нужна реальная защита, как минимум нужно переходить к использованию неуправляемого кода. Также, можно всегда вынести критичный код в удаленный сервис (думаю, это единственный реальный способ защиты, когда секретным является сам код).

READ ALSO
Исключение MissingRuntimeArtifactException при использовании .NET Native

Исключение MissingRuntimeArtifactException при использовании .NET Native

У меня при компиляции сборки в Release появляется вот такая ошибка:

186
Unity. Перестал работать Time.timeScale

Unity. Перестал работать Time.timeScale

Делаю игру на мобильные устройства на движке UnityВ игре есть такой момент, когда при столкновении игрока с препятствием я ставлю Time

133
c# report форматированный экспорт

c# report форматированный экспорт

значит есть бд с 3 таблицами

161