You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

Основным механизмом защиты .NET-приложений является шифрование тел защищаемых функций и их динамическое расшифрование во время работы приложения. При совместном использовании символьного обфускатора и шифратора строковых констант на электронном ключе защита становится беспрецедентно стойкой.
Однако в ряде случаев за это приходится платить снижением скорости работы:

  • Если функция зашифрована, то при ее вызове на расшифрование тратится определенное время
  • Даже если функция уже расшифрована, она, тем не менее, вызывается с использованием защитных механизмов, что может вносить задержку в ее выполнении на доли секунды


В среднестатистическом случае увеличение времени запуска приложения и понижение производительности его работы на несколько процентов не вызывает особых проблем. Однако если функция в процессе работы приложения вызывается сотни и тысячи раз, то накладные расходы по работе защитных механизмов именно этой функции могут серьезно снижать производительность приложения. В таком случае, необходима технология выбора функций для защиты. Именно для этого существует .NET-профайлер.

  • * *
    Рассмотрим процесс защиты тестового приложения Paint.NET.

    001 Методы выбора функций для защиты

    Для любого защищаемого приложения существует четыре варианта выбора функций для защиты:

    1. Не защищать функции

    Это самый кардинальный вариант, при котором не используется шифратор кода (модуль CodeProtect.exe), и функции не шифруются и не защищаются. Использовать его следует только при непреодолимых проблемах с производительностью защищенного приложения, а также в экзотических случаях, когда необходима лишь символьная обфускация с шифрованием строк.

    2. Автоматически

    Функции для шифрования будут выбираться случайным образом. Если необходимо произвести защиту быстро, и производительность защищенного приложения не вызывает нареканий, то использование автоматического выбора оправданно.
    В этом случае будет защищен некоторый процент от общего числа функций, зависящий от положения ползунка Уровень защиты. В случае с Пользовательским уровнем процент защиты может быть установлен самостоятельно разработчиком.

    3. Вручную

    Если разработчик хорошо знаком со структурой защищаемого приложения, то он может самостоятельно задать функции для защиты.
    При использовании данного варианта предоставляются две возможности:
  • Формирование файла включений (списка методов, которые защищаются)
  • Формирование файла исключений (списка методов, которые не защищаются)


В зависимости от технологий .NET, использованных в приложении, а также от его специфики и структуры, может понадобиться сформировать как один из конфигурационных файлов, указанных выше, так и оба:

В любом случае, запускается утилита формирования конфигурационных файлов:

Во всех случаях работа с утилитой происходит одинаково:

  • Галочками отмечаются методы, подлежащие защите (или исключению из нее)
  • Для упрощения стоит отключить отображение т. н. accessor-методов, которые редко защищаются
  • В любой момент можно сохранить результат работы и выйти из приложения
  • При необходимости можно редактировать ранее созданный файл включений/ исключений

Получившийся конфигурационный файл автоматически передается мастеру лицензирования и используется для защиты.
Файлы включений и исключений применяются независимо друг от друга. При этом, если метод указан в обоих файлах, то исключение имеет приоритет.

4. На основе профилирования

Если производительность работы защищенного приложения вызывает нарекания, можно поработать с ним с использованием профайлера и автоматически измерить время работы отдельных функций, частоту и интенсивность их вызова, и на основании полученных данных сформировать файл включений для защиты.
При выборе варианта На основе профилирования запускается профайлер .NET:

Здесь можно запустить процесс профилирования, или открыть для редактирования ранее созданный файл включений.
На следующем экране профайлера выбрать сборки для профилирования:


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

По нажатию на кнопку Готово происходит анализ всех выбранных сборок приложения и вывод основного окна профайлера:


По нажатию на кнопку Начать сессию профилирования выбранное приложение запускается и начинается процесс измерения времени работы и частоты вызова функций.
В ходе работы в главном окне профайлера отображаются данные о профилируемом приложении и связанным сборкам. Главный параметр здесь – процент уже вызванных функций. Чем ближе это число к 100%, тем больше кода прошло профилирование:

В любой момент процесс профилирования можно остановить, или получить «снимок» – информацию о функциях, которые уже проанализированы и выбраны для использования в автоматической защите.

По завершении процесса в главном окне профайлера выводится подробная информация о приложении:

 

 

Условные обозначения

Пояснение

 

Оранжевый цвет шрифта

Функция ни разу не вызывалась профайлером

 

Зеленый цвет с галочкой

Функция вызывалась и выбрана для защиты

 

Зеленый цвет без галочки

Функция вызывалась, но не выбрана для защиты

 



Принципы выбора функций

После профилирования приложения можно:

  • Изменить критерии автоматического выбора функций для защиты
  • Вручную изменить параметры защиты каждой функции по отдельности

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

Автоматический выбор функций

При нажатии на кнопку Процент защищаемых функций появляется следующее диалоговое окно:

Здесь необходимы небольшие пояснения.
В процессе работы защищенного приложения вызов функции может быть первый или обычный.
При первом вызове функции происходит обращение к электронному ключу и расшифрование тела функции, для его последующего исполнения средой .NET. При обычном вызове уже расшифрованной функции обращения к ключу не происходит, но есть небольшой расход времени на работу защитных механизмов.
В связи с этим, существуют две типичные проблемы с производительностью защищенного приложения:

  • Обычный вызов происходит слишком часть (десятки тысяч раз в секунду)
  • Последовательно происходит много первых запусков функции, что особеннохарактерно при старте приложения

Именно эти критерии и регулируются при автоматическом выборе функций для защиты (см. скриншот выше).
Накладные расходы на вызов функции фиксированы и посчитаны с точностью до микросекунд, поэтому рекомендованные профайлером значения отлично подходят для большинства ситуаций.

Ручной выбор функций

Здесь все довольно просто. Если работа какой то конкретной функции вызывает проблемы после применения автозащиты, ее легко найти и снять отметку:

Например, на скриншоте выше показаны результаты поиска по слову rotate. Если после автозащиты с параметрами по умолчанию было замечено, что в Paint.NET функция Повернуть изображение на 90 градусов стала работать гораздо медленнее, то легко найти ее и снять отметку Защищать.

  • No labels