PDA

Просмотр полной версии : Дешифровка LS пакетов CT1.5


darkone
12.07.2008, 03:51
Всем привет. Сейчас я работаю над дешифровкой пакетов протокола Kamael: Hellbound (CT1.5), и столкнулся с определенными затруднениями. Возможно, кто-то поможет их разрешить...

Суть проблемы заключается в том, что офф логин-сервер (l2authd.lineage2.com) периодически посылает init-пакеты с динамическим ключом BlowFish в нестандартном формате, из-за чего дешифровка всей остальной сессии становится невозможной.

Во всех доступных мне источниках формат init пакета для протокола ревизии 0xC621 описывается как:

c 0x00 опкод Init
d 0xXXXXXXXX ID сессии
d 0x0000C621 версия протокола
b 128 байт - scrambled modulus (E-часть) RSA ключа
d 0x29DD954E четыре dword неизвестного назначения,
d 0x77C39CFC вероятно, идентификационная информация
d 0x97ADB620 для GameGuard (GG1, GG2, GG3, GG4)
d 0x07BDE0F7
b 16 байт - динамический BlowFish (BF) ключ
итого 169 байт

При этом, фактический размер получаемого с офф логин сервера пакета составляет 2+184 байта. из 184 байт: первые 176 - зашифрованный статическим BF ключом (6B 60 CB 5B 82 CE 90 B1 CC 2B 6C 55 6C 6C 6C 6C) пакет, и еще 8 - неизвестного назначения, видимо, какие-то контрольные суммы, но воспроизвести их подсчет известным методом мне так и не удалось. Далее, после расшифровки 176-байтной последовательности получаем 172-байтный payload. В нем первые 169 байт соответствуют описанной выше структуре, но остаются еще 3 байта. То есть реальная структура расшифрованного пакета:

... (см выше) ...
b 16 байт - динамический BlowFish (BF) ключ
c U1 неизвестный байт 1
c U2 неизвестный байт 2
c U3 неизвестный байт 3
итого 172 байта

Как выяснилось экспериментальным путем, офф логин сервер при соединении отсылает различные типы пакетов, произвольно выбирая один из них.

В первом типе пакетов U3 = 0x00 всегда, U1 и U2 чаще всего также равны 0x00, но могут принимать и другие значения. Дальнейшая расшифровка пакетов с извлеченным динамическим BF ключом происходит успешно.

Во втором типе пакетов все три байта U1-U3 не равны нулю. В таких пакетах, кроме того, отличаются от эталонных значений поля G1-G4, но главное, что расшифровка с динамическим BF ключом, извлеченным "как есть", оказывается неудачной.

Насколько я понимаю, динамический BF ключ в этих пакетах подвергается какому-то дополнительному scrambling-у, наличие которого и показывается в байте U3. Соответственно отсюда вопрос, каким образом можно дешифровать такие пакеты, как получить верный ключ.

Для наглядности приведу примеры.

Стандартый init пакет, полученный от офф логин сервера (тип 1):


BA 00 EC F7 A9 C0 4A 08 D1 70 3D 13 92 10 F1 D8 B9 7B E2 1C 5E 90 EB 08 03 78 7B 7A B8 5C 2E 85 BA 64 57 96 AD D3 ED 24 76 6D 7B 28 21 59 1D 7C 15 C0 45 BF A9 19 30 98 79 A3 96 CA D2 42 DC A7 C8 29 32 AD 0D 04 A3 C9 CC 6A 34 4A 97 B3 EA C5 3E 31 3F 88 E8 68 09 CA 59 25 D0 3E F5 41 37 B3 6F 00 07 97 57 02 42 06 C9 B1 1D 42 1E 3A BF 7A ED D3 3B E0 18 7C 54 6E AC 5B 1C DE B2 7F 0E 6D 03 3B 9C C1 1D 2A DE 9C 49 A9 7F A4 E0 6F 40 83 4C 2B FE C9 1E 51 42 B8 1B 33 0E 47 5F 85 23 7D 05 FF 3C DD CC B3 2D A5 38 43 6A A7 91 1C E1 4C C5 68 66 91 D3 88 B4 25 2F 06


