Top.Mail.Ru

[Мануалы] Опкоды пакетов и их структура

[Скопировать ссылку]
admin Опубликовано 2024-8-30 09:53:55 | Показать все сообщения |Режим чтения Распечатать Назад Вперед

Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!

Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться

x
Периодически новички интересуются структурами пакетов, и как их найти, для этого подготовил эту статью.
Есть 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. До этого значения- просто переводить в хекс.

const S_EX_COSTUME_LOCK = 785;
785 - 255 = 530. 530 -> hex = 212 = 0xFE:0x212 , где 0xFE это S_MAX


С опкодами разобрались, переходим к структуре пакета.
Открываем UIPacket, ищем в нем C_EX_COSTUME_LOCK
Код:
struct _C_EX_COSTUME_LOCK{    var int nCostumeId;    var int nLockState;};


Видим 2 переменные, оба являются int.
Это структура пакета, и она передается на сервер в функциях ниже, так же продолжаем поиск по названию внутри этого файла и находим

Код:
static function bool Encode_C_EX_COSTUME_LOCK(out array<byte> stream, _C_EX_COSTUME_LOCK packet){    if(! EncodeInt(stream, packet.nCostumeId))    {        return false;    }    if(! EncodeChar(stream, packet.nLockState))    {        return false;    }    return true;}


Здесь видно какую структуру будет пакет декодировать, мы рассматривали ее выше. Именно в этих типах данных и будет передана в клиент.
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;};


Расшифровка данных :
Код:
static function bool Decode_S_EX_COSTUME_LOCK(out _S_EX_COSTUME_LOCK packet){    if(! DecodeBool(packet.bResult))    {        return false;    }    if(! DecodeInt(packet.nCostumeId))    {        return false;    }    if(! DecodeChar(packet.nLockState))    {        return false;    }    return true;}


Здесь мы видим, что bResult декодируется как Bool,
nCostumeId как Int,
nLockState как Char
Опубликовать
Сектор творческих людей
Горячая линия

638638758

С понедельника по воскресенье с 9:00 до 23:00

Обратной связь

admin@artace.ru Онлайн

QR-код

Powered by Discuz! X3.5© 2001-2021 Comsenz Inc.