Применение скриптов на примере расширенных маркеров

Issues related to VMProtect
Post Reply
Admin
Site Admin
Posts: 2566
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Применение скриптов на примере расширенных маркеров

Post by Admin »

Очень часто в проекте возникает потребность установки маркеров с заданием определенного типа компиляции для данного маркера. Данная задача решается добавлением дополнительных команд к стандартному маркеру и затем определение этих команд с помощью скрипта в процессе обработки защищаемой программы.
Например - дополнительная команда для типа "Мутация"у нас будет выглядеть как "lea eax, [eax]", для типа "Ультра" - "lea ebx, [ebx]".
Создадим собственный маркер кода на основе стандартного:

VMProtectMutation.inc

Code: Select all

asm
  lea eax,[eax+0]
  jmp @1
  db 'VMProtect begin',0
@1:
  lea eax,[eax] // дополнительная команда
end;
VMProtectUltra.inc:

Code: Select all

asm
  lea eax,[eax+0]
  jmp @1
  db 'VMProtect begin',0
@1:
  lea ebx,[ebx] // дополнительная команда
end;
Теперь с помощью скрипта будем автоматически определять дополнительные команды у стандартного маркера и добавлять эти блоки кода в проект с указанием типа компиляции:

Code: Select all

procedure OnBeforeCompilation;
var R:TIntelRecord;
    CompilationType:TCompilationType;
    Ptr:Int64;
    I:Integer;
    S:String;
begin
  R:=TIntelRecord.Create(nil);
  with VMProtector do
   for I:=0 to InputFile.MapRecords.Count-1 do // цикл по всем известным объектам
    with InputFile.MapRecords.Items[I] do
     if CodeType=otMarker then // если тип объекта = Маркер
      begin
       Ptr:=Address+$12; // $12=18d размер стандартного маркера VMProtectBegin
       R.ReadFromFile(InputFile,Ptr); // дизассемблируем первую команду за стандартным маркером
       S:=R.CommandText;
       if S='lea eax, [eax]' then
        CompilationType:=ctMutation
       else
       if S='lea ebx, [ebx]' then
        CompilationType:=ctUltra
       else
        CompilationType:=ctVirtualization; 
       AddByAddress(Address,CompilationType,True); // добавляем новую процедуру в проект с определенным типом компиляции
      end;
  R.Free;
end;
При запуске процесса компиляции все маркеры будут автоматически добавлены в список защищаемых объектов.
Post Reply