Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #77, МАЙ 2005 г.

Виртуальная машина на страже порядка

GPcH

Хакер, номер #077, стр. 077-106-7


[заключение]

Надеюсь, у тебя не осталось вопросов по интерпретированию и принципам защиты программ этим методом. Если же какие-то вопросы возникли, а статьи в сети не дали тебе достойного ответа – пиши мне, я с удовольствием постараюсь тебе помочь. На этом все, удачного интерпретирования.

[код интерпретатора]

procedure EngineVM(strScript: string);

var

//общие переменные

strCommand, strParameters: string;

strParametr: array[0..9] of string;

sSpace: integer;

i: integer;

//переменные команды «зашифровать»

strText: pointer;

strLen: integer;

strByte: byte;

label

encrypt;

begin

//находим первый пробел в строке

sSpace:=InStr(1,strScript,#32)-1;

if sSpace<>-1 then begin

//все, что находится до пробела, считаем командой

strCommand:=copy(strScript,1,sSpace);

//остальное - параметры

strParameters:=copy(strScript,sSpace+2,Length(strScript));

//заносим параметры, записанные через запятую, в массив

i:=0;

while InStr(1,strParameters,',')>0 do begin

//ищем запятую

sSpace:=InStr(1,strParameters,',')-1;

//сохраняем в массив параметр от начала строки до найденной запятой

strParametr[i]:=trim(copy(strParameters,1,sSpace));

//отрезаем от строки strParameters добавленный параметр

strParameters:=copy(strParameters,sSpace+2,Length(strParameters));

//увеличиваем счетчик параметров

i:=i+1;

end;

//добавляем последний параметр отдельно,

//так как после него вместо запятой конец строки

strParametr[i]:=copy(strParameters,1,Length(strParameters));

end else begin

//исли пробелов в строке нет, значит у команды скрипта

//нет параметров, потому за команду принимается все строка

strCommand:=strScript;

end;

//Выполняем скрипт

//сюда ты можешь добавить сколько угодно команд

//команда вывода сообщения (требует 3 параметра)

if strCommand='сообщение' then begin

MessageBox(Form1.Handle,pchar(strParametr[0]),pchar(strParametr[1]),

StrToInt(strParametr[2]));

//команда шифровки строки и вывода шифрованной строки на экран

end else if strCommand='зашифровать' then begin

strText:=pointer(strParametr[0]);

strByte:=StrToInt(strParametr[1]);

strLen:=Length(strParametr[0]);

asm

mov ecx, strLen

mov eax, strText

dec eax

mov bh, strByte

@encrypt:

xor byte ptr[eax+ecx],bh

loop @encrypt

end;

ShowMessage(strParametr[0]);

end else begin

ShowMessage('Invalid command');

end;

end;

CD

На диске лежит исходник скриптового движка рассмотренного в статье, а также программа VM Protect

WWW

Подробнее о машинном коде ты можешь узнать на сайте wasm.ru. Там же ты найдешь массу полезных инструментов.

Назад на стр. 077-106-6  Содержание