после дешифровки статическим ключом фрагмента EC F7 .. C5 68:


00 00 00 00 00 21 C6 00 00 E0 F1 D6 94 B4 33 4C 17 D8 FC 86 C4 BD 4F 15 4C DB E2 57 E0 5F CB 54 A6 72 6B A6 2E BE AA 87 21 46 31 EA 5B 3C 7E B6 26 56 2E E0 03 3B B7 A4 A4 AF D6 4C 2C DD 6F 41 BB EA 28 85 36 1C D8 36 6F 8F 88 81 9E 60 E1 EE B3 86 63 A2 01 52 C8 08 DC CF 06 F4 9B 11 56 10 70 F6 5D 27 C3 68 D4 AE E7 5D 38 17 82 22 35 CC 6B B4 1E 5F 09 8D 58 6B C7 94 0F 71 18 85 74 40 C9 CD 0C 9D 9D 93 BC 30 5E 4E 95 DD 29 FC 9C C3 77 20 B6 AD 97 F7 E0 BD 07 EB D6 3B 76 9C 7D DB CE 0B CF 91 A0 98 2A FB 7E 00 00 00


как видите, здесь мы имеем:

Opcode: 00
Sess ID: 00 00 00 00
Proto: 00 00 C6 21
RSA Key: E0 F1 .. 30 5E
GG 1: 29 DD 95 4E
GG 2: 77 C3 9C FC
GG 3: 97 AD B6 20
GG 4: 07 BD E0 F7
BF Key: EB D6 3B 76 9C 7D DB CE 0B CF 91 A0 98 2A FB 7E
U1: 00
U2: 00
U3: 00

Что полностью соответствует задокументированной структуре, и расшифровка последующих пакетов с полученным BF Key EB D6 ... проходит нормально.

Init пакет типа 1, но с ненулевыми байтами U1 U2:


BA 00 67 6C 95 FD 70 86 D7 D8 C9 8E F3 3C BD D1 2B 28 45 A7 D5 C2 B4 F6 3A 53 69 F1 71 75 96 B9 FD DD FC 27 4A 2C 91 3D 45 6F 04 0F 89 CD 8A 79 B1 7C 75 7A D5 6C 05 5A 29 0C 3A 81 EF 59 1F 9C 89 10 FD A7 E9 C8 D4 7D E8 34 C3 57 FC E2 19 BF 31 9B 23 AA 9A 68 A7 BD 53 74 53 41 CE 47 01 23 0C 90 BE 40 5C 8A B2 6D A2 53 26 3F 69 25 11 BF 87 E8 EF 96 93 2D 05 AD 3E 94 8A 24 DA 2D 86 71 E9 74 22 53 F1 51 84 C2 CB 0D 8E 3B 48 12 6B 40 E6 37 62 6B A4 4E 1D 44 DB CC C1 49 67 54 BB FA A5 EF 47 EF A2 1F 42 1E 69 9C 89 21 ED 6D 79 D8 2C 32 C9 3B A5 F4 3C B6 E0 FA


После дешифровки:


00 00 00 00 00 21 C6 00 00 01 1C 20 63 4D 9B B8 5F E9 BF 49 0F 27 C4 26 91 66 AC 72 75 57 7C B1 2F 87 46 64 BB 33 7D 34 17 16 D4 13 D2 6B BA B4 78 64 7B 85 50 CE FD 6E B9 9B 19 70 BF 09 A3 7B BC A3 E5 20 29 E6 6D EC 65 C3 F9 7A 2C 05 61 7C 1D 22 0F DF 1E 4A 4A B3 79 0D 6F 37 1E 0C 12 C6 10 B0 94 C5 91 2D 59 00 7B 56 9F 85 56 90 73 72 F0 3E 29 FA 02 1C A0 E0 C3 C6 CF 83 FB 4A CB D7 00 60 D0 06 ED A6 69 BB 3C 4E 95 DD 29 FC 9C C3 77 20 B6 AD 97 F7 E0 BD 07 B6 4F A9 C1 6C 0B EF 6E B6 4F A9 C1 B6 4F A9 C1 17 01 00


