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;