Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 09.02.2019, 12:34   #1
Новичок
 
Регистрация: 09.02.2019
Сообщений: 2
Сказал Спасибо: 1
Имеет 0 спасибок в 0 сообщенях
kotelok пока неопределено
По умолчанию Второй пакет для GS

Приветствую.

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

----
Кратко суть вопроса - по какому алгоритму шифруются пакеты игрового сервера для клиента 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-пакет? Ну и для контроля расшифровать его же обратно тем же ключом.
kotelok вне форума   Ответить с цитированием
Старый 09.02.2019, 13:45   #2
Местный
 
Аватар для ScythLab
 
Регистрация: 24.10.2014
Сообщений: 190
Сказал Спасибо: 4
Имеет 42 спасибок в 40 сообщенях
ScythLab пока неопределено
По умолчанию

Стандартный алгоритм - Blowfish, в некоторых случаях еще дополнительно используется простенькое xor скремблирование. Для отправки пароля используется RSA.
Если защита нестандартная, то может быть все что угодно.
На этом форуме была программа (на делфи), которая умела подключаться к игровому серверу и цепочка обмена была реализована вплоть до выбора персонажа, ищи.
__________________
Хобби: разработка бота для Lineage.
ScythLab вне форума   Ответить с цитированием
За это сообщение ScythLab нажился спасибкой от:
Старый 09.02.2019, 17:31   #3
Новичок
 
Регистрация: 09.02.2019
Сообщений: 2
Сказал Спасибо: 1
Имеет 0 спасибок в 0 сообщенях
kotelok пока неопределено
По умолчанию

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

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

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

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

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

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

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

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

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

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

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

Последний раз редактировалось kotelok, 09.02.2019 в 17:31. Причина: Добавлено сообщение
kotelok вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 21:56.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!