пакеты и что с ними едят

ProMeTHeuS

Новичок+
Сообщения
2,359
Лайки
34
Баллы
48
1. Общие сведения об пакетных изьянах

1) Каждый пакет состоит из размера пакета(2 байта), типа пакета(1 байт) и блока параметров(переменная длина). В пакетах логин
серверу в конце пакета добавляется контрольная сумма и дополняется нулями так, чтобы размер пакета был кратен 8-ми байтам.
2) Строки в пакетах представлены байтами ANSI разделенными нулями, признаком конца строки является два нуля подряд.
Пример: 'A', 0x00, 'B', 0x00, 'C', 0x00, 0x00, 0x00
3) Байты в словах и двойных словах высылаются в обратном порядке. Т.е. если надо отправить число 1, то его следует записать
как 01 00 00 00, а не 00 00 00 01.
4) Контрольная сумма пакета расчитывается так:

Код:
unsigned long checksum( unsigned char *packet, int count )
{
long chksum = 0L;
for( int i = 0; i < count; i += 4 ) chksum ^= *((unsigned long *)&raw[i]);

return chksum;
};

5) Процесс соединения с гейм сервером:

Код:
1. Сразу после установки соединения сервер отправляет клиенту пакет Init
2. В ответ на него клиент отправляет пакет RequestGGAuth
3. Сервер отвечает на него пакетом GGAuth
4. Если сервер ответил, что авторизация прошла успешно, то клиент высылает пакет RequestAuthLogin, содержащий логин и пароль
5. Проверка логина и пароля, в случае неудачи, сервер высылает пакет LoginFail, инатче LoginOk, содержащий session key #1.
Для явы он постоянный.
6. Далее клиент запрашивает список серверов пакетом RequestServerList
7. В ответ на этот пакет сервер высылает клиенту ServerList, в нем содержиться список серверов и их IP адреса с номерами портов.
8. После выбора game-сервера, и нажатия на ОК, клиент отсылает пакет RequestServerLogin
9. LoginServer выполняет проверки на бан, максимальное количество игроков, доступность сервера и т.п., если все проверки пройдены,
то высылает пакет PlayOk, содержащий session key #2, этот ключь генерируется из текущего времени системы в мс, номера сокета и еще всякой лабуды.
10. После этого клиент высылает пакет AuthLogin выбраному серверу, содержащий session key #1, session key #2 и логин, необходимые
для генерации ключа по которому будет шифроваться весь трафик.
11. Сервер высылает пакет PlayOk, содержащий список чаров

2. Пакеты от клиетна серверу (Login Server)

Код:
00 - RequestAuthLogin
02 - RequestServerLogin
05 - RequestServerList
07 - RequestGGAuth

RequestAuthLogin

Назначение: запрашивает авторизацию на логин сервере

Код:
00
XX XX XX XX 00 00 // строка содержащая логин
XX XX XX XX 00 00 // строка содержащая пароль
08 // маркер конца секции логин/пароль
00 00 00 00 00 00 00 00 // не используется
XX XX XX XX // контрольная сумма
00 00 00 00 // выравнивание размера пакета

RequestServerLogin

Назначение: запрашивает подключение к гейм серверу
Формат:

Код:
02

RequestServerList

Назначение: запрашивает список game серверов
Формат:

Код:
05
??

RequestGGAuth

Назначение: запрашивает Game Guard авторизицию
Формат:

Код:
07
??

3. Пакеты от сервера клиенту (Login Server)

Код:
00 - Init
01 - LoginFail
03 - LoginOk
04 - ServerList
04 - PlayOk
0B - GGAuth

Init

Назначение: передает клиенту список серверов и их состояние

Код:
Формат:
00
XX XX XX XX // ID сессии
XX XX XX XX // Ревизия протокола 0x785a или 0xc62

// Публичный ключ
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX

// Неизвестно
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00

LoginFail

Назначение: сообщает о неудачной попытке подключения к логин серверу
Формат:

Код:
01
XX XX XX XX // причина неудачи:
// 0x01 - системная ошибка
// 0x02 - неправельный пароль
// 0x03 - логин или пароль неверен
// 0x04 - доступ запрещен
// 0x05 - информация на аккаунте неверна(хз, наверно имеется ввиду ошибка в БД)
// 0x07 - аккаунт уже используется
// 0x09 - аккаунт забанен
// 0x10 - на сервере идут сервисные работы
// 0x12 - срок действия истек
// 0x13 - на аккаунте не осталось больше времени

LoginOk

Код:
Назначение: высылается в подтсверждение на пакет RequestAuthLogin, в случае успешной проверки логина и пароля.
Формат:
03
XX XX XX XX // ? На яве 0x55555555
XX XX XX XX // session id. Это первая часть session id, для явы он постоянный
00 00 00 00
00 00 00 00
EA 03 00 00
00 00 00 00
00 00 00 00
02 00 00 00

XX XX XX XX // контрольная сумма
00 00 00 00 // выравнивание размера пакета
00 00 00 00
00 00 00

ServerList

Код:
Назначение: передает клиенту список серверов и их состояние
Формат:
04
XX // количество серверов в списке
00 // неиспользуется или зарезервировано

// <<<<< Следующий блок повторяется для каждлого сервера в списке
XX // ID сервера
XX XX XX XX // IP аддрес гейм сервера
XX XX XX XX // порт сервера
XX // возрастной лимит
XX // PVP сервер: 00 - нет, 01 - да
XX XX // количество игроков онлайн
XX XX // максимальное количество игроков
XX // тестовый сервер: 00 - нет, 01 - да
XX XX XX XX // контрольная сумма
00 00 00 00 // выравнивание размера пакета
00 00 00 00
00

PlayOk

Код:
Назначение: ответ на запрос авторизации на game-сервере
Формат:
07
XX XX XX XX // session id #2, вторая половина ключа сессии, генерируется случайно
?? ?? ?? ?? // непонятно, ява просто ставит тут 0x55667788
XX XX XX XX // контрольная сумма
00 00 00 00 // выравнивание размера пакета
00 00 00 00
00

GGAuth
Код:
Назначение: ответ на запрос GameGuard авторизации
Формат:
0B
XX XX XX XX // ответ:
// 0x0B - Пропустить авторизацию

4. Пакеты от сервера клиенту (Game Server)

Код:
01 - CharMoveToLocation
14 - AuthLoginFail
19 - CharCreateOk
1A - CharCreateFail
23 - CharDeleteOk
24 - CharDeleteFail
2F - ChangeWaitType
38 - TeleportToLocation
3E - ChangeMoveType
E1 - ChairSit

CharMoveToLocation

Назначение: сообщает клиенту что чар переместился
Формат:
01
XX XX XX XX // ID объекта
XX XX XX XX // Текущее положение X
XX XX XX XX // Текущее положение Y
XX XX XX XX // Текущее положение Z
XX XX XX XX // Точка назначения X
XX XX XX XX // Точка назначения Y
XX XX XX XX // Точка назначения Z



AuthLoginFail

Код:
Назначение: сообщает клиенту game-сервер отверг запрос на подключение
Формат:
14 // и/или 12 ???
XX XX XX XX // Причина:
// 0x00 - Текста нет
// 0x01 - Системная ошибка
// 0x02 - Пароль не соответствует аккаунту (причем тут тут game server ??? ему пароль даже не высылается Oo)
// 0x03 - Пароль не соответствует аккаунту (опять 25, корейцы млин)
// 0x04 - Попытка доступа неудачна, попробуйте позже.
// 0x05 - Неверный аккаунт, свяжитесь с службой поддержки
// 0x06 - Попытка доступа неудачна, попробуйте позже.(что-то у них многовато кодов на одну ошибку)
// 0x07 - Аккаунт уже используется(это вроде тоже логин сервер проверять должен)
// 0x08 - Попытка доступа неудачна, попробуйте позже.
// 0x09 - Попытка доступа неудачна, попробуйте позже.
// 0x10 - Попытка доступа неудачна, попробуйте позже.

CharCreateOk

Код:
Назначение: сообщает клиенту что создание чара успешно завершено
Формат:
19
01

CharCreateFail

Код:
Назначение: сообщает клиенту что попытка создания чара авершилась неудачей
Формат:
1A
XX XX XX XX // Причина:
// Creation Failed
// Слишком много чаров на акке
// шмя чара уже существует
// 16 eng chars. (слишком длинное имя ???)

CharDeleteOk

Код:
Назначение: сообщает клиенту что удаление чара прошло успешно
Формат:
23

CharDeleteFail

Код:
Назначение: сообщает клиенту что удаление чара завершилось неудачей
Формат:
24

ChangeWaitType

Код:
Назначение: сообщает клиенту что чар изменил wait тип(незнаю как это лучше на русский перевести :-/ Короче по параметрам понятоно что это такое)
Формат:
2F
XX XX XX XX // ID чара
XX XX XX XX // wait тип:
// 00 - сидеть
// 01 - стоять
// 02 - fake death
// 03 - отменить fake death
XX XX XX XX // X
XX XX XX XX // Y
XX XX XX XX // Z
 
Сверху