Стал на выходных разбираться со стандартной шифрацией на интерлюде, и возникло пару вопросов.
1) если поставить галочку в л2пх с "не дешифровать трафик", пакеты типа SocialAction (например. 1B 02 00 00 00 ) идут постоянными значениями, ни байта не меняется. (например F7 D9 D8 D0 0B ) - в течение одной сессии остаются неизменными. Однако пакеты, имеющие размер побольше, меняются частично, например пакет UseItem (14 B3 A3 00 10 00 00 00 00 )
Такие значения приходят если не дешифровать трафик:
Код:
F8 67 C5 CD 06 C9 FB AD 64
F8 67 C5 CD 06 C9 FB AD 7F
F8 67 C5 CD 06 C9 FB AD 76
и т.д.
Все это наталкивает меня на мысль, что ключ шифрации не постоянный.
И вот вопрос: как он меняется?
2) Что это вообще за ключ шифрации и откуда он был получен с самого начала.
P.S. особенно важна инфа где в engine.dll найти алгоритм как он меняется
Добавлено через 3 часа 23 минуты
Те, кто разбираются в делфи, гляньте, что написано в стандартном ньюхоре об этом.
Код:
library newxor;
uses
windows,
Coding in 'Coding.pas';
type
TXorCoding = class(TCodingClass)
private
keyLen: Byte;
public
constructor Create;
procedure InitKey(const XorKey; Interlude: Boolean = False);override;
procedure DecryptGP(var Data; const Size: Word);override;
procedure EncryptGP(var Data; const Size: Word);override;
end;
TXorCodingOut = class(TCodingClass)
private
keyLen: Byte;
public
constructor Create;
procedure InitKey(const XorKey; Interlude: Boolean = False);override;
procedure DecryptGP(var Data; const Size: Word);override;
procedure EncryptGP(var Data; const Size: Word);override;
end;
function CreateCoding(Value:PCodingClass): HRESULT; stdcall;
begin
Result:=0;
try
Value^:=TXorCoding.Create;
except
Result:=-1;
Value^:=nil;
end;
end;
function CreateCodingOut(Value:PCodingClass): HRESULT; stdcall;
begin
Result:=0;
try
Value^:=TXorCodingOut.Create;
except
Result:=-1;
Value^:=nil;
end;
end;
exports CreateCoding, CreateCodingOut;
{ TXorCoding }
constructor TXorCoding.Create();
begin
FillChar(GKeyS[0],SizeOf(GKeyS),0);
FillChar(GKeyR[0],SizeOf(GKeyR),0);
keyLen := 0;
End;
procedure TXorCoding.DecryptGP(var Data; const Size: Word);
var
k:integer;
pck:array[0..$4FFF] of Byte absolute Data;
begin
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(PLongWord(@GKeyR[keyLen-7])^,size);
end;
procedure TXorCoding.EncryptGP(var Data; const Size: Word);
var
i:integer;
pck:array[0..$4FFF] of Byte absolute Data;
begin
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(PLongWord(@GKeyS[keyLen-7])^,size);
end;
procedure TXorCoding.InitKey(const XorKey; Interlude: Boolean = False);
const
KeyConst: array[0..3] of Byte = ($A1,$6C,$54,$87);
KeyIntrl: array[0..7] of Byte = ($C8,$27,$93,$01,$A1,$6C,$31,$97);
var key2:array[0..15] of Byte;
begin
if Interlude then begin
keyLen:=15;
Move(XorKey,key2,8);
Move(KeyIntrl,key2[8],8);
end else begin
keyLen:=7;
Move(XorKey,key2,4);
Move(KeyConst,key2[4],4);
end;
Move(key2,GKeyS,16);
Move(key2,GKeyR,16);
end;
{ TXorCodingOut }
constructor TXorCodingOut.Create;
begin
FillChar(GKeyS[0],SizeOf(GKeyS),0);
FillChar(GKeyR[0],SizeOf(GKeyR),0);
keyLen := 0;
end;
procedure TXorCodingOut.DecryptGP(var Data; const Size: Word);
var
k:integer;
pck:array[0..$4FFF] of Byte absolute Data;
begin
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(PLongWord(@GKeyR[keyLen-7])^,size);
end;
procedure TXorCodingOut.EncryptGP(var Data; const Size: Word);
var
i:integer;
pck:array[0..$4FFF] of Byte absolute Data;
begin
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(PLongWord(@GKeyS[keyLen-7])^,size);
end;
procedure TXorCodingOut.InitKey(const XorKey; Interlude: Boolean);
const
KeyConst: array[0..3] of Byte = ($A1,$6C,$54,$87);
KeyIntrl: array[0..7] of Byte = ($C8,$27,$93,$01,$A1,$6C,$31,$97);
var key2:array[0..15] of Byte;
begin
if Interlude then begin
keyLen:=15;
Move(XorKey,key2,8);
Move(KeyIntrl,key2[8],8);
end else begin
keyLen:=7;
Move(XorKey,key2,4);
Move(KeyConst,key2[4],4);
end;
Move(key2,GKeyS,16);
Move(key2,GKeyR,16);
end;
begin
end.
Добавлено через 1 час 39 минут
что эта строчка означает Inc(PLongWord(@GKeyR[keyLen-7])^,size);
Последний раз редактировалось St1mul, 26.01.2014 в 20:38.
Причина: Добавлено сообщение
Спасибо, почти разобрался, с 1-8 константа из кейинит, 9 байт меняется, а как получили с 10 по 16 байт этого ключа?
Эти байты отличны от тех, которые дальше идут после кеи инит.
Посмотрите, что в этом участке кода:
Код:
procedure TXorCoding.InitKey(const XorKey; Interlude: Boolean = False);
const
KeyConst: array[0..3] of Byte = ($A1,$6C,$54,$87);
KeyIntrl: array[0..7] of Byte = ($C8,$27,$93,$01,$A1,$6C,$31,$97);
var key2:array[0..15] of Byte;
begin
if Interlude then begin
keyLen:=15;
Move(XorKey,key2,8);
Move(KeyIntrl,key2[8],8);
end else begin
keyLen:=7;
Move(XorKey,key2,4);
Move(KeyConst,key2[4],4);
end;
Move(key2,GKeyS,16);
Move(key2,GKeyR,16);
end;
Ребят, тогда еще один вопрос:
К примеру, я нашел алгоритм шифрации пакетов.
В этом алгоритме есть ключ, с помощью которого производится шифрация.
Ясен пень, что байты ключа были получены с помощью каких то операций из KeyInit, однако они не совпадают, как это было в случае со стандартной шифрацией.
Так вот, суть вопроса, может кто знает где поставить брейк или саму функцию, которая ответственна за KeyInit?
Если имеется в виду пакет KeyInit, то после того, как он принят, ставишь брейкпоинт на чтение на буфер в памяти, где пакет лежит, рано или поздно попадешь в место, где из него формируется ключ. Как-то так я вижу этот процесс.
я тут подумал насчёт сообщений в чате, где то видел что когда кодируется текст сообщения то получается что то вроде xx 00 xx 00 xx 00 xx 00 xx....
Насколько я понимаю к пакету применяется операция xor на ключ так вот xor на 00 даёт нам часть ключа а как кодируется символ текста мы можем узнать.
Таким образом если написать очень большое сообщение и выдрать с середины часть, то можно вычислить ключ.
Возможно ли так работать со всеми онлайн играми, когда мы не знаем структуру пакета, но точно знаем что там есть чат?
И ещё вопрос: большинство клиентских онлайн игр используют xor на ключ при шифрации?
П.С. Если кто то может дать дополнительную информацию для понимания или ссылки на информацию по дешифрации трафика буду очень признателен.
Последний раз редактировалось BioDread, 28.03.2014 в 11:51.