PDA

Просмотр полной версии : Второй пакет для GS


kotelok
09.02.2019, 12:34
Приветствую.

Нужен совет, т.к. завис на том моменте, на котором, судя по форумам, у остальных никаких проблем не возникает, а именно - на шифровании (ксором?) пакетов для/от геймсервера.

----
Кратко суть вопроса - по какому алгоритму шифруются пакеты игрового сервера для клиента Gracia Final?

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

----
Если это имеет значение, то ниже подробности.

Что есть:
1. LS успешно пройден.
2. GS принимает первый пакет, где указан протокол и отвечает успехом:
19 00 2e 01 95 ef 7c ec e0 e6 bc c8 01 00 00 00
01 00 00 00 00 e1 16 22 27
2E=KeyPacket:c(id 0-wrong protocol,1-protocol ok)q(key)d(01)d(ServerID)c(01)d(ObfuscationKey)

Т.е. пакет не зашифрован и содержит два каких-то ключа - один на 8 байт, другой на 4 (в самом конце). Или в конце это контрольная сумма?

Дальше подключился оригинальным клиентом и через Wireshark посмотрел следующий пакет, который клиент отправляет на сервер. Согласно описанию протокола, пакет зашифрован и содержит запрос на подключение (в т.ч. логин и 4 кусочка ключей, полученных от LS):
27 00 37 bd c1 48 a8 7e c2 0a c2 ec 7f 7e df ac
9d 0a 9f 79 05 e9 09 2e d4 b1 5f 79 ea eb 4a 01
33 a4 31 de a2 4e ae
2B=AuthLogin:s(LoginName)d(PlayKey2)d(PlayKey1)d(L oginKey1)d(LoginKey2)d(Unknown)

И вот тут не понятно, как на базе ключей из первого ответа сервера правильно зашифровать 2B-пакет? Ну и для контроля расшифровать его же обратно тем же ключом.

ScythLab
09.02.2019, 13:45
Стандартный алгоритм - Blowfish, в некоторых случаях еще дополнительно используется простенькое xor скремблирование. Для отправки пароля используется RSA.
Если защита нестандартная, то может быть все что угодно.
На этом форуме была программа (на делфи), которая умела подключаться к игровому серверу и цепочка обмена была реализована вплоть до выбора персонажа, ищи.

kotelok
09.02.2019, 17:31
Всё, получилось методом перебора вариантов из Гугла ).

Сначала первая половинка ключа (8 байт) берётся из первого ответа сервера: 95 ef 7c ec e0 e6 bc c8.

Потом ключ дополняется до 16 байт какой-то непонятной константой: c8 27 93 01 a1 6c 31 97 (откуда она берётся не понятно, но, вроде, походит во всех случаях независимо от значения первой половины).

И потом пакет обрабатывается одним из методов, взятых из этого класса (они, в т.ч., модифицируют ключ от размера последнего обработанного пакета):
https://github.com/xackery/l2net/blob/master/Code/Crypting/Crypt.cs

Добавлено через 1 минуту
Стандартный алгоритм - Blowfish ....
Да, спасибо, но этот этап я уже прошёл. Проблема была именно в XOR/unXOR пакетов сервера.

Сервер без защиты, так что всё заработало по указанному выше примеру.

Добавлено через 4 минуты
На этом форуме была программа (на делфи) ..
Да, я нашёл две. Одна очень помогла в прохождении логин-сервера (la2_client_emu), а вторую (xBot2010.sources), которая по идее умеет и с GS работать, я попросту не смог собрать, ибо там слишком много специфичных дельфёвых зависимостей.

----
Добавлено через 1 час 18 минут
Странно. Если бы ключ был некорректный, или алгоритм, то на выходе вообще ничего не получалось бы.

Однако, почему-то весь пакет раскодируется нормально, а первый байт каждый раз рандомный. Хотя там всегда должно быть одно и то же значение, обозначающее тип данного пакета.

Добавлено через 2 часа 18 минут
Разобрался. На PTS сервере GF есть настройка "EnablePacketShuffle". Если она включена, то в четырёх последних байтах первого пакета (2E=KeyPacket) сервер присылает ключ, которым в дальнейшем нужно модифицировать ID пакетов (вероятно, ещё на что-то влияет). Если настройку на сервере отключить, то ID-пакетов можно использовать без предварительного прогона через этот ключ.

Если кому понадобится, то способ мофикации ID пакетов относительно присланного ключа есть в исходниках вот этого класса:
https://github.com/xackery/l2net/blob/master/Code/Crypting/MixedPackets.cs