Показать сообщение отдельно
Старый 18.08.2009, 11:39   #12
Новичок
 
Регистрация: 17.08.2009
Сообщений: 7
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
alexmarch пока неопределено
По умолчанию

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;
alexmarch вне форума   Ответить с цитированием