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