alexmarch, по этим 2м ссылкам что ты привел лучше по поводу логин сервера читать можешь только для ознакомления, там куча ошибок.
Найди лучше тут где то был исходник l2emu, там как раз реализован коннект к логин серверу (к грации парт2 подходит), по нему можно посмотреть и реализовать.
Yegor - обязательно гляну
Очень хочется внести ясность по авторизации распаковки и подмене RSA ключа (LS)
Ща накопипастю.
Цитата:
В общих чертах авторизация на HB-Gracia происходит так:
1. Пакет от сервера размером 186 байт зашифрованный по BlowFish начальным 16тибайтным ключем
(ключ как в интерлюдии, наизусть его не помню), после дешифровки BF надо ещё дешифровать по XOR,
ключ для него находиться на месте чексуммы пакета (178-181 байты),
алгоритм дешифрации могу выложить когда домой приду...
В этом пакете с ID=0 следующий формат данных:
4 байта - session id
4 байта - ревизия протокола ($c621 вроде)
128 байт - RSA ключ заскремблированный (как дешифровать в нормальный ключ тож могу выложить)
16 байт - какие то GameGuard значения неизвестного назначения
16 байт - новый BF ключ для следующих пакетов
остальное нули...
Сначало пакет расXORим
Код:
procedure LoginXORDecrypt(var xpck: TFixPck);
var
i,k: Integer;
begin
i:=xpck.size-8; // узнаем номер первого байта ключа (186-8=178)
k:=PInteger(@xpck.ch[i])^; // записываем ключ в 4х байтовую переменную
while i>=6 do begin // пока позиция больше или равна 6
PInteger(@xpck.ch[i])^:=PInteger(@xpck.ch[i])^ xor k; // ксорим очередные 4 байта на ключ
k:=k-PInteger(@xpck.ch[i])^; // вычитаем из ключа то что получилось
i:=i-4; // перемещаемся к предыдущим 4м байтам
end;
end; // усё
Цитата:
короче тут не по одному байту ксорим а по 4,
хотя в яве наверно ксорят по одному ибо там сложности с приведением типов.
>Тогда такой вопрос, возможно даже глупый:
>Есть последовательность из 4 байтов, которые являются ключом.
>И чтобы мне эту последовательность записать в переменную типа int,
>надо эти 4 байта ключа перевести в число? Или как?
>>бля переменная int это и есть 4 байта, тупо их туда пишеш и всё,
>>ты что с памятью работать не умеешь?
потом заскремблируем RSA ключ
Код:
procedure deScrambleRSAKey(var raw);
var
ab: array[0..127] of Byte absolute raw;
i: Word;
b: Byte;
begin
for i:=0 to $3f do ab[$40+i]:=ab[$40+i] xor ab[i];
for i:=0 to $03 do ab[$0d+i]:=ab[$0d+i] xor ab[$34+i];
for i:=0 to $3f do ab[i]:=ab[i] xor ab[$40+i];
for i:=0 to $03 do begin
b:=ab[i];
ab[i]:=ab[$4d+i];
ab[$4d+i]:=b;
end;
end;
PFixPck = ^TFixPck;
TFixPck = packed record case Integer of
0:(ch: array[Word] of Char);
1:(bt: array[Word] of Byte);
2:(size: Word;
id: Byte;
dbt: array[0..65532] of Byte);
end;
Добавлено через 59 секунд
для чего нам потребуется вот такая процедура
Код:
procedure LS_init(buff: array of byte; Len: integer);
begin
ToLog('********* LS_init ************');
ToLog('');
if Len<8 then exit;
Move(buff[3],SessionID,4);
if Len>=155 then begin
SetLength(RSA_key,128);
Move(buff[11],RSA_key[1],128);
ToLog('RSA Key changed');
end;
if Len>=171 then begin
SetLength(bf_key,16);
Move(buff[155],bf_key[1],16);
bf.Init(bf_key);
ToLog('BlowFish key changed');
end;
//sending AuthGG packet
AuthGameGuard;
end;
Где ошибся?
Последний раз редактировалось alexmarch, 18.08.2009 в 11:48.
Причина: Добавлено сообщение
alexmarch,
процедура procedure deScrambleRSAKey(var raw); ключ дескремблируе, а для подкладки своего ключа нужно написать функцию которая работает наоборот.
procedure LS_init(buff: array of byte; Len: integer); написана для получения ключа от сервера, да этот пакет нужно обработать и ключ от сервера запмнить он потом пригодится. Вот только после этого тебе нужно в этом пакете на место ключа сервера положить заскребмлированный свой public ключ Public: 65537, потом добавить новую чексумму, заксорить, заблоуфишить и отправить на клиент/бот.