Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
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
|