# Внешние адреса

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

    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 произойдет вызов точки останова, а при открытии окна отладчика можно будет увидеть, по какому адресу произошел данный переход.

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

© 2006-2015 Copyright VMProtect Software