Начал сегодня этот длинный и нелегкий путь.
Собственно на данный момент имею перехваченые пакеты в виде
масивов byte[].
С дельфи дружиться как то плохо, в плане попыток разобрать исходный код PH.
На данный момент имею несколько вопросов.
1. Что означают первые 2 байта в каждом пакете, я сравнил то что я получаю и то что отображается в PH, в пакет хаке эти 2 байта вообще не отображаются. (Вопрос отпал, это длина пакета)
2.Подскажите как можно попроще освоить синтаксис дельфи для восприятия исходиков PH.(Гугл рулит)
3.Так и не смог найти на форуме описание работы PH в плане шифровки\дешифровки.(анализ дельфийского кода + пример от alexteam на C++) Синтаксис примера arrjj труден для восприятия.
К 3ему вопросу ,насколько я понимаю это функции дешифровки,шифровки и получения ключа для для этого.
Разобраться в этом алгоритме в силу незнания delphi пока не могу, дельфийцы прокоментите пожалуйста код чтобы можно было понять алгоритм работы крипта\декрипа.
Код:
procedure L2Xor.DecryptGP(var Data; var Size: Word); // Прототип процедуры
var //Объявление переменных
k:integer; //объявление переменной типа Integer
i,t:byte; //объявление переменных типа byte
pck:array[0..$FFFD] of Byte absolute Data; //объявление масива переменных типа Integer длинной $FFFD (65533 байт) и запись в него всего пакета.
begin
i:=0; //зануление счетчика i
for k:=0 to size-1 do //начало цикла по k до конца пакета (обработка каждого байта пакета)
begin
t:=pck[k]; //Присваиваем значение текущего байта переменной t
pck[k]:=t xor GKeyR[k and keyLen] xor i xor IfThen(isAion and(k>0),Byte(KeyConst2[k and 63])); // Текущему байту пакета присваиваем значение этогоже байта отксореного на GKeyR[k and keyLen](байт ключа шифрования под номером (k and keyLen)), ксорим полученый результат на i , далее еще раз ксор если клиет=Aion(Меня Aion не интересует, пишу для себя под интерлюд шифрация стандартная)
i:=t; //Теперь устанавливаем i равным предыдущему байту, получается ксорим каждый последующий байт на GKeyR и потом еще на предыдущий байт.
end;
Inc(PCardinal(@GKeyR[keyLen-7])^,size); // Не используется пристандартной шифрации
if isAion and(Size>0)then pck[0]:=(pck[0] xor $EE) - $AE; // и нафига это... //эт для айона
end;
// На данный момент не понято:
//GKeyR[k and keyLen] - ответ дан arrjj
//Inc(PCardinal(@GKeyR[keyLen-7])^,size); - не используется при стандартном шифровании
procedure L2Xor.EncryptGP(var Data; var Size: Word);
var
i:integer;
k:byte;
pck:array[0..$FFFD] of Byte absolute Data;
begin
if isAion and(Size>0)then pck[0]:=(pck[0] + $AE) xor $EE; // и нафига это...
k:=0;
for i:=0 to size-1 do begin
pck[i]:=pck[i] xor GKeyS[i and keyLen] xor k xor IfThen(isAion and(i>0),Byte(KeyConst2[i and 63]));
k:=pck[i];
end;
Inc(PCardinal(@GKeyS[keyLen-7])^,size);
end;
Буду благодарен за любую помощ.
Спасибо.