PDA

Просмотр полной версии : Криптование на Шоке


dip56245
05.03.2008, 13:46
Пытаюсь уже какой день разобраться с криптованием, ничерта не получается. :(
Перехватил первых 4 пакета, пытаюсь их расшифровать, вроде бы все делаю как в l2phx. но зараза 4 пакет не правильный хоть тресни.
Кто может подсказать где я не прав?

В архиве набросок как я пытаюсь расшифровать. проект для D7

xkor
05.03.2008, 18:43
хм странно, если всё как в l2phx то неправильным должен быть 3й а начиная с 4го всё должно быть окей)
l2phx на шоках ключ берёт из 4го пакета после чего его дорасшифровывает

dip56245
05.03.2008, 23:42
ну если я все правильно понял
1. пакет от клиента - протокол (не трогается)
2. пакет от сервера - криптИнит - инициализируем криптование
3. пакет от клиента - хз, так и не понял шо это
4. пакет от сервера - список чаров - сдесь идет:
а. декриптование пакета

cr.DecryptGP(PacketC.DataC, Packet.Size);

б. манипуляции

ii:=$13 or ((Packet.size - 7) div 295) shl 8;
PInteger(@PacketB[$02])^:=PInteger(@PacketB[$02])^ xor ii xor
PInteger(@(cr.GKeyS[0]))^;

в. повторная инициализация криптования

cr.InitKey(PacketB[$02],false);


но когда смотрю пакеты через l2phx - то я вижу 4 пакет правильно, а у себя нет... 8(((( хоть тресни

xkor
06.03.2008, 13:16
ну декриптование первое не проходит так как ключ ещё не задан, а после cr.InitKey(PacketB[$02],false); как раз и надо декриптовывать, то что было сохранено зарание...

dip56245
06.03.2008, 15:51
все, вопрос закрыт.
Благодарю xkor за помощь!

ASSA
23.04.2008, 19:05
А у мну тоже вопрос? И я его задам довольно глупо)))
У мну на сервере все было ок, гамал я под л2ПХ(она все пакеты видила на 80 правильно), гамал и вот в один прекрасный день пришлось обновить папку систем тк без ентого не запускалась л2.

Теперь админчег(видимо ему надоело что у него много гамают под л2пх) все обломал, теперь л2пх видит правильно первые 9 пакетов а потом начинается галиматья.

Я так понимаю что клуч таится тут Tип: 0x00 (CryptInit)

00 01 7E 67 00 00 01 00 00 00 01 00 00 00
Pазмер: 14+2
Время прихода: 17:31:25:000
- Пропущено: 1
h Key: 0x677E

И в полне может быть что каждый раз он разный.
А вот примеры пакетов на которых я просто валидат позишн и мувтулокейшн
BE 35 CE CC 64 3B 0B FE BF B1 05 32 9B F5 70 FD BF EF B5 CF 64 0D BB 03 40 82 F7 CD 64
3D 3C CE CC 64 26 0B FE 75 C4 05 32 9B E9 29 FC 75 83 F7 CD 64 EC 6F D9 4A 13 6B 16 C3 13 E9 B0 32 3F 73 E3 BE
00 07 8B C9 E5 27 EE E2 01 CC C2 1A AD 17 5E 1C FE F3 C2 19 AD A6 ED E1 01 8C 72 E7 52
02 9D 99 B8 E5 F8 95 E2 03 85 C2 1A AD 7C 5E 1C FC 4B B9 19 AD 23 EE E1 03 A4 72 E7 52
BA 33 CE CC 64 2D 0B FE BB B0 05 32 9B FD 70 FD BB F2 B5 CF 64 0D BB 03 44 83 F7 CD 64
B5 35 CE CC 64 3A 0B FE FD C5 05 32 9B 75 24 FC FD 82 F7 CD 64 49 14 4D F0 83 55 5D CF 86 1D B7 D2 30 12 60 3C
00 9D 99 B8 E5 FF 95 E2 01 93 C2 1A AD 7C 5E 1C FE 42 B9 19 AD 3F EE E1 01 A4 72 E7 52
2A 21 E2 08 E5 4C AC E3 07
B6 2C CE CC 64 15 0B FE B7 B0 05 32 9B F8 70 FD B7 EB B5 CF 64 0D BB 03 48 83 F7 CD 64
00 A9 53 18 E4 3C 9B E2 01 E4 C0 1A AD 57 5E 1C FE 34 B9 19 AD 5C ED E1 01 A4 72 E7 52
63 C3 C4 A8 E5 42 CF F3 4B 90 80 18 AD 34 97 E2 03 D4 BC 1A AD 76 5E 1C FC
35 33 CE CC 64 23 0B FE 7D C6 05 32 9B 4D C5 FC 7D 81 F7 CD 64 37 3F 08 7A 9D E8 C1 93 10 43 84 F0 8B DA 75 6D
00 9D 99 B8 E5 E0 95 E2 01 AB C2 1A AD 7C 5E 1C FE 45 B9 19 AD 29 EE E1 01 A4 72 E7 52
AA 2D CE CC 64 1D 0B FE AB B3 05 32 9B E4 70 FD AB DE B5 CF 64 0D BB 03 54 80 F7 CD 64
BD 2F CE CC 64 15 0B FE F5 C6 05 32 9B C8 E6 FC F5 81 F7 CD 64 72 5B 5B CD 60 8F F9 14 75 D5 A2 7F 6D 6F B3 A9
02 59 C5 C8 E5 92 91 E2 03 2E BD 1A AD 57 5E 1C FC FD BD 19 AD FF 91 E1 03 C4 72 E7 52
00 95 99 B8 E5 E2 95 E2 01 AB C2 1A AD 7C 5E 1C FE 52 B9 19 AD 11 EE E1 01 AC 72 E7 52
E7 2F CE CC 64 15 0B FE AF C6 05 32 9B C8 E6 FC AF 81 F7 CD 64 55 57 77 E9 05 55 04 34 02 3C D7 16 11 9D B3 87
54 2B CE CC 64 1E 0B FE 55 B3 05 32 9B E4 70 FD 55 DE B5 CF 64 0D BB 03 AA 80 F7 CD 64

а это уже новенький криптини
00 01 7A 4A 00 00 01 00 00 00 01 00 00 00

ПРОШУ хотябы намекнуть как разобраться с этой проблемой
или
что на много полезней, написать мои действия как вернуть л2пх способность видеть и правельно дешифрировать пакеты.

Добавлено через 10 минут
как можно заметить они имеют похожие куски..

PanAm
25.04.2008, 14:48
я так понимаю, в DecryptGP надо добавить проверку на CryptoInit и при приходе нового ключа вызывать InitKey

ASSA
26.04.2008, 13:28
2 PanAm
я так понимаю ты это имееш виду?

procedure DecryptGP(var pck: array of Byte; const Size: Word);
var
k:integer;
i,t:byte;
begin
i:=0;
for k:=0 to size-1 do
begin
t:=pck[k];
pck[k]:=t xor GKeyR[k and 7] xor i;
i:=t;
end;
Inc(PLongWord(@GKeyR[0])^,size);
end;

procedure EncryptGP(var pck: array of Byte; const Size: Word);
var
i:integer;
begin
pck[0]:=pck[0] xor GKeyS[0];
for i:=1 to size-1 do begin
pck[i]:=pck[i] xor GKeyS[i and 7] xor pck[i-1];
end;
Inc(PLongWord(@GKeyS[0])^,size);
end;

вот полезное файло...http://fursoffers.narod.ru/Packets.htm советую=))))
это взялось от сюда - форум флудерский но есть полезные весчи
http://allcheats.ru/t21043/

PanAm
28.04.2008, 13:49
нет, в newxor.dpr
я что-то в таком духе можно попробывать
type
TXorCoding = class(TCodingClass)
private
keyLen: Byte;
CryptoInit: Boolean; //Добавил новый флаг
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;

constructor TXorCoding.Create();
begin
FillChar(GKeyS[0],SizeOf(GKeyS),0);
FillChar(GKeyR[0],SizeOf(GKeyR),0);
keyLen := 0;
CryptoInit := false;
End;

procedure TXorCoding.DecryptGP(var Data; const Size: Word);
var
k:integer;
pck:array[0..$4FFF] of Byte absolute Data;
begin
if pck[0] := 0 then begin //вставил проверку
CryptoInit := true; //поднял флаг
InitKey(pck[2]); //устанавил новый ключ шифрования, InitKey(pck[2], true); для интрерлюда
exit; //дальнейшая обработка не нужна, выхел
end;
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 CryptoInit then begin //это был CryptoInit
CryptoInit := false; //сбосил флаг
exit; //шифрация не требуется - вышел
end;
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;
код не проверял, даже синтаксис...
просто пример, как обойти смену ключа.