Показать сообщение отдельно
Старый 04.09.2009, 01:10   #9
Новичок
 
Регистрация: 03.09.2009
Сообщений: 5
Сказал Спасибо: 2
Имеет 0 спасибок в 0 сообщенях
roma_ пока неопределено
По умолчанию

Еще раз спасибо alexteam за ответ.

Алгоритм примерно понял, помогите разобраться каким образом L2PacketHack получает НАЧАЛЬНЫЙ XOR ключ для дешифровки первого пакета?

пакет с ключем KeyInit
0001 03 B1 93 B6 01 00 00 00 01 00 00 00

следующий пакет (еще не дешифрован)
17 E8 E0 E0 02 12 AE F0 F4 43 4B 05 E7 EA 56 5A 5E....

этот же пакет но после дешифровки L2PacketHack
13 01 00 00 43 7C E8 D9 00 49 00 4E 43 61 E8 8B 00....

восстанавливаю XOR ключ, получаю:
04 FE 08 00 A1 6C 54 87 04

байты с 5 по 8 понятно, это константный ключ, а вот первые четыре совсем не совпадают с ключом из пакета KeyInit

как получился такой ключ?

Добавлено через 1 час 48 минут
Эта процедура формирует начальный XOR ключ?
я в паскале ничего не понимаю

procedure TencDec.CorrectXor;
var
// tmp: string;
Offset: Word;
TempPacket : Tpacket;
begin
//Обход смены XOR ключа.
case pckCount of
3: CorrectXorData := Packet;
4: begin
TempPacket := Packet;
// SetLength(tmp, TempPacket.Size);
// Move(TempPacket, tmp[1], TempPacket.Size);
xorS.DecryptGP(TempPacket.Data, TempPacket.Size-2);
Offset := $13 or ((TempPacket.size-7) div 295) shl 8;
PInteger(@TempPacket.Data[0])^:=PInteger(@TempPacket.Data[0])^ xor Offset xor PInteger(@(xorS.GKeyS[0]))^;
xorS.InitKey(TempPacket.Data[0],isInterlude);
xorC.InitKey(TempPacket.Data[0],isInterlude);
if (not Settings.isNoDecrypt) then xorC.DecryptGP(CorrectXorData.Data, CorrectXorData.Size-2);
if (not Settings.isNoDecrypt) then xorC.EncryptGP(CorrectXorData.Data, CorrectXorData.Size-2);
InitXOR:=True;
end;
end;
end;

Если да, то пожалуйста ответьте на вопросы:
1)
TempPacket.size это размер четвертого пакета? (в котором передаются данные о выбранном персонаже)?

2) откомментируйте чего происходит в этих строках

PInteger(@TempPacket.Data[0])^:=PInteger(@TempPacket.Data[0])^ xor Offset xor PInteger(@(xorS.GKeyS[0]))^;
xorS.InitKey(TempPacket.Data[0],isInterlude);
xorC.InitKey(TempPacket.Data[0],isInterlude);
if (not Settings.isNoDecrypt) then xorC.DecryptGP(CorrectXorData.Data, CorrectXorData.Size-2);
if (not Settings.isNoDecrypt) then xorC.EncryptGP(CorrectXorData.Data, CorrectXorData.Size-2);

Последний раз редактировалось roma_, 04.09.2009 в 01:10. Причина: Добавлено сообщение
roma_ вне форума   Ответить с цитированием