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