PDA

Просмотр полной версии : Формирование AuthLogin для GS


andrewcik
24.10.2011, 21:16
Подскажите чего делаю не так? Пример формирования взят отсюда - http://www.la2kings.ru/la2bot/packets.html#RequestAuthLogin
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

andrewcik
26.10.2011, 13:56
досихпор неразобрался. помогите кто знает!
кстати логин записывать в пакет задом наперёд (т.е. не admin, a nimda)?

alexteam
26.10.2011, 14:02
логин записывать в пакет задом наперёд
нормально он записывается.
пх к клиенту подключи и посмотри что клиент шлет. скорей всего есть еще 4 константных дворда после ключиков.

к примеру фрея

Procedure CallRequestAuthLogin(LoginName:string;SessionKey1_ 1,SessionKey1_2,SessionKey2_1,SessionKey2_2:Intege r);stdcall;
begin
with Parser do
if mode = 0 then
begin
ClearOut;
WB($2B);
WS(LoginName);
WD(SessionKey2_2);
WD(SessionKey2_1);
WD(SessionKey1_1);
WD(SessionKey1_2);
WD(8);
WD(672);
WD(0);
WD(0);
SendBuf;
end;
end;