首页
社区
课程
招聘
[求助]虚拟机代码
2008-2-22 21:47 4198

[求助]虚拟机代码

2008-2-22 21:47
4198
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function InStr(index: integer; str1: string; str2: string): integer;
var
i,len, pos: integer;
begin
pos:=0;
len:=length(str2);
for i:=index to length(str1) do begin
if copy(str1,i,len)=str2 then begin
pos:=i;
break;
end;
end;
result:=pos;
end;

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);<-这里出错了(main.pas(66): Incompatible types: 'Array' and 'String')
//остальное - параметры
strParameters:=copy(strScript,sSpace+2,Length(strScript));
//заносим параметры записанные через запятую в массив
i:=0;
while InStr(1,strParameters,',')>0 do begin
//ищем запятую
sSpace:=InStr(1,strParameters,',')-1;
//сохраняем в массив параметр от начала строки до найденной запятой
strParametr:=trim(copy(strParameters,1,sSpace));
//отрезаем от строки strParameters добавленный параметр
strParameters:=copy(strParameters,sSpace+2,Length(strParameters));
//увеличиваем счетчик параметров
i:=i+1;
end;
//добавляем последний параметр отдельно,
//так как после него вместо запятой конец строки
strParametr:=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;

end.

出错的地方应该怎样修改呢?请帮帮忙

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
打赏
分享
最新回复 (2)
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2008-2-23 08:47
2
0
// 看了半天没看出你那一句有什么错,就将你的代码拿到我这里编译了一下,是有出错,但并不是在你指出的那一句上(难怪我看半天看不出什么错) 。而是我下面用红色标明的那两句上。
function InStr(index: integer; str1: string; str2: string): integer;
var
  i,len, pos: integer;
begin
  pos := 0;
  len := length(str2);
  for i := index to length(str1) do
  begin
    if copy(str1,i,len) = str2 then
    begin
      pos := i;
      break;
    end;
  end;
  result := pos;
end;

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));// strParmetr是一个数组类型,所以这里要加上[i]
      strParameters := copy(strParameters,sSpace + 2,Length(strParameters));
      i := i + 1;
    end;
     strParametr[i] := copy(strParameters,1,Length(strParameters));// strParmetr是一个数组类型,所以这里也要加上[i]
  end
  else
  begin
    strCommand := strScript;
  end;
  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;
雪    币: 49
活跃值: (156)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
starsoul 2008-2-26 19:03
3
0
呵呵,不好意思,上次看错了,还没注意到这是个数组类型.谢谢了.
游客
登录 | 注册 方可回帖
返回