В данной статье мы рассмотрим теорию и практику работы с программой VMProtect на примере простейшей программы на Delphi. Что такое протекторы
Протекторами называются программы, предназначенные для защиты программ от взлома. В настоящее время на рынке представлено множество протекторов, но практически у всех есть один существенный недостаток - они не модифицируют исходный код (защита программ представляет собой обычную упаковку всего файла, при этом "защищается" сам распаковщик, который в итоге распаковывает файл). После окончания работы распаковщика программу можно просто "сдампить" и в итоге без особых трудностей получить исходный (неупакованный) файл. Хакерами разработано множество инструментов по автоматическому снятию самых популярных протекторов. Практически по всем протекторам написано немало статей по их снятию, поэтому перед приобретением коммерческого протектора не поленитесь почитать, что про него пишут представители ангеграунда в своих статьях. Немного теории
VMProtect представляет собой совершенно новый инструмент по защите программного обеспечения. В отличие от большинства существующих протекторов VMProtect модифицирует исходный код программы. В процессе работы VMProtect-а участки кода защищаемого файла переводятся в программу (далее байткод), выполняемую на виртуальной машине (далее ВМ). ВМ также можно назвать виртуальным процессором с системой команд очень сильно отличающейся от той, которая представлена в процессорах Intel 8086. Например: в ВМ нет команд, отвечающих за сравнение двух операндов, нет условных и безусловных переходов и т.д. Как Вы уже поняли, хакерам придётся разрабатывать совершенно специфические инструменты для анализа и декомпиляции байткода, что займёт очень много времени. К сожалению можно констатировать, что неломаемых защит не бывает, поэтому нужно добиться такого уровня защиты, что бы затраты на её взлом были сопоставимы (или даже превосходили !!!) затраты на легальную покупку защищённой программы. В любом случае не нужно забывать, что VMProtect является только инструментом, помогающим "скрыть" основные механизмы защиты программы.
Подготовка защищаемой программы
Для начала создадим в Delphi простейший проект, состоящий из формы (Form1), элемента ввода текста (Edit1) и кнопки (Button1): рис 1. После нажатия пользователем на кнопку Button1 будет проверяться правильность ввода пароля и выдаваться соответствующее сообщение (правильно или неправильно введён пароль): procedure TForm1.Button1Click(Sender: TObject); begin if StrToIntDef(Edit1.Text, 0) mod 17=13 then MessageDlg('Пароль правильный', mtInformation, [mbOK], 0) else MessageDlg('Пароль неправильный', mtError, [mbOK], 0); end; |
Алгоритм правильности ввода пароля очень прост - пароль переводится в число, далее это число делится на 17 и если остаток от деления=13, то пароль правильный, иначе пароль неправильный. Перед компиляцией нашего проекта зайдём в опции проекта и включим генерацию MAP файла: рис 2.
MAP файл нужен для того, чтобы в дальнейшем VMProtect по имени процедуры определил её адрес. Далее делаем "Build Project1" и получаем откомпилированный тестовый проект и MAP файл. Использование маркеров Маркеры имеет смысл использовать в тех случаях, когда необходимо защитить только часть (или несколько частей) процедуры. Для маркировки участков необходимо использовать вставки на ассемблере: - Маркер начала защищаемого блока: asm db $EB,$10,'VMProtect begin',0 end; |
- Маркер конца защищаемого блока: asm db $EB,$0E,'VMProtect end',0 end; |
При дальнейшей работе с VMProtect маркеры будут иметь собственные уникальные имена в виде: "VMProtectMarker"+номер маркера попорядку. Водяные знаки VMProtect предоставляет уникальную возможность добавления в защищаемый файл скрытой информации о владельце файла. Водяной знак представляет собой массив байт, который должен быть уникален для каждого вашего пользователя. После включения водяных знаков в защищаемый файл в дальнейшем (например в случае распространения взломанной программы) вы всегда сможете определить его владельца и принять соответствующие меры. Работа с VMProtect Загружаем наш проект через пункт меню "Файл"-"Открыть". Добавляем в наш проект процедуру, отвечающую за проверку правильности ввода пароля:
рис 3.
VMProtect может по-разному обрабатывать защищаемый код в зависимости от выбранного типа компиляции. Рассмотрим подробнее что из себя представляет каждый тип компиляции: - Мутация. Исполняемый код видоизменяется на уровне команд процессора (существующие команды видоизменяются, добавляются различные мусорные команды и т.д.). Данный тип компиляции слабо защищает обрабатываемый код от взлома и анализа и главным образом припятствует определению обрабатываемых функций с помощью сигнатурных анализаторов (PEiD+KANAL, IDA+FLIRT и т.д.). Как правило библиотечные функции не нуждаются в защите от взлома и анализа и достаточно будет только изменить их сигнатуры, чтобы взломщик не смог автоматически определить какие именно библиотеки Вы используете в своем приложении (степень защиты от взлома и анализа - низкая, скорость исполнения кода - высокая).
- Виртуализация. Исполняемый код переводится в байткод, исполняемый на виртуальной машине. Данный тип компиляции следует применять для всех критичных участков кода где помимо противодействию взлому и анализу важна скорость работы (степень защиты от взлома и анализа - средняя, скорость исполнения кода - средняя).
- Ультра (мутация + виртуализация). Исполняемый код видоизменяется на уровне команд процессора и уже после этого переводится в байткод, исполняемый на виртуальной машине. Данный тип компиляции следует применять для всех участков кода где не важна скорость работы (степень защиты от взлома и анализа - высокая, скорость исполнения кода - низкая).
После добавления в наш проект всех необходимых процедур переходим на закладку "Опции":
- Режим отладки (определение внешних адресов). Применяется для нахождения адресов, на которые есть ссылки из "внешних" участков кода.
- Скрывать константы. При включенной опции в байткоде нельзя будет найти адреса переменных или адреса вызываемых функций в явном виде.
- Динамическое создание онлайн команд. Исполнитель ВМ может выполняет не все команды Intel 8086 - поэтому такие команды выполняются в том виде, в котором они встретились в коде защищаемого участка. Динамическое создание онлайн команд также усложняет взлом байткода.
- Контроль целостности ВМ объектов. При выполнении программы исполнитель ВМ автоматически считает контрольную сумму случайных участков исполнителя, байткода и водяных знаков, которая используется при выполнении команд. Контроль целостности ВМ объектов защищает исполнитель, байт код и водяные знаки от изменения.
- Водяные знаки. Выберите необходимый водяной знак для включения его в защищенный файл.
- Название секций ВМ. Вы можете указать название новых секций, в которые будут записаны исполнитель ВМ и байткод для исполнителя.
- Удалять настраиваемые элементы. Компиляторы (в частности Delphi) создают для EXE файлов список настраиваемых элементов, которые не используются операционной системой при загрузке EXE файлов. При включенной опции область, занятая под список настраиваемых элементов, будет использоваться под нужды ВМ.
После установки всех необходимых опций запускаем компиляцию проекта. После компиляции рядом с защищаемым файлом (к примеру TEST.EXE) создастся новый файл (к примеру TEST.VMP.EXE), в котором указанные процедуры будут работать на виртуальной машине. |