Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Одной из наиболее перспективных технологий автоматической защиты исполняемых Native-файлов является обработка инструкций, извлеченных из тела приложения (RIP CODE). При помощи мини-виртуальной машины некоторые наборы инструкций в защищаемом приложении преобразуются определенным образом. Это позволяет защитить функции приложения от изучения и анализа, а также значительно затрудняет создание автоматических инструментов снятия автозащиты.
Однако при использовании RIP CODE следует учитывать, что работа защищенного приложения может замедляться, вследствие того, что инструкции виртуализируются. Чтобы подобрать оптимальные функции для защиты применяется технология профилирования. С помощью специальных инструментов приложение анализируется (как статически, при помощи дизассемблера, так и динамически, в процессе исполнения), после чего создается конфигурационный файл, содержащий информацию о функциях, подлежащих защите.

Рассмотрим процесс защиты и профилирования тестового приложения, созданного в Visual Studio 2010 по шаблону MFC Application.

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

В мастере лицензирования предусмотрены различные методы выбора защищаемых функций (т. е. тех функций, с которыми будет работать RIP CODE):


Anchor
_Toc260922497
_Toc260922497
Anchor
_Toc277872881
_Toc277872881
1. Не защищать функции
При выборе этой опции происходит отключение технологии RIP CODE. Соответственно, этот вариант следует выбирать лишь тогда, когда RIP CODE вызывает проблемы с работой защищенного приложения.
Anchor
_Toc260922498
_Toc260922498
Anchor
_Toc277872882
_Toc277872882
2. Автоматически
Данный вариант предлагается по умолчанию. В этом случае RIP CODE будет выбирать функции для защиты случайным образом, но в целях оптимизации производительности исключит все функции с циклами и рекурсиями.
Этот вариант рекомендуется использовать в случаях, когда защищенное приложение не вызывает проблем с производительностью.
Процент функций, защищенных технологией RIP CODE, зависит от положения ползунка Уровень защиты, и показывается во всплывающей подсказке. На Пользовательском уровне защиты процент можно регулировать вручную.
Anchor
_Toc260922499
_Toc260922499
Anchor
_Toc277872883
_Toc277872883
3. Вручную
Можно выбрать функции для защиты вручную. Это рекомендуется делать, если защищенное приложение демонстрирует невысокую производительность (по сравнению с исходной), и разработчик хорошо знаком с внутренней структурой приложения, а значит, сможет указать автозащите, какие функции лучше не защищать.

При выборе данного метода запускается процесс статического анализа кода.

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

ВАЖНО!
При повторной компиляции приложения, и, соответственно, перегенерации MAP-файла, существующий файл описания защиты кода становится недействительным, и необходимо повторное проведение статического анализа и повторный выбор функций!
Если же процесс статического анализа проводится впервые (или защищаемый файл изменился), то необходимо выбрать пункт Запустить процесс статического анализа, предварительно убедившись, что в одной папке с защищаемым файлом находится соответствующий ему MAP-файл:

Когда профилирование запускается из среды мастера лицензирования, то изменение параметров в данном диалоговом окне будет недоступно. В случае, если мастер лицензирования не используется, то здесь необходимо указать непосредственно профилируемое приложение.
Аналогично, если профайлер запускается из мастера, то имя файла описания изменить нельзя – оно жестко привязано к проекту лицензии. В случае использования профайлера отдельно, здесь указывается имя выходного файла с настройками для опции RIP CODE.

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


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

По нажатию на ОК происходит переход в основное окно работы профайлера, методика работы с которым описана далее:


Anchor
_Toc260922500
_Toc260922500
Anchor
_Toc277872884
_Toc277872884
4. На основе профилирования
Выбор функций для защиты на основе профилирования – это наиболее сбалансированный вариант работы. С одной стороны, он обеспечивает высокую производительность защищенного приложения, с другой – не требует от разработчика досконального знания структуры приложения, а также особенностей работы компилятора.
При профилировании происходит фактический запуск защищаемого приложения. Разработчику предлагается некоторое время поработать с приложением, используя наиболее востребованные функции и сценарии. При этом профайлер измеряет скорость работы отдельных функций и по результатам выдает рекомендации, какие функции вызывались достаточно часто, чтобы их имело смысл защищать, но недостаточно часто, чтобы их защита вызвала проблемы с производительностью.
Аналогично статическому анализу, нужно начать процесс профилирования и выбрать профилируемое приложение (если вызов профайлера осуществляется из мастера лицензирования, то приложение задается автоматически):



Затем можно указать параметры командной строки, с которыми вызывается приложение, и задать файл для сохранения результатов работы профайлера:








По нажатию на кнопку Готово начнется статический анализ приложения (как ив варианте Вручную), и будет предложен первоначальный набор функций для защиты:

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

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

Пояснение

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

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

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

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

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

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

 

Anchor
_Toc260922501
_Toc260922501
Anchor
_Toc277872885
_Toc277872885
002 Методика работы с Native-профайлером

Главное окно профайлера предназначено для выбора функций, базовые блоки в которых будут защищаться при помощи RIP CODE:

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

ни одного базового блока подходящего для защиты не найдено

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

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

...