то есть:

Opcode: 00
Sess ID: 00 00 00 00
Proto: 00 00 C6 21
RSA Key: 01 1C .. BB 3C
GG 1: 29 DD 95 4E
GG 2: 77 C3 9C FC
GG 3: 97 AD B6 20
GG 4: 07 BD E0 F7
BF Key: B6 4F A9 C1 6C 0B EF 6E B6 4F A9 C1 B6 4F A9 C1
U1: 17
U2: 01
U3: 00

Дальнейшая дешифровка с ключом B6 4F... идет успешно.

Пакет типа 2, после которого дешифровка ломается:


BA 00 09 84 F7 51 01 58 DF 5C D1 39 C6 E9 52 27 16 AA 62 04 E5 67 2E A6 84 6E 11 4F 5E 50 BD 20 16 FA 9A CF 77 53 0F 79 1B 14 B3 B6 96 7A F8 D7 19 44 B5 4A 2D 5F 83 18 5F 9F 54 B2 D8 CA 79 71 71 A0 CE 81 FF 4F 4C 58 DE 21 0F D4 A0 4E 31 83 02 2D 9A E9 AD ED 87 91 A2 5A 93 17 95 C2 B0 BB 54 F4 A1 9C FA 6D FD 60 25 EE 28 98 B9 40 64 09 FA 2A BC 53 F6 86 DC 47 B4 02 B3 20 7C 9F 3C 7D 1E 3D 3E 54 78 54 D2 34 8C A6 A0 B6 40 87 C1 6B 35 75 88 57 D1 E1 7D 7B 05 16 EE 54 3A 0D 62 7E 5A 4D AE D0 75 DF 90 DF BC A4 A3 5D D1 FF A5 A0 11 23 19 03 2B 30 91 45 2B 37


payload:


00 00 00 00 00 21 C6 00 00 88 F0 32 51 28 0D 75 64 A3 82 96 7C 1C FA 9C FD 2C 0D 39 FB 70 A9 AD 90 AB 97 DF C6 A4 50 09 F2 5C 59 6D 60 F2 E8 44 FF 7B 6D 54 30 9B 15 6E 76 3C 37 10 78 C5 E2 63 ED 2D EC AD CB A2 FA 8A 1C 68 E7 F3 9D DB 79 B1 E6 0C D7 0B 1C 59 7F C3 16 45 F1 F7 9C D8 BB 77 A8 97 A4 40 EE CA 27 35 2B A2 46 BC 24 17 B0 4B 97 36 31 CB FF A5 D1 3C 9C 17 38 60 0A A3 09 E4 D7 EB CB 7F F1 52 81 00 FB 4E 95 DD 29 FC 9C C3 77 20 B6 AD 97 F7 E0 7D 07 6E EC F3 D9 F9 1F 84 86 E7 7B 5E F6 50 10 C4 C2 E6 0F 2B


то есть:
Opcode: 00
Sess ID: 00 00 00 00
Proto: 00 00 C6 21
RSA Key: 88 F0 .. 00 FB
GG 1: 29 DD 95 4E
GG 2: 77 C3 9C FC
GG 3: 97 AD B6 20
GG 4: 07 7D E0 F7
BF Key: 6E EC F3 D9 F9 1F 84 86 E7 7B 5E F6 50 10 C4 C2
U1: E6
U2: 0F
U3: B2
(в GG4 отмечен отличающийся байт)

Если использовать для последующих пакетов BF ключ 6E EC ..., результат получается неверный.

Есть ли у кого-то сведения о способе дешифровки таких пакетов ?

RoZ
12.07.2008, 14:41
В стандартном формате он всё посылает. Первый зашифрованный пакет необходимо расшифровывать стандартным токеном, затем уже переходить на ключ в пришедшем пакете. У меня всё норм. Чуть попозже выложу код.
З.Ы. На чём пишешь ?