VMProtectBegin(nil); for I:=0 to 10 do begin Inc(J); VMProtectEnd; end;
В виде ассемблерных команд данный цикл выглядит следующим образом:
----------------- начало маркера ---------------- 0044D12C mov eax, 0000000B 0044D131 inc ebx ----------------- конец маркера ----------------- 0044D132 dec eax 0044D133 jnz 0044D131
Очевидно, что после виртуализации команд с адресами 0044D12C и 0044D131 при выполнении незавиртуализированной команды условного перехода по адресу 0044D133 возникнет ошибка (т.к. по адресу 0044D131 вместо оригинального кода будут записаны различные данные или просто мусор). Для рассматриваемого примера адрес 0044D131 будет являться внешним.
При включении опции "Режим отладки" на место оригинального кода будет записана команда INT 03, являющаяся обычной точкой останова и служебной командой при работе под отладчиком. При запуске защищенной программы из-под отладчика в случае передачи управления по адресу 0044D131 произойдет вызов точки останова, а при открытии окна отладчика можно будет увидеть, по какому адресу произошел данный переход.
При обнаружении подобных переходов рекомендуется проверить правильность расстановки маркеров кода. Если защищаемый код не помечен маркерами или невозможно изменить логику приложения так, чтобы внутрь защищаемого кода не было перехода из других частей программы, то, используя графическую версию приложения, данные адреса следует пометить как внешние.