Название: Опкоды пакетов и их структура [Версия для печати] Автор: admin Время: 2024-8-30 09:53 Название: Опкоды пакетов и их структура Периодически новички интересуются структурами пакетов, и как их найти, для этого подготовил эту статью.
Есть 2 типа пакетов, старые и новые. В последнее время корейцы начали делать только новые пакеты, но бывает, что и редактируют старые. Старые пакеты зашиты в engine.dll и без реверса на них не посмотреть. В данном посте рассмотрим только "новые пакеты"
Все новые пакеты зашиты в интерфейсе. Для ессенса это InterfaceClassic.u.
В классах:
UIPacket.uc (структура пакета)
UIProtocol.uc (опкод пакета)
UIPacket и UIProtocol можно открыть с помощью utpt
Они делятся на 2 вида:
client to server и server to client
Пакеты от клиента к серверу идут с приставкой C_, а от сервера к клиенту - с приставкой S_
пример из UIProtocol:
const C_EX_COSTUME_LOCK = 573; - пакет от клиента к серверу,
const S_EX_COSTUME_LOCK = 785; - пакет от сервера к клиенту.
На примере этого пакета и продолжим углубление.
Рассмотрим пакет от клиента к северу - у него в константе указано 573, это его Opcode.
В серверной части опкоды переводятся в хекс значение:
от клиента к серверу опкод вычисляется по формуле: opcode - C_MAX, затем конвертируем в hex.
C_MAX это опкод, он указывается в UIProtocol, последнее время он равен 209.
573 - 209 = 364. 364 -> hex = 16C
16C и есть тот самый опкод для java класса.
Для серверного пакета так же используем хекс и опкод, но уже другой -
S_MAX = 255
S_MAX необходимо использовать для пакетов, номер которых выше 255. До этого значения- просто переводить в хекс.
С опкодами разобрались, переходим к структуре пакета.
Открываем UIPacket, ищем в нем C_EX_COSTUME_LOCK
Код:
struct _C_EX_COSTUME_LOCK{ var int nCostumeId; var int nLockState;};
Видим 2 переменные, оба являются int.
Это структура пакета, и она передается на сервер в функциях ниже, так же продолжаем поиск по названию внутри этого файла и находим
Здесь видно какую структуру будет пакет декодировать, мы рассматривали ее выше. Именно в этих типах данных и будет передана в клиент.
EncodeInt - это int,
EncodeChar - в java это short,
обычно для char используется readC, а для EncodeInt - readD
Пакет от клиента к серверу мы рассмотрели, теперь перейдем к рассмотрению структуры пакета, который ожидает клиент от сервера.
Принцип точно такой же находим _S_EX_COSTUME_LOCK в UIPacket:
Код:
struct _S_EX_COSTUME_LOCK{ var byte bResult; var int nCostumeId; var int nLockState;};