PDA

Просмотр полной версии : Проблема с дешифрацией пакета Init и RequestAuthLogin


mr_green
23.04.2010, 16:29
Добрый день.
Разбираюсь с протоколом обмена пакетами от логин сервера клиенту и от клиента логин серверу. Сервер Gracia Final. Опишу проблему:
Есть Init пакет от сервера

BA 00 54 9D 09 44 0C 5A 1C 20 26 16 C7 7B 3B DF
D5 1B 90 3D CD F9 9E FD C5 1E 4A A7 83 B1 A0 11
73 2C 7D 32 EC DD DC FA 20 84 B1 F9 74 DA 47 02
03 53 BB 37 6E 4D 82 24 B9 B8 E8 FB F1 43 2E 09
C1 42 9F FA 25 7E 87 E8 6C 1D 34 6F 0B FB 5A F5
F0 CD 4D 11 E2 A0 A2 82 35 78 1B 8F D0 12 7E F0
70 4A E8 AE 95 75 F0 C0 23 9B 5D E2 E4 D4 B6 E2
35 4A EA D0 12 9D 6E 35 4C 93 AB 24 B5 4C 7D 1F
21 BE 5E DA 43 1A D0 51 86 B3 7B D3 A1 45 59 8F
15 CF D3 96 6B 0F 56 D5 40 BA 35 21 CD 53 D3 95
B2 7A 22 79 67 31 94 77 3B F0 00 6D 38 3A 11 88
3E 6D AC 03 CB 3F 4D C7 87 F1

Расшифровали его, получили (раскидал по строчкам для удобства):

00
B8 58 00 00
21 C6 00 00
E4 FE 76 80 3B 52 53 27 A1 CD DD EC 57 B4 50 51 23 A3 5A 65 10 34 70 BE 20 04 2C AA 0F 77 14 0F 70 DA C8 35 07 1E 1F 53 50 E9 B3 A4 80 66 42 AD 90 BC 2D F9 AC 96 98 E1 CD 7F FF 75 90 5A 9F 6E 54 7C F7 CB 8B 68 F9 C3 98 55 85 9B E6 38 3A 67 85 00 81 38 01 BD 02 95 D9 C0 E4 F3 ED 30 AF EB BB 8F CE 61 A0 C6 EF C5 61 0C F8 00 DB 88 79 72 33 4A 15 15 F7 A0 10 06 61 91 F3 49 01 66 5E 9B
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
44 0E 96 F7 FB 9F 7B 66 29 66 D5 F8 C2 9E 5C 5E
14 E6 7F 1F 8F 67 82
FA DD AB FE
6C EA 53 54

Пакет от клиента RequestAuthLogin

B2 00 12 38 BF 78 4F 10 EF 89 E7 A4 78 A6 CB A1
4B 2E F4 4B FE 8C 9B B0 F0 F0 09 25 27 4E 58 D4
AD 90 02 B0 68 97 33 73 00 27 CC 0F B9 35 CB A2
26 FC 23 11 AA 4B 78 26 18 0F AB 13 A6 53 E2 3A
58 A5 B7 A5 E0 98 34 F5 B8 D1 A3 B0 C4 08 93 40
12 71 A1 06 86 F6 2A AA C9 93 48 4A 1E BF 37 6E
C4 84 2D 13 7B C6 96 BF 7C 50 F9 F2 37 24 F3 9E
B3 EA F1 B6 82 20 C8 69 A2 46 AF 32 A3 6A 78 C6
D9 F3 2C 14 42 E3 1D 43 91 14 9F ED 37 7D A3 B8
31 14 04 00 B3 29 AE 0C 50 26 9F ED 37 7D A3 B8
31 14 BE 24 61 A1 60 CB 7E 97 9F ED 37 7D A3 B8
31 14

Расшифровали его, получили (раскидал по строчкам для удобства):

00
12 C8 0E 6F AE B2 8A FF 3A 3A AC 35 06 41 DA 6F 8E 04 82 A7 86 7D 1B 74 A2 53 2C 50 D7 80 1D 70 0F 38 6F D9 FC 18 37 D7 17 C2 8B 85 DD 47 87 68 FA 3C 6C CF 69 75 F0 79 23 03 B8 75 01 CA 2F 0F 9D A6 A1 3C DF FA 61 07 33 41 C9 7B F6 AB FC 3A C7 B4 0A 60 44 83 F4 DF AF 85 D6 09 C2 DA 19 AB 09 BC D1 03 85 F2 6D A3 BF 77 24 06 AC B8 E1 B4 17 E4 9E AB 01 ED 2F FB 85 02 9A 56 B8 E8 9E 90
B8 58 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00
08
00 00 00 00 00 00 00 00
00 00
F5 18 6A 0D 00 00 00 00
00 00 00 00 00 00 00 00

