Показать сообщение отдельно
Старый 08.10.2008, 20:52   #233
Местный
 
Аватар для nezabudkin
 
Регистрация: 06.03.2008
Сообщений: 154
Сказал Спасибо: 46
Имеет 130 спасибок в 38 сообщенях
nezabudkin
Радость Защита L/2/s/e/r/v/e/r/./r/u/

И так, выкладываю алгоритмы шифрования ГС от L/2/s/e/r/v/e/r:

Здесь и далее все выкладки сделаны на основе скрипта под WPF, от автора kolosOK, за что спасибо ему большое!

От сервера:
Здесь все просто!
ключ берется из криптинит (4 байта), разбиватеся на 2 части и ксорится на константу
82 93 00 00 1A 41 00 00
x1 x2 00 00 x3 x4
где x- байты ключа из криптинит, итого размер ключа у нас 8 байт.
Далее используется стнадартный механизм шифрации/дешифрации линейки, типа:
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];

Алгоритм изменения ключа:
первые 4 байта ключа увеличиваются на длинну пакета (тоже стандартный алгоритм)
вторые 4 байта ключа получаем путем ксоринга их на первые 4 байта:
Inc(PLongWord(@GKeyR[0])^,size);
PLongWord(@GkeyR[4])^:= (PLongWord(@GKeyR[0])^) xor (PLongWord(@GKeyR[4])^);

Теперь от клиента:
Ключ1 берем аналогично,
ключ берется из криптинит (4 байта), разбиватеся на 2 части и ксорится на константу
82 93 00 00 1A 41 00 00
x1 x2 00 00 x3 x4
где x- байты ключа из криптинит, итого размер ключа у нас 8 байт.
Этим ключем дешифруем пакет 08 - RequestAuthLogin
Алгоритм шифрации/дешифрации здесь тоже стандартный.
В нем нас интересует поле LoginKey2. Запоминаем его (4 байта), и дописываем еще такой-же. Получаем ключ2.
Так-же существует массив байт (случайных чисел) в размере 65536. (Я его взял из скрипта под wpf любезно предоставленного автором kolosOK).
Алгоритм изменения ключа (вот тут разработчики намудрили!):
Ключ шифования меняется если длинна пакета больше 1 байта.
ключ1 (или потом просто ключ) ксорим на ключ2 и ксорим на 8байт из массива, взятых с определенным смещением, равным количеству дешифрованных пакетов.
Вот алгоритм:
KeyCounter1:= KeyCounter1 + 4;
if KeyCounter1= 32769 then KeyCounter1:= 1;
PLongWord(@GKeyR[0])^:= PLongWord(@GKeyR[0])^ xor PLongWord(@KeyClient[0])^;
PLongWord(@GKeyR[4])^:= PLongWord(@GKeyR[4])^ xor PLongWord(@KeyClient[4])^;
PLongWord(@GKeyR[0])^:= PLongWord(@GKeyR[0])^ xor PLongWord(@KeyConst[KeyCounter1])^;
PLongWord(@GKeyR[4])^:= PLongWord(@GKeyR[4])^ xor PLongWord(@KeyConst[65536-KeyCounter1-2])^;

Исходники моего newxor выложу на днях...

Последний раз редактировалось nezabudkin, 16.10.2008 в 14:14.
nezabudkin вне форума   Ответить с цитированием
За это сообщение nezabudkin нажился 5 спасибками от: