Например - дополнительная команда для типа "Мутация"у нас будет выглядеть как "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;
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;