Подскажите чего делаю не так? Пример формирования взят отсюда -
http://www.la2kings.ru/la2bot/packet...questAuthLogin
Код:
RequestAuthLogin
Формат:
XX XX // Длина
08 // Тип
XX XX ... 00 00 // Login (Unicode строка)
XX XX XX XX // SessionKey2_SecondPart
XX XX XX XX // SessionKey2_FistPart
XX XX XX XX // SessionKey1_FistPart
XX XX XX XX // SessionKey1_SecondPart
01 00 00 00
Др.названия: AuthLogin
итак:
5701C7C5 - PlayOk2_2
EF80ABB - PlayOk2_1
72A03470 - LoginOk1_1
D6C018C0 - LoginOk1_2
admin - логин
получился пакет без крипта:
Код:
0x0000| 27 00 08 61 64 6D 69 6E 00 00 00 00 00 00 00 00
0x0010| 00 00 00 C5 C7 01 57 BB 0A F8 0E 70 34 A0 72 C0
0x0020| 18 C0 D6 01 00 00 00
закриптованный:
Код:
0x0000| 27 00 27 42 E9 47 A5 6B 3A 87 2F 2B EC 4E A1 6C
0x0010| 54 87 2F EE EE 88 F7 80 E5 75 D9 55 A8 DA 73 DE
0x0020| 8C 5F 39 FC ED 4E A1
криптую кодом указанным ниже, отправляя в него полученный XOR ключ:
Код:
unit CryptXOR;
interface
type
TxorCrypt = object
public
GKeyS,GKeyR:array[0..15] of Byte;
isInit: Boolean;
keyLen: integer;
procedure InitKey(const XorKey; Interlude: Boolean = False);
procedure DecryptGP(var Data; const Size: Word);
procedure EncryptGP(var Data; const Size: Word);
end;
implementation
procedure TxorCrypt.DecryptGP(var Data; const Size: Word);
var
k:integer;
pck:array[0..0] of Byte absolute Data;
begin
if not isInit then Exit;
for k:=size-1 downto 1 do
pck[k]:=pck[k] xor GKeyR[k and keyLen] xor pck[k-1];
if size<>0 then pck[0]:=pck[0] xor GKeyR[0];
Inc(PCardinal(@GKeyR[keyLen-7])^,size);
end;
procedure TxorCrypt.EncryptGP(var Data; const Size: Word);
var
i:integer;
pck:array[0..0] of Byte absolute Data;
begin
if not isInit then Exit;
if size<>0 then pck[0]:=pck[0] xor GKeyS[0];
for i:=1 to size-1 do
pck[i]:=pck[i] xor GKeyS[i and keyLen] xor pck[i-1];
Inc(PCardinal(@GKeyS[keyLen-7])^,size);
end;
procedure TxorCrypt.InitKey(const XorKey; Interlude: Boolean = False);
const
KeyConst: array[0..3] of Byte = ($A1,$6C,$54,$87);
KeyConstInterlude: array[0..7] of Byte = ($C8,$27,$93,$01,$A1,$6C,$31,$97);
begin
if Interlude then begin
keyLen:=15;
Move(XorKey,GKeyS,8);
Move(KeyConstInterlude,GKeyS[8],8);
end else begin
keyLen:=7;
Move(XorKey,GKeyS,4);
Move(KeyConst,GKeyS[4],4);
end;
Move(GKeyS,GKeyR,16);
isInit:=True;
end;
end.
выполняю функцию InitKey со значением False. ксор ключ - 2F2BEC4E33449AC7 из этого пакета:
Код:
0x0000| 19 00 2E 01 2F 2B EC 4E 33 44 9A C7 01 00 00 00
0x0010| 01 00 00 00 01 00 00 00 00
версия протокола с621
__________________
если чёта не так написал, то извиняйте, не программер я
, а так самоучка чуть-чуть