Защита .Net, кто виноват и что делать?
Появление технологии .Net усложнило жизнь разработчиков систем защиты от пиратства. Компания «мелкомягких», стремящаяся упростить разработку программного обеспечения, затеяла благое дело. Но технология хранения метаданных, используемая в .NET-приложениях, применяется не только для упрощения процесса разработки, но и для эффективного реинжиниринга полученных .Net-приложений. С помощью различных утилит злоумышленнику легко восстановить исходные тексты приложений на языках высокого уровня. Анализируя исходный код приложения, он может не только отключить систему защиты, но использовать чужие тексты в своих интересах.
Мы применяем несколько технологий для защиты .Net-приложений. Например, для затруднения анализа исходного кода программы нами используется разнообразная обфускация. Но она не в состоянии полностью защитить код от изучения: его все равно можно декомпилировать, а затем изучить, хотя и с большим трудом. Для более качественной защиты .NET используются методы отложенной компиляции MSIL-инструкций посредством технологии Reflection.Emit, которая позволяет осуществлять компиляцию MSIL-кода в процессе выполнения. Это дает полное сокрытие исходного текста, даже во время выполнения.
Такой двухуровневый подход позволяет быстро и эффективно защитить .NET-приложения не только от изучения исходного кода программы, но и от несанкционированного распространения. Чтобы было понятнее, остановимся чуть подробнее на этих технологиях.
Обфускация, или запутываем противника
Обфускация предоставляет следующие возможности:
Символьная обфускация
Символьная обфускация — наиболее простой способ запутать злоумышленника, анализирующего код. Она позволяет переименовать имена типов, событий, свойств, методов. При этом может использовать непечатный набор символов, что очень помешает т.н. статическому анализу. Ориентироваться в таком коде все равно, что в городе, где вместо названий улиц и номеров домов случайные цифры. Данная операция необратима, и код получается очень трудночитаемый.
Результат работы символьный обфускации MSIL кода:

Будьте внимательны, если вы используете Reflection API. Типы и методы, доступ к которым происходит с его использованием, обфусцировать нельзя.
Шифрование строк
В процессе обфускации все текстовые строки в исходном тексте зашифровываются с использованием электронного ключа и помещаются в защищенный native–контейнер. Метод применяется для сокрытия важной информации, которая может заинтересовать злоумышленника или поможет ему найти нужный фрагмент кода. Используя Reflection API для вызова функций, данный механизм позволяет зашифровать имена методов и типов.
Результат работы режима шифрования строк:

Обфускация графа потока управления
Обфускация графа потока управления (только в версии Guardant SDK 6.0) предоставляет возможность разбить код методов на несколько блоков, добавить фальшивые и скрыть от анализа последовательность их исполнения. Последовательность исполнения блоков в этом случае будет зашифрована с использованием электронного ключа Guardant. При этом в реальных функциях количество блоков легко превышает 10, делая невозможным статический анализ кода.
Результат работы режима обфускации графа потока управления:

Защита кода .Net-приложения, или анализировать нечего
После того как приложение обфусцировано, его изучение уже не представляется легкой задачей, но все же возможно. Особенно если злоумышленника интересует не все приложение, а отдельные специфичные методы. Для того чтобы лишить его возможности анализировать код, в процессе защиты осуществляется перенос MSIL-кода методов защищаемого приложения в защищенный Native-контейнер.
В теле защищенных методов размещается функция-заглушка (stub()), которая инициирует процесс выполнения MSIL-кода по требованию, посредством вызова виртуальной машины (VM). Шифрование тела методов происходит с использованием электронного ключа. Код метода хранится в защищенном хранилище и расшифровывается непосредственно перед его исполнением. Во время работы приложения VM осуществляет динамическую загрузку необходимого метода и выгрузку давно не используемых методов, чтобы не допустить момента, когда все методы загружены.

Как в защите участвует электронный ключ?
Автоматическая защита .NET предназначена для защиты .NET-сборок (*.exe и *.dll) на платформах x86/x64/Any CPU. Режимы шифрования строк, обфускация графа потока управления, защита кода реализуются с использованием алгоритмов шифрования, которые вызываются из электронного ключа.
Различные модели электронных ключей Guardant помогут как реализовать режимы лицензирования по количеству запущенных копий в сети (Guardant Net), так и ограничить время работы (Guardant Time) либо приложения в целом, либо его отдельныx сборок. С помощью технологии псевдокода сам Native-контейнер и методы доступа к нему надежно защищены от статического и динамического анализа. Он реализует интерфейс для дешифрования данных c помощью электронного ключа Guardant, осуществляет проверку целостности, дешифрование и загрузки VM.