Процедура расшифрования ключа RSA

E4FE76803B525327A1CDDDEC57B4505123A35A65103470BE20 042CAA0F77140F70DAC835071E1F5350E9B3A4806642AD90BC 2DF9AC9698E1CD7FFF75905A9F6E547CF7CB8B68F9C3985585 9BE6383A678500813801BD0295D9C0E4F3ED30AFEBBB8FCE61 A0C6EFC5610CF800DB887972334A1515F7A010066191F34901 665E9B

Sub DEncryptKeyRSA(ByRef n() As Byte)
For ii = 0 To &H40 - 1
n(&H40 + ii) = n(&H40 + ii) Xor n(ii)
Next

For ii = 0 To 4 - 1
n(&HD + ii) = n(&HD + ii) Xor n(&H34 + ii)
Next

For ii = 0 To &H40 - 1
n(ii) = n(ii) Xor n(&H40 + ii)
Next

Dim tmp As Byte

For ii = 0 To 4 - 1
tmp = n(ii)
n(ii) = n(&H4D + ii)
n(&H4D + ii) = tmp
Next

End Sub
Проблема состоит в том что не могу повторить зашифрованный участок RequestAuthLogin а именно:

12 C8 0E 6F AE B2 8A FF 3A 3A AC 35 06 41 DA 6F 8E 04 82 A7 86 7D 1B 74 A2 53 2C 50 D7 80 1D 70 0F 38 6F D9 FC 18 37 D7 17 C2 8B 85 DD 47 87 68 FA 3C 6C CF 69 75 F0 79 23 03 B8 75 01 CA 2F 0F 9D A6 A1 3C DF FA 61 07 33 41 C9 7B F6 AB FC 3A C7 B4 0A 60 44 83 F4 DF AF 85 D6 09 C2 DA 19 AB 09 BC D1 03 85 F2 6D A3 BF 77 24 06 AC B8 E1 B4 17 E4 9E AB 01 ED 2F FB 85 02 9A 56 B8 E8 9E 90

Участок который шифрую создавал по примеру:

[начало зашифрованного блока]
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20
00 00 XX XX XX XX XX XX XX XX XX XX XX XX XX XX // Login (учтите, эта строка - массив из 14 символов)
XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX // Password (... из 16 символов ...)
[конец зашифрованного блока]

Код:
Dim modulo As BigInteger = New BigInteger(modul)
Dim res As BigInteger
Dim exp As BigInteger = "65537"
Dim logpas(127) As Byte
logpas(95) = &H20
Array.Copy(Encoding.Default.GetBytes("&&&&&&&&&"), 0, logpas, 98, "&&&&&&&&&".Length)
Array.Copy(Encoding.Default.GetBytes("&&&&&&&&&"), 0, logpas, 112, "&&&&&&&&&".Length)
Dim lg As BigInteger = New BigInteger(logpas)
res = BigInteger.ModPow(lg, exp, modulo)

Подскажите, пожалуйста, какой будет RSA ключ.

xkor
23.04.2010, 19:08
mr_green, а разве в грации не так?
[начало зашифрованного блока]
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 24 00 00
XX XX XX XX XX XX XX XX XX XX XX XX XX XX // Login (учтите, эта строка - массив из 14 символов)
XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX // Password (... из 16 символов ...)
00 00 00 00
[конец зашифрованного блока]
хотя по логике эт одно и то же, но на серверах на которых я был этот пакет выглядел так...

ЗЫ а ты уверен что тебе надо в точности воссоздать пакет от клиента?, думаю сервер и так скушает (хотя возможно не каждый сервер, у явы вроде жестко позиции логины и пароля заданы были в сборках в которых я сорци смотрел)
ЗЗЫ бэйсик.., какое отродье...)

Добавлено через 4 минуты
кстати алгоритму RSA на самом деле пох на нули в начале, так что в общем виде шифрованный блок выглядит так:
XX // размер блока
00 00 // а хрен его хнает шо это
XX XX XX XX XX XX XX XX XX XX XX XX XX XX // Login (учтите, эта строка - массив из 14 символов)
XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX // Password (... из 16 символов ...)
00 00 00 00 // опять хрень какая то видать (возможно не обязательная)

