# Использование маркеров

Для защиты отдельных участков кода, а также для защиты строковых констант в текст программы вставляют маркеры, которые представляют собой вызов импортируемых процедур, находящихся во внешней DLL-библиотеке (для 32-разрядных приложений используется VMProtectSDK32.dll, а для 64-разрядных - VMProtectSDK64.dll; для защиты драйверов используются VMProtectDDK32.sys и VMProtectDDK64.sys соответственно) - далее по тексту VMProtectSDK. Процедуры и функции, находящиеся в VMProtectSDK, не выполняют каких-либо действий и выступают лишь в роли меток, по которым VMProtect определяет границы защищаемого кода. Начало и конец защищаемого блока, соответственно, маркируется следующим образом:

- Delphi

      uses VMProtectSDK;

      VMProtectBegin(НАЗВАНИЕ_МАРКЕРА);
      ...
      VMProtectEnd;

- C/C++

      #include "VMProtectSDK.h"

      VMProtectBegin(НАЗВАНИЕ_МАРКЕРА);
      ...
      VMProtectEnd();

- MASM

      include VMProtectSDK.inc

      invoke VMProtectBegin,SADD(НАЗВАНИЕ_МАРКЕРА)
      ...
      invoke VMProtectEnd

- Visual Basic

      VMProtectBegin (StrPtr(НАЗВАНИЕ_МАРКЕРА))
      ...
      VMProtectEnd

Также вместо VMProtectBegin можно использовать маркеры с предустановленными типами компиляции:

- VMProtectBeginVirtualization - маркер будет использовать тип компиляции "Виртуализация".
- VMProtectBeginMutation - маркер будет использовать тип компиляции "Мутация".
- VMProtectBeginUltra - маркер будет использовать тип компиляции "Ультра".

Обработка маркеров производится следующим образом: при анализе кода защищаемого приложения VMProtect находит все вызовы процедур и функций VMProtectSDK. Границы защищаемых блоков определяются по парам маркеров VMProtectBegin/VMProtectBeginVirtualization/VMProtectBeginMutation/VMProtectBeginUltra и VMProtectEnd. В процессе обработки проекта с помощью VMProtect из кода защищаемой программы удаляются как сами маркеры, так и упоминание о библиотеках VMProtectSDK, поэтому нет необходимости включать данные библиотеки в дистрибутив программы. Маркеры удаляются независимо от того, были они включены в компиляцию или нет. При использовании именованных маркеров их имена также удаляются.

Если задано название маркера, ему будет присвоено имя вида "VMProtectMarker НАЗВАНИЕ_МАРКЕРА". Если название маркера не задано, ему будет присвоено уникальное имя вида "VMProtectMarker"+номер маркера по порядку. Однако использование неименованных маркеров имеет один серьезный недостаток, заключающийся в том, что при вставке в исходный код программы нового маркера нумерация неименованных маркеров изменится, поэтому при защите программ всегда целесообразно использовать именованные маркеры.

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

© 2006-2015 Copyright VMProtect Software