Пакеты клиент <-> сервер
Доброго времени суток, решил опять посидеть над мангосом, и глянул сразу на катаклизм. Раньше насколько я помню было простое считывание через поток данных из пакета, а сейчас вижу что то добавилось какие-то WriteGuidBytes, WriteGuidMask. Буду благодарен если кто то расскажет(может уже где то обсуждалось, но не нашёл) что это вообще такое и что за числа, например тут:
data.WriteGuidMask<0, 3, 6, 7, 2, 5, 1, 4>. Код:
WorldPacket data(SMSG_MOVE_KNOCK_BACK, 9 + 4 + 4 + 4 + 4 + 4 + 1 + 8); |
the numbers are for the indexes of the guid. the guid (uint64) is splitted to a byte array (length = 8).
if the value at the specific position is > 0, then True is written to the bit stream, else false. The same for the guidbytes, if the value at the index is true the specific byte value is written to the buffer. |
Thank you! Do not tell me how to find the indexes codes?
|
Клиент дизассемблить и вытаскивать, больше никак. Ну или можно в тринях смотреть и их WPP, но там не все правильно.
В клиенте что-то типа такого будет
|
Спасибо, буду разбираться!
открыл этот же пакет, но как можно довести индексы до понятного вида? guid[0] и так далее. http://paste2.org/vHNvOHFH Ещё интересует вопрос по поиску опкода, в ида про это возможно? _ESI = (SMSG_MOVE_KNOCK_BACK_struct *)this; Нужно найти один пакет, номер его есть, но структура кривая... |
|
Где бит маска и тп я вижу :)
Вопрос как найти индексы, т.е. довести *((_BYTE *)v4 + 16) = (unsigned int)v12 >> 7; До _ESI->guid[0] = (unsigned int)v12 >> 7; p.s. Сори за тупые вопросы, с ида не так сильно знаком :) |
guid[0] - вот 0 твой индекс
|
Вы наверное не поняли.
Я про то что, у меня есть только *((_BYTE *)v4 + 16) = (unsigned int)v12 >> 7; <- тут не понятно какой индекс Вопрос со стоит как сделать так: _ESI->guid[0] = (unsigned int)v12 >> 7; <- тут уже видно что индекс 0, но как дойти до этого(Это вариант Amaru) |
Код:
*((_BYTE *)v4 + 16) = (unsigned int)v12 >> 7; [0] |
v4 - адрес структуры, выражение в скобках - смещение по адресу.
ида имеет редактор структур + умеет предугадывать структуры кликаешь правой кнопкой по переменной -> Create new struct type Цитата:
|
Цитата:
Есть ещё такой вопрос: как найти sub_* с нужным опкодом? |
Адреса нужно искать как написано здесь http://filebeam.com/80a86ab4f83b6f9e13a749e5646b257c, автор - Chameleon.
|
Цитата:
По вписывал разные, удалось ввести оффсет, кинул его в поиск ида, и ничего нужно не нашло, что делаю не так? |
Цитата:
У меня нашло - special 0x16c Это значит, что хендлер будет в NetClient__JAMClientDispatch в свиче с кейсом 0x16C, поэтому в коде дизассемблированном коде можно искать 0x16C Код:
case 0x16Cu: |
Цитата:
|
Начал смотреть на CMSG опкоды, вот например тулза ничего не выдаёт по 0x0480, как быть?
|
Тулза работает только с SMSG опкодами, для CMSG вычислять оффсеты смысла нет
|
Цитата:
|
Цитата:
Цитата:
Будет что-то типа CDataStore__PutUInt32(xxx, 1152); |
and since a few patches, packet struct & opcode value are in different functions.
access by a off_xxxxxx |
Спасибо. разобрался :)
|
Есть ещё не большой вопрос, заметил что с CMSG по особому читается, например
void WorldSession::HandleReorderCharactersOpcode(WorldP acket& recv_data) recv_data.ReadGuidMask<1, 4, 5, 3, 0, 7, 6, 2>(guid); Под этом надо тоже писать структуру по типу таких: Код:
00000000 SMSG_MOVE_KNOCK_BACK_struct struc ; (sizeof=0x20) |
Там ничего особенного нет, также сначала считывается маска, потом байты
Посмотри опкод попроще, например CMSG_BATTLEMASTER_JOIN Код:
char __thiscall PH_CMSG_BATTLEMASTER_JOIN(void *this, int a2) Код:
00000000 CMSG_BATTLEMASTER_JOIN_struct struc ; (sizeof=0x20) Код:
char __thiscall PH_CMSG_BATTLEMASTER_JOIN(void *this, int a2) |
спасибо!
|
а как найти адрес обработчика для такого типа пакетов?
SMSG_MAIL_LIST_RESULT = 0x4217, //15595 для простых выводит jam и по нему ищем, а тут выводит Converted и Offset что с ними делать чтоб найти обработчик? |
Цитата:
|
похоже что можно, номер пакета встречается в коде так же как и клиентские номера пакетов.
|
Цитата:
|
поправка небольшая, так нашел пакет
SMSG_UPDATE_OBJECT в мопе идет рекурсия и он сам себя по номеру вызывает. |
В курсе кто нибудь что за опкод 0x1027, в тринити он идёт как CMSG_GUILD_SET_ACHIEVEMENT_TRACKING, в мангосе похоже старое название.
|
в мангосе его и нет.
определенно что-то связанное с гильдейскими ачивами |
Он шлётся если открыть список ачив гильдии и нажать "Следить". И вот что там может отправляться не понятно О_о
|
|
ага, сначала количество потом сами ачивки.
Но что с ними делать? Может какие-то чудеса происходят при нажатии "Следить", кроме появления сбоку ачивок? :) На оффе не играл так что не знаю... |
Цитата:
Код:
case 0xFBu: |
Цитата:
Вбиваем в OpcodeTools для 16048 опкод, получаем normal, special, либо auth Вбиваем в поиск, получаем хендлер |
Цитата:
|
Попался normal опокод - SMSG_AUCTION_BIDDER_LIST_RESULT (16135: hex - DB3, offset dec - 5148).
http://paste2.org/V75IIbKV Дошёл до места - *(_DWORD *)(dword_11C95AC + 5148) = v6; А вот куда дальше путь держать, не могу понять... |
Как уже говорили, сдампить можно хендлеры нормал опкодов, написав программу.
Либо прицепить дебаггер и посмотреть, какой обработчик вызывается |
Текущее время: 09:06. Часовой пояс GMT +3. |
ru-mangos.ru - Русское сообщество MaNGOS