mr_green
23.04.2010, 20:13
если я правильно понял то массив с логином и паролем это 128 байтное число которое возводим в степень 65537 и берем по модулю N. Вот это число 128 байт необходимо брать как оно есть, или приводить к другому виду, ну мол у нас есть «00 00 02 …» или нужно представить как «... 02 00 00». Так же ключ который я пытался дешифровать получался всегда непростым числом.
Вы можете мне сказать какой будет у меня RSA ключ при этих данных, если конечно это не займет у вас много времени?

xkor
24.04.2010, 00:13
если я правильно понял то массив с логином и паролем это 128 байтное число которое возводим в степень 65537 и берем по модулю N.именно так
Вот это число 128 байт необходимо брать как оно есть, или приводить к другому виду, ну мол у нас есть «00 00 02 …» или нужно представить как «... 02 00 00».ну брать нужно так чтобы логин находился в более старших разрядах чем пароль, однако в памяти это скорее всего будет выглядеть в инвертированном виде от того как мы блок составили так как работа с большими числами производиться через разделение их на много маленьких (по 4 байта на 32битных системах), а в x86 процессорах используется обратный порядок байт (то есть в первом байте младший разряд, ибо так удобнее преобразовывать), ну и логично было бы ещё до разбиения на мелкие подчисла инвертировать порядок байт)

однако как надо подавать байты в New BigInteger(modul) я понятие не имею, я вообще про класс BigInteger не слышал, разве что в .Net 4.0, но его ещё вроде не выпустили)

mr_green
24.04.2010, 04:22
Выпустили 12го числа :). И только вчера я поставил новую студию. Про хранение в памяти я приблизительное понятие имею. Просто что 00 00 02 что 02 00 00 это число, но другое. Как задумывалось при шифрации в RSA я не знал. Спасибо.
Но у меня все еще есть проблема с расшифровкой ключа. У меня числа получаются непростые. В RSA именно простые необходимы.
Я встречал ваш код:

procedure RSAkeyDecode(var raw);
var
ab: array[0..127] of Byte absolute raw;
i: Word;
b: Byte;
begin
for i:=0 to $3f do ab[$40+i]:=ab[$40+i] xor ab[i];
for i:=0 to $03 do ab[$0d+i]:=ab[$0d+i] xor ab[$34+i];
for i:=0 to $3f do ab[i]:=ab[i] xor ab[$40+i];
for i:=0 to $03 do begin
b:=ab[i];
ab[i]:=ab[$4d+i];
ab[$4d+i]:=b;
end;
end;


В него подавать ключ в таком виде как он пришел или развернуть?

xkor
24.04.2010, 12:18
mr_green, как он пришел...

mr_green
24.04.2010, 17:55
После дешивровки ключа получилось число:

8C6A36A68B68F9C39855859BE694ACFF6400813801BD0295D9 C0E4F3ED30AFEBBB8FCE61A0C6EFC5610CF800DB887972334A 1515F7A010066191F34901665E9BB082814BB03AAAE4399858 77B1547CF7CBA3DB5D1189722BF9C4C859E247BBE4CB550654 A7D8F09631E54BA45BEE3BDFA3F638EC5B3688E7ACEE0C3C91 3CC1F5

Оно как не крути непростое и отрицательное.
И своей прогой и вашим кодом дешефрует одинокого.

procedure RSAkeyDecode(var raw);
var
ab: array[0..127] of Byte absolute raw;
i: Word;
b: Byte;
begin
for i:=0 to $3f do ab[$40+i]:=ab[$40+i] xor ab[i];
for i:=0 to $03 do ab[$0d+i]:=ab[$0d+i] xor ab[$34+i];
for i:=0 to $3f do ab[i]:=ab[i] xor ab[$40+i];
for i:=0 to $03 do begin
b:=ab[i];
ab[i]:=ab[$4d+i];
ab[$4d+i]:=b;
end;
//showmessage('');
end;

procedure bfh(x:string; x2:string; var b:bb);
var i,l,ii:integer;
s,ss:string;
begin
l:=length(x);
if length(x) mod 2 <> 0 then x:='0'+x;
i:=0;
ii:=0;
while i<=l-1 do
begin
ss:='0x'+x[i+1]+x[i+2];
b[ii]:= StrToInt64(ss);
inc(ii);
i:=i+2;
end;

l:=length(x2);
i:=0;
while i<=l-1 do
begin
ss:='0x'+x2[i+1]+x2[i+2];
b[ii]:= StrToInt64(ss);
inc(ii);
i:=i+2;
end;

end;

procedure hfb(var x:string;var x2:string; b:bb);
var i,l,ii:integer;
s,ss:string;
h:integer;
begin

l:=100;
ii:=0;
x:='';
x2:='';
while ii<=l-1 do
begin
h:=b[ii];
s:=inttohex(b[ii],2);
x := x+s;
inc(ii);
end;

l:=128;
while ii<=l-1 do
begin
h:=b[ii];
s:=inttohex(b[ii],2);
x2 := x2+s;
inc(ii);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var b:bb;
ss,ss2:string;
begin
ss:='E4FE76803B525327A1CDDDEC57B4505123A35A6510347 0BE20042CAA0F77140F70DAC835071E1F5350E9B3A4806642A D90BC2DF9AC9698E1CD7FFF75905A9F6E547CF7CB8B68F9C39 855859BE6383A678500813801BD0295D9C0E4F3ED30AFEBBB8 FCE61A0C6EFC5610CF800DB887972334A1515F7A010066191F 3490166';
ss2:='5E9B';
bfh(ss,ss2,b);
RSAkeyDecode(b);
hfb(ss,ss2,b);
Edit1.Text:=ss;
Edit2.Text:=ss2;
end;

Быть может что-то попортило ключ? Блоу фиш или ксор…

xkor
25.04.2010, 02:03
mr_green, еслиб чтот чтот попортило ключ то попортило бы и BF ключ которым ты удачно расшифровал пакет от клиента а значит он не порченый.
Отрицательное?, а кто сказал что оно должно быть простое и положительное??

mr_green
07.05.2010, 18:08
Спасибо за консультацию. Логин сервер я прошел. Ошибка при использовании RSA была в том что 1-й бит 128 байтного числа был 1 и Net класс BigInteger принимал это число за отрицательное. Сделав число 129 байтным добавив «00» в старшем регистре удалось «обмануть» BigInteger.
Теперь разбираюсь что поменялось в пакете InitKey (CryptInit) . в с4 ксор ключ был 8 байт, 4 шло в пакете CryptInit, 4 были константой. В новой версии

writeC(0x2e);
39 writeC(_id); //0 - wrong protocol, 1 - protocol ok
40 for (int i = 0; i < 8; i++)
41 {
42 writeC(_key[i]); // key
43 }
44 writeD(0x01);
45 writeD(0x01); // server id
46 writeC(0x01);
47 writeD(0x00); // obfuscation key


Но пакет пришел чуть другой:

19 00
2E
01
70 D9 A8 CF | 12 83 3D 5E
01 00 00 00
01 00 00 00
00
92 A3 C9 48


Какой длинны ключ в грации финал?

xkor
07.05.2010, 19:19
mr_green, начиная с интерлюда ключ 16 байт, 8 приходят от сервера, 8 - константа (но на некоторых серваках эт константа тож от сервака приходит), инкрементятся теперь не первые 4 байта ключа при приходе каждого пакета а 4 байта начиная с 8го, то есть те с которых константа начинается

mr_green
08.05.2010, 03:28
Прочитал тему «Непонятный алгоритм смены ID исходящих пакетов». Очень много туманных моментов пока. Прогу пишу под rpgclub. Но походу это касается всех граций финал серверов.
Написал письмо Asmoday, быть может он еще сможет помочь. Очень благодарю за консультацию. Но если будет еще желание не откажусь от помощи…
Прочитал тему название которой выше. Что понял:
1. Сервер дает нам в пакете keyPacket 8 байт ключа XOR + 4 байта ключика для генерации таблицы для пакетов c однобайтным ID.
2. Сервер в пакете 0B charSelected добавляет 4 байта, эти 4 байта для генерации таблицы для пакетов c двухбайтным ID, но перед этим еще нужно что-то подшаманить.
Внимание вопрос :) что нужно подшаманить? И правильно ли я понял?

Также непонятно что идет от клиента в AuthLogin:

2F 00
6C
61 00 6B 00 74 00 74 00 65 00 73 00 74 00 00 00
6E A0 01 00 -\
6B 32 00 00 ключики от PlayOk и LoginOk
6E A0 01 00
35 7B 81 00 -/
08 00 00 00 - вроде как константа
00 00
B0 0C 02 01 - ??????
00 00

mr_green
03.07.2010, 00:30
Со сменой id пакетов уже все ясно. Сейчас разбираю пакет EnterWorld. Немогу понять от куда берутся эти данные:

000000 6B 00 11 00 00 00 00 00 | 00 00 00 00 00 00 00 00
000010 00 00 00 C9 BC F2 A7 66 | 5A 0B 98 36 A5 BD 89 ED
000020 7F E4 D7 6B 49 E2 9F EF | 76 EB CE A3 FA F4 BF 0C
000030 64 A3 B4 A4 CE DC C6 08 | 3E 6E EA 45 CA D3 FE 88
000040 13 87 B8 06 2C 96 F0 9B | 1E 8E BC C6 9B 98 C8 63
000050 16 CF D0 42 6A 00 00 C0 | A8 01 04 C0 A8 01 01 0A
000060 32 13 02 D4 A2 1A 0D 04 | 45 8D FA

000000 6B 00 11 00 00 00 00 00 | 00 00 00 00 00 00 00 00
000010 00 00 00 C9 BC F2 A7 66 | 5A 0B 98 36 A5 BD 89 ED
000020 7F E4 D7 6B 49 E2 9F EF | 76 EB CE A3 FA F4 BF 0C
000030 64 A3 B4 A4 CE DC C6 08 | 3E 6E EA 45 CA D3 FE 88
000040 13 87 B8 06 2C 96 F0 9B | 1E 8E BC C6 9B 98 C8 63
000050 16 CF D0 3E 34 00 00 C0 | A8 01 04 C0 A8 01 01 0A
000060 32 13 12 D4 A2 1A 09 04 | 45 8D FA

000000 6B 00 11 00 00 00 00 00 | 00 00 00 00 00 00 00 00
000010 00 00 00 C9 BC F2 A7 66 | 5A 0B 98 36 A5 BD 89 ED
000020 7F E4 D7 6B 49 E2 9F EF | 76 EB CE A3 FA F4 BF 0C
000030 64 A3 B4 A4 CE DC C6 08 | 3E 6E EA 45 CA D3 FE 88
000040 13 87 B8 06 2C 96 F0 9B | 1E 8E BC C6 9B 98 C8 63
000050 16 CF D0 20 5A 00 00 C0 | A8 01 04 C0 A8 01 01 0A
000060 32 13 02 D4 A2 1A 01 04 | 45 8D FA

000000 6B 00 11 00 00 00 00 00 | 00 00 00 00 00 00 00 00
000010 00 00 00 C9 BC F2 A7 66 | 5A 0B 98 36 A5 BD 89 ED
000020 7F E4 D7 6B 49 E2 9F EF | 76 EB CE A3 FA F4 BF 0C
000030 64 A3 B4 A4 CE DC C6 08 | 3E 6E EA 45 CA D3 FE 88
000040 13 87 B8 06 2C 96 F0 9B | 1E 8E BC C6 9B 98 C8 63
000050 16 CF D0 1F 3C 00 00 C0 | A8 01 04 C0 A8 01 01 0A
000060 32 13 06 D4 A2 1A 0D 04 | 45 8D FA

000000 6B 00 11 00 00 00 00 00 | 00 00 00 00 00 00 00 00
000010 00 00 00 C9 BC F2 A7 66 | 5A 0B 98 36 A5 BD 89 ED
000020 7F E4 D7 6B 49 E2 9F EF | 76 EB CE A3 FA F4 BF 0C
000030 64 A3 B4 A4 CE DC C6 08 | 3E 6E EA 45 CA D3 FE 88
000040 13 87 B8 06 2C 96 F0 9B | 1E 8E BC C6 9B 98 C8 63
000050 16 CF D0 B4 00 00 00 C0 | A8 01 04 C0 A8 01 01 0A
000060 32 13 06 D4 A2 1A 0D 04 | 45 8D FA

Во всех 5ти пакетах отличаются только выделенные участки.
В l2phx нам говорят что:
11=EnterWorld:d(a2*4)d(?)d(?)d(?)d(?)-(60)d(random)c(ip0.1)c(ip0.2)c(ip0.3)c(ip0.4)c(ip1 .1)c(ip1.2)c(ip1.3)c(ip1.4)c(ip2.1)c(ip2.2)c(ip2.3 )c(ip2.4)c(ip3.1)c(ip3.2)c(ip3.3)c(ip3.4)c(ip4.1)c (ip4.2)c(ip4.3)c(ip4.4)
но, что, куда и от куда… прошу помощи.

xkor
04.07.2010, 22:32
mr_green, первый красный блок + 2 нулевых байта это случайное число (очень похоже на номер сокета или типа того, короче случайное), далее идут 5 IP адрессов - трейс маршрута до сервера, почему то у 3го и 4го последний байт для разных сессий разный, видать маршрут до сервера не постоянный...

mr_green
04.07.2010, 22:54
спасибо. буду пытаться разобраться что это за рандомное число.