Вернуться   CoderX :: Forums > Lineage II > L2PacketHack > Пакеты
Войти через OpenID

Пакеты Форум о форматах отдельных пакетов или групп пакетов

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 26.01.2014, 20:38   #1
Местный
 
Аватар для St1mul
 
Регистрация: 03.12.2011
Сообщений: 133
Сказал Спасибо: 63
Имеет 19 спасибок в 16 сообщенях
St1mul пока неопределено
По умолчанию Вопрос по ключу шифрации.

Стал на выходных разбираться со стандартной шифрацией на интерлюде, и возникло пару вопросов.
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. Причина: Добавлено сообщение
St1mul вне форума   Ответить с цитированием
Старый 27.01.2014, 07:04   #2
Местный
 
Аватар для goodvin1709
 
Регистрация: 13.02.2011
Сообщений: 506
Сказал Спасибо: 121
Имеет 100 спасибок в 83 сообщенях
goodvin1709 пока неопределено
По умолчанию

Увеличиваем число @GkeyR[key-7] на Значение Size)
__________________
---------------------------__--------__-----
---____- ___--____--- ___/'- /__ ___-(__)-____
--/-___-/-__-\/-__--\ /-__--'/--|-/--//---//--__--\
-/-/_/ -/-/_/--/-/_/--/-/_/--/|--|/--'//---//--/-/--/
-\___-/\____/\____/\____/-|____//__'//_'/-/__/
/_-__/
goodvin1709 вне форума   Ответить с цитированием
За это сообщение goodvin1709 нажился спасибкой от:
Старый 28.01.2014, 23:09   #3
Местный
 
Аватар для St1mul
 
Регистрация: 03.12.2011
Сообщений: 133
Сказал Спасибо: 63
Имеет 19 спасибок в 16 сообщенях
St1mul пока неопределено
По умолчанию

Спасибо, почти разобрался, с 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;
St1mul вне форума   Ответить с цитированием
Старый 31.01.2014, 08:19   #4
Новичок
 
Регистрация: 17.04.2012
Сообщений: 16
Сказал Спасибо: 0
Имеет 24 спасибок в 7 сообщенях
arksu пока неопределено
По умолчанию

Move(KeyIntrl,key2[8],8);
arksu вне форума   Ответить с цитированием
Старый 31.01.2014, 23:06   #5
Местный
 
Аватар для St1mul
 
Регистрация: 03.12.2011
Сообщений: 133
Сказал Спасибо: 63
Имеет 19 спасибок в 16 сообщенях
St1mul пока неопределено
По умолчанию

Цитата:
Сообщение от arksu Посмотреть сообщение
Move(KeyIntrl,key2[8],8);
ну и что это значит то? просто в делфи не силен

// procedure Move ( const SourcePointer; var DestinationPointer; CopyCount : Integer ) ;
// да собсно вот: http://www.delphibasics.ru/Move.php
благодарю

Последний раз редактировалось St1mul, 02.02.2014 в 21:25.
St1mul вне форума   Ответить с цитированием
Старый 14.02.2014, 22:21   #6
Местный
 
Аватар для St1mul
 
Регистрация: 03.12.2011
Сообщений: 133
Сказал Спасибо: 63
Имеет 19 спасибок в 16 сообщенях
St1mul пока неопределено
По умолчанию

Ребят, тогда еще один вопрос:
К примеру, я нашел алгоритм шифрации пакетов.
В этом алгоритме есть ключ, с помощью которого производится шифрация.
Ясен пень, что байты ключа были получены с помощью каких то операций из KeyInit, однако они не совпадают, как это было в случае со стандартной шифрацией.
Так вот, суть вопроса, может кто знает где поставить брейк или саму функцию, которая ответственна за KeyInit?
St1mul вне форума   Ответить с цитированием
Старый 15.02.2014, 12:02   #7
Новичок
 
Регистрация: 22.01.2010
Сообщений: 3
Сказал Спасибо: 1
Имеет 0 спасибок в 0 сообщенях
Domi пока неопределено
По умолчанию

Если имеется в виду пакет KeyInit, то после того, как он принят, ставишь брейкпоинт на чтение на буфер в памяти, где пакет лежит, рано или поздно попадешь в место, где из него формируется ключ. Как-то так я вижу этот процесс.
Domi вне форума   Ответить с цитированием
Старый 15.02.2014, 16:19   #8
Местный
 
Аватар для St1mul
 
Регистрация: 03.12.2011
Сообщений: 133
Сказал Спасибо: 63
Имеет 19 спасибок в 16 сообщенях
St1mul пока неопределено
По умолчанию

полюбому должна быть API функция
St1mul вне форума   Ответить с цитированием
Старый 27.03.2014, 22:55   #9
Пользователь
 
Аватар для BioDread
 
Регистрация: 06.02.2010
Сообщений: 42
Сказал Спасибо: 20
Имеет 2 спасибок в 2 сообщенях
BioDread пока неопределено
По умолчанию

я тут подумал насчёт сообщений в чате, где то видел что когда кодируется текст сообщения то получается что то вроде xx 00 xx 00 xx 00 xx 00 xx....
Насколько я понимаю к пакету применяется операция xor на ключ так вот xor на 00 даёт нам часть ключа а как кодируется символ текста мы можем узнать.
Таким образом если написать очень большое сообщение и выдрать с середины часть, то можно вычислить ключ.
Возможно ли так работать со всеми онлайн играми, когда мы не знаем структуру пакета, но точно знаем что там есть чат?
И ещё вопрос: большинство клиентских онлайн игр используют xor на ключ при шифрации?
П.С. Если кто то может дать дополнительную информацию для понимания или ссылки на информацию по дешифрации трафика буду очень признателен.

Последний раз редактировалось BioDread, 28.03.2014 в 11:51.
BioDread вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Lineage II > L2PacketHack > Пакеты



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 21:51.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!