Admin
Site Admin
Joined: 21 Aug 2006
Posts: 52
Location: Russia, E-burg
|
Posted:
Sat Aug 18, 2007 11:43 am |
|
ќчень часто в проекте возникает потребность установки маркеров с заданием определенного типа компил€ции дл€ данного маркера. ƒанна€ задача решаетс€ добавлением дополнительных команд к стандартному маркеру и затем определение этих команд с помощью скрипта в процессе обработки защищаемой программы.
Ќапример - дополнительна€ команда дл€ типа "ћутаци€"у нас будет выгл€деть как "lea eax, [eax]", дл€ типа "”льтра" - "lea ebx, [ebx]".
—оздадим собственный маркер кода на основе стандартного:
VMProtectMutation.inc
Code: |
asm
lea eax,[eax+0]
jmp @1
db 'VMProtect begin',0
@1:
lea eax,[eax] // дополнительна€ команда
end; |
VMProtectUltra.inc:
Code: |
asm
lea eax,[eax+0]
jmp @1
db 'VMProtect begin',0
@1:
lea ebx,[ebx] // дополнительна€ команда
end; |
“еперь с помощью скрипта будем автоматически определ€ть дополнительные команды у стандартного маркера и добавл€ть эти блоки кода в проект с указанием типа компил€ции:
Code: |
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; |
ѕри запуске процесса компил€ции все маркеры будут автоматически добавлены в список защищаемых объектов. |
|
|