PDA

Просмотр полной версии : Операции с массивами


nezabudkin
02.10.2009, 13:31
Ребята, помогите, некак не могу разобраться. Скрипт относится к дешифрации пакетов. Нужно увеличить число длинной 4 байта, находящееся в массиве байтов, на определенную величину. В Delphi все просто:
Inc(PLongWord(@Key[0])^,size);

А как это сделать в fastscript? Вот сам скрипт, проблема в процедуре DecryptPacket.



var
frm:Tform;
memo:Tmemo;
initmode: boolean;
packet, stroka:string;
key: array [0..7] of byte;
KeyConst: array [0..7] of byte;

procedure Init; //Вызывается при включении скрипта
begin
frm := TForm.Create(nil);
frm.Caption := 'Chat';
frm.BorderStyle := bsSizeable;
frm.Position := poScreenCenter;
frm.align:=alBottom;
frm.Width:=700;
frm.Height:=200;
frm.FormStyle:=FsStayOnTop;
frm.Show;
memo :=TMemo.create(nil);
memo.parent:=frm;
memo.align:=alClient;
memo.WordWrap:=false;
memo.ScrollBars:=ssBoth;

initmode:= true;
packet:='';
stroka:='';
KeyConst[0]:= $84;
KeyConst[1]:= $73;
KeyConst[2]:= $66;
KeyConst[3]:= $E4;
KeyConst[4]:= $64;
KeyConst[5]:= $63;
KeyConst[6]:= $60;
KeyConst[7]:= $60;
end;

procedure Free; //Вызывается при выключении скрипта
begin
memo.free;
frm.Free;
end;

function inttostrhex (number: byte) : string;
const
hexdigit = '0123456789ABCDEF';
var
i, d1, d2: integer;
begin
d1:=number shr 4;
d2:=number - (d1 shl 4);
result:= hexdigit[(d1 and $F)+1];
result:= result + hexdigit[(d2 and $F)+1];
end;

function PackettoStr : string;
var
i, size: integer;
strochka: string;
begin
strochka:='';
size:=length(packet);
if size > 50 then size := 50;
for i:=1 to size do
begin
strochka:= strochka + inttostrhex(ord(packet)) + ' ';

end;
result:= strochka;
end;

procedure KeyPacket;
var
i,n: byte;
begin
for i:=0 to 7 do
begin
key[i]:= ReadC(i+3) xor KeyConst[i];
end;
end;

procedure DecryptPacket;
var
i, size: integer;
begin
size:=length(packet);
for i:=size downto 2 do
packet[i]:=chr(ord(packet[i]) xor Key[(i-1) and 7] xor ord(packet[i-1]));
if size<>0 then packet[1]:= chr(ord(packet[1]) xor Key[0]);

//ВОТ ТУТ ПРОБЛЕМА КАК ЭТО СДЕЛАТЬ?
//Inc(PLongWord(@Key[0])^,size);
// или
//IncasInteger(key, 0, size);

end;


//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if pck = '' then exit;
if InitMode and FromServer then
begin
if pck[1] = #$2E then
begin
KeyPacket;
InitMode:= false;
end;
exit;
end;

if not InitMode and FromServer then
begin
packet:=pck;
DecryptPacket;
stroka:= PackettoStr;
memo.lines.add(stroka);
end;
end.


[I]Добавлено через 17 часов 6 минут
Тему АП!

alexteam
02.10.2009, 14:06
необходимо:
при инкременте представить array [0..7] of byte;
как строку длинной в 8 байтов.
юзать для инкремента pck/buff + readx/writex
возможно даже прийдеться вручную "эмулировать" преполнение переменной.

оригинальный пцк запоминать перед, и востанавливать после этой возни с ключем.

nezabudkin
02.10.2009, 16:09
необходимо:
при инкременте представить array [0..7] of byte;
как строку длинной в 8 байтов.
юзать для инкремента pck/buff + readx/writex
возможно даже прийдеться вручную "эмулировать" преполнение переменной.

оригинальный пцк запоминать перед, и востанавливать после этой возни с ключем.


alexteam, это называется танцы с бубном :)
но, всеравно, спасибо!