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