Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Опкоды, Формулы, Клиент (http://mangos.ytdb.ru/forumdisplay.php?f=9)
-   -   Пакеты клиент <-> сервер (http://mangos.ytdb.ru/showthread.php?t=7229)

Dubstep 22.06.2013 16:35

Пакеты клиент <-> сервер
 
Доброго времени суток, решил опять посидеть над мангосом, и глянул сразу на катаклизм. Раньше насколько я помню было простое считывание через поток данных из пакета, а сейчас вижу что то добавилось какие-то 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);
    data.WriteGuidMask<0, 3, 6, 7, 2, 5, 1, 4>(guid);
    data.WriteGuidBytes<1>(guid);
    data << float(vsin);                                // y direction
    data << uint32(0);                                  // Sequence
    data.WriteGuidBytes<6, 7>(guid);
    data << float(horizontalSpeed);                    // Horizontal speed
    data.WriteGuidBytes<4, 5, 3>(guid);
    data << float(-verticalSpeed);                      // Z Movement speed (vertical)
    data << float(vcos);                                // x direction
    data.WriteGuidBytes<2, 0>(guid);
    SendPacket(&data);

Заранее Спасибо!

Fabian 22.06.2013 17:00

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.

Dubstep 22.06.2013 17:23

Thank you! Do not tell me how to find the indexes codes?

Amaru 22.06.2013 22:47

Клиент дизассемблить и вытаскивать, больше никак. Ну или можно в тринях смотреть и их WPP, но там не все правильно.

В клиенте что-то типа такого будет
Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 1 сообщение(ий)):
У вас нет прав чтобы видеть скрытый текст, содержащейся здесь.

Dubstep 23.06.2013 00:55

Спасибо, буду разбираться!

открыл этот же пакет, но как можно довести индексы до понятного вида? guid[0] и так далее.
http://paste2.org/vHNvOHFH

Ещё интересует вопрос по поиску опкода, в ида про это возможно?
_ESI = (SMSG_MOVE_KNOCK_BACK_struct *)this;

Нужно найти один пакет, номер его есть, но структура кривая...

Lordronn 23.06.2013 20:41

Цитата:

открыл этот же пакет, но как можно довести индексы до понятного вида? guid[0] и так далее.
Вот у тебя бит маска


а ниже уже идет чтение по битмаске
Код:

  if ( _ESI->guid[7] )

  {

    BYTE3(a2) = 0;

    CDataStore_GetInt8(v3, (int)((char *)&a2 + 3));

    _ESI->guid[7] ^= BYTE3(a2);

  }


Dubstep 23.06.2013 21:19

Где бит маска и тп я вижу :)

Вопрос как найти индексы, т.е. довести

*((_BYTE *)v4 + 16) = (unsigned int)v12 >> 7;
До
_ESI->guid[0] = (unsigned int)v12 >> 7;

p.s. Сори за тупые вопросы, с ида не так сильно знаком :)

Lordronn 23.06.2013 22:20

guid[0] - вот 0 твой индекс

Dubstep 23.06.2013 22:55

Вы наверное не поняли.

Я про то что, у меня есть только
*((_BYTE *)v4 + 16) = (unsigned int)v12 >> 7; <- тут не понятно какой индекс

Вопрос со стоит как сделать так:
_ESI->guid[0] = (unsigned int)v12 >> 7; <- тут уже видно что индекс 0, но как дойти до этого(Это вариант Amaru)

Evgeniy 24.06.2013 10:17

Код:

  *((_BYTE *)v4 + 16) = (unsigned int)v12 >> 7;  [0]
  *((_BYTE *)v4 + 19) = (unsigned int)v5 >> 7;  [3]
  *((_BYTE *)v4 + 22) = (unsigned int)v5 >> 7;  [6]
  *((_BYTE *)v4 + 23) = (unsigned int)v5 >> 7;  [7]
  *((_BYTE *)v4 + 18) = (unsigned int)v5 >> 7;  [2]
  *((_BYTE *)v4 + 21) = (unsigned int)v5 >> 7;  [5]
  *((_BYTE *)v4 + 17) =  (unsigned int)v5 >> 7;  [1]
  *((_BYTE *)v4 + 20) = (unsigned int)v5 >> 7;  [4]

как то так наверное:pardon:

Amaru 24.06.2013 11:56

v4 - адрес структуры, выражение в скобках - смещение по адресу.
ида имеет редактор структур + умеет предугадывать структуры
кликаешь правой кнопкой по переменной -> Create new struct type

Цитата:

00000000 SMSG_MOVE_KNOCK_BACK_struct struc ; (sizeof=0x20)
00000000 f0 db 16 dup(?)
00000010 guid db 8 dup(?) ; string(C)
00000018 f18 db 4 dup(?)
0000001C dword1C dd ?
00000020 SMSG_MOVE_KNOCK_BACK_struct ends
структура выглядит так, но может быть обобщена на многие другие опкоды

Dubstep 24.06.2013 14:03

Цитата:

Сообщение от Amaru (Сообщение 31600)
v4 - адрес структуры, выражение в скобках - смещение по адресу.
ида имеет редактор структур + умеет предугадывать структуры
кликаешь правой кнопкой по переменной -> Create new struct type

структура выглядит так, но может быть обобщена на многие другие опкоды

получилось, спасибо! :)

Есть ещё такой вопрос: как найти sub_* с нужным опкодом?

Amaru 25.06.2013 10:29

Адреса нужно искать как написано здесь http://filebeam.com/80a86ab4f83b6f9e13a749e5646b257c, автор - Chameleon.

Dubstep 26.06.2013 19:49

Цитата:

Сообщение от Amaru (Сообщение 31602)
Адреса нужно искать как написано здесь http://filebeam.com/80a86ab4f83b6f9e13a749e5646b257c, автор - Chameleon.

Скомпилил указанную там тулзу, вписал в поле слева опкод 0x5CB4, в оффсете справа так ничего и не появилось :(

По вписывал разные, удалось ввести оффсет, кинул его в поиск ида, и ничего нужно не нашло, что делаю не так?

Amaru 27.06.2013 11:50

Цитата:

Сообщение от Dubstep (Сообщение 31604)
Скомпилил указанную там тулзу, вписал в поле слева опкод 0x5CB4, в оффсете справа так ничего и не появилось :(

По вписывал разные, удалось ввести оффсет, кинул его в поиск ида, и ничего нужно не нашло, что делаю не так?

вводи десятичное число или копипасть, при вводе с клавиатуры тулза путает байты.

У меня нашло - special 0x16c
Это значит, что хендлер будет в NetClient__JAMClientDispatch в свиче с кейсом 0x16C, поэтому в коде дизассемблированном коде можно искать 0x16C

Код:

  case 0x16Cu:
      sub_6ADBE0((int)&v294, this, a2, a5, a3);
      v175 = sub_6A7540(&v294);
      sub_6A23E0(&v294);
      result = v175;
      break;


Dubstep 28.06.2013 17:46

Цитата:

Сообщение от Amaru (Сообщение 31608)
вводи десятичное число или копипасть, при вводе с клавиатуры тулза путает байты.

У меня нашло - special 0x16c
Это значит, что хендлер будет в NetClient__JAMClientDispatch в свиче с кейсом 0x16C, поэтому в коде дизассемблированном коде можно искать 0x16C

Код:

  case 0x16Cu:
      sub_6ADBE0((int)&v294, this, a2, a5, a3);
      v175 = sub_6A7540(&v294);
      sub_6A23E0(&v294);
      result = v175;
      break;


удалось найти. Спасибо, буду пробовать что ещё найти

Dubstep 08.07.2013 19:06

Начал смотреть на CMSG опкоды, вот например тулза ничего не выдаёт по 0x0480, как быть?

Amaru 09.07.2013 10:05

Тулза работает только с SMSG опкодами, для CMSG вычислять оффсеты смысла нет

Dubstep 09.07.2013 16:09

Цитата:

Сообщение от Amaru (Сообщение 31640)
Тулза работает только с SMSG опкодами, для CMSG вычислять оффсеты смысла нет

Не подскажите как найти структура пакетов для таких опкодов?

Amaru 09.07.2013 16:26

Цитата:

Сообщение от Dubstep (Сообщение 31642)
Не подскажите как найти структура пакетов для таких опкодов?

Цитата:

Сообщение от Amaru (Сообщение 31602)
Адреса нужно искать как написано здесь http://filebeam.com/80a86ab4f83b6f9e13a749e5646b257c, автор - Chameleon.

Поиском CTRL+F по c-дампу
Будет что-то типа CDataStore__PutUInt32(xxx, 1152);

Fabian 09.07.2013 16:34

and since a few patches, packet struct & opcode value are in different functions.
access by a off_xxxxxx

Dubstep 10.07.2013 16:03

Спасибо. разобрался :)

Dubstep 11.07.2013 17:52

Есть ещё не большой вопрос, заметил что с 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)
00000000 f0 db 16 dup(?)
00000010 guid db 8 dup(?) ; string(C)
00000018 f18 db 4 dup(?)
0000001C dword1C dd ?
00000020 SMSG_MOVE_KNOCK_BACK_struct ends

?

Amaru 12.07.2013 00:17

Там ничего особенного нет, также сначала считывается маска, потом байты
Посмотри опкод попроще, например CMSG_BATTLEMASTER_JOIN
Код:

char __thiscall PH_CMSG_BATTLEMASTER_JOIN(void *this, int a2)
{
  char v2; // al@1
  void *v3; // esi@1
  char v4; // zf@1
  char v5; // zf@1
  char v6; // al@3
  char v7; // al@5
  char v8; // al@7
  char v9; // al@9
  char v10; // al@11
  char v11; // al@13
  char result; // al@15
  int v13; // [sp+8h] [bp-8h]@1
  int v14; // [sp+Ch] [bp-4h]@1

  v3 = this;
  CDataStore__PutInt32(30978);
  CDataStore__PutInt32(*((_DWORD *)v3 + 4));
  v4 = *((_BYTE *)v3 + 26) == 0;
  v13 = a2;
  LOBYTE(v14) = 2
              * (2
              * (*((_BYTE *)v3 + 20) | 2
                                      * (2
                                      * (2 * (2 * (2 * !v4 | *((_BYTE *)v3 + 24) != 0) | *((_BYTE *)v3 + 27) != 0) | *((_BYTE *)v3 + 25) != 0) | *((_BYTE *)v3 + 29) != 0)) | *((_BYTE *)v3 + 28) != 0) | *((_BYTE *)v3 + 30) != 0;
  CDataStore__PutInt8(v14);
  v5 = *((_BYTE *)v3 + 31) == 0;
  BYTE1(v14) = 1;
  LOBYTE(v14) = !v5;
  sub_66ADB0(&v13);
  v2 = *((_BYTE *)v3 + 26);
  if ( v2 )
    CDataStore__PutInt8(v2 ^ 1);
  v6 = *((_BYTE *)v3 + 30);
  if ( v6 )
    CDataStore__PutInt8(v6 ^ 1);
  v7 = *((_BYTE *)v3 + 28);
  if ( v7 )
    CDataStore__PutInt8(v7 ^ 1);
  v8 = *((_BYTE *)v3 + 27);
  if ( v8 )
    CDataStore__PutInt8(v8 ^ 1);
  v9 = *((_BYTE *)v3 + 31);
  if ( v9 )
    CDataStore__PutInt8(v9 ^ 1);
  v10 = *((_BYTE *)v3 + 24);
  if ( v10 )
    CDataStore__PutInt8(v10 ^ 1);
  v11 = *((_BYTE *)v3 + 29);
  if ( v11 )
    CDataStore__PutInt8(v11 ^ 1);
  result = *((_BYTE *)v3 + 25);
  if ( result )
    result = CDataStore__PutInt8(result ^ 1);
  return result;
}

Код:

00000000 CMSG_BATTLEMASTER_JOIN_struct struc ; (sizeof=0x20)
00000000 f0              db 16 dup(?)
00000010 instanceId      dd ?
00000014 asGroup        db ?
00000015 f15            db 3 dup(?)
00000018 guid            db 8 dup(?)            ; string(C)
00000020 CMSG_BATTLEMASTER_JOIN_struct ends

Код:

char __thiscall PH_CMSG_BATTLEMASTER_JOIN(void *this, int a2)
{
  char v2; // al@1
  CMSG_BATTLEMASTER_JOIN_struct *v3; // esi@1
  char v4; // zf@1
  char v5; // zf@1
  char v6; // al@3
  char v7; // al@5
  char v8; // al@7
  char v9; // al@9
  char v10; // al@11
  char v11; // al@13
  char result; // al@15
  int v13; // [sp+8h] [bp-8h]@1
  int v14; // [sp+Ch] [bp-4h]@1

  v3 = (CMSG_BATTLEMASTER_JOIN_struct *)this;
  CDataStore__PutInt32(30978);
  CDataStore__PutInt32(v3->instanceId);
  v4 = v3->guid[2] == 0;
  v13 = a2;
  LOBYTE(v14) = 2
              * (2
              * (v3->asGroup | 2
                              * (2 * (2 * (2 * (2 * !v4 | v3->guid[0] != 0) | v3->guid[3] != 0) | v3->guid[1] != 0) | v3->guid[5] != 0)) | v3->guid[4] != 0) | v3->guid[6] != 0;
  CDataStore__PutInt8(v14);
  v5 = v3->guid[7] == 0;
  BYTE1(v14) = 1;
  LOBYTE(v14) = !v5;
  sub_66ADB0(&v13);
  v2 = v3->guid[2];
  if ( v2 )
    CDataStore__PutInt8(v2 ^ 1);
  v6 = v3->guid[6];
  if ( v6 )
    CDataStore__PutInt8(v6 ^ 1);
  v7 = v3->guid[4];
  if ( v7 )
    CDataStore__PutInt8(v7 ^ 1);
  v8 = v3->guid[3];
  if ( v8 )
    CDataStore__PutInt8(v8 ^ 1);
  v9 = v3->guid[7];
  if ( v9 )
    CDataStore__PutInt8(v9 ^ 1);
  v10 = v3->guid[0];
  if ( v10 )
    CDataStore__PutInt8(v10 ^ 1);
  v11 = v3->guid[5];
  if ( v11 )
    CDataStore__PutInt8(v11 ^ 1);
  result = v3->guid[1];
  if ( result )
    result = CDataStore__PutInt8(result ^ 1);
  return result;
}


Dubstep 13.07.2013 22:22

спасибо!

blackmanos 08.08.2013 08:03

а как найти адрес обработчика для такого типа пакетов?
SMSG_MAIL_LIST_RESULT = 0x4217, //15595
для простых выводит jam и по нему ищем, а тут выводит
Converted и Offset
что с ними делать чтоб найти обработчик?

Amaru 08.08.2013 10:32

Цитата:

Сообщение от blackmanos (Сообщение 31762)
а как найти адрес обработчика для такого типа пакетов?
SMSG_MAIL_LIST_RESULT = 0x4217, //15595
для простых выводит jam и по нему ищем, а тут выводит
Converted и Offset
что с ними делать чтоб найти обработчик?

я писал инжектор, но возможно как-то проще можно сделать

blackmanos 09.08.2013 03:48

похоже что можно, номер пакета встречается в коде так же как и клиентские номера пакетов.

Amaru 09.08.2013 10:11

Цитата:

Сообщение от blackmanos (Сообщение 31766)
похоже что можно, номер пакета встречается в коде так же как и клиентские номера пакетов.

Как? Если обработчики лежат в массиве и индекс является функцией от опкода

blackmanos 09.08.2013 10:32

поправка небольшая, так нашел пакет
SMSG_UPDATE_OBJECT
в мопе идет рекурсия и он сам себя по номеру вызывает.

Dubstep 29.08.2013 18:23

В курсе кто нибудь что за опкод 0x1027, в тринити он идёт как CMSG_GUILD_SET_ACHIEVEMENT_TRACKING, в мангосе похоже старое название.

Amaru 30.08.2013 10:06

в мангосе его и нет.
определенно что-то связанное с гильдейскими ачивами

Dubstep 30.08.2013 10:42

Он шлётся если открыть список ачив гильдии и нажать "Следить". И вот что там может отправляться не понятно О_о

Amaru 30.08.2013 11:18

а снифы на что?)
http://paste2.org/Nag8AVFh
очевидно, айди ачив

Dubstep 31.08.2013 12:04

ага, сначала количество потом сами ачивки.
Но что с ними делать? Может какие-то чудеса происходят при нажатии "Следить", кроме появления сбоку ачивок? :) На оффе не играл так что не знаю...

SeT 02.04.2014 01:29

Цитата:

Сообщение от Amaru (Сообщение 31608)
вводи десятичное число или копипасть, при вводе с клавиатуры тулза путает байты.

У меня нашло - special 0x16c
Это значит, что хендлер будет в NetClient__JAMClientDispatch в свиче с кейсом 0x16C, поэтому в коде дизассемблированном коде можно искать 0x16C

Код:

  case 0x16Cu:
      sub_6ADBE0((int)&v294, this, a2, a5, a3);
      v175 = sub_6A7540(&v294);
      sub_6A23E0(&v294);
      result = v175;
      break;


Попробывал сделать такую же магию, нашел case, только он другой... где в таком случае искать обработчик для smsg (билд 16048)?

Код:

    case 0xFBu:
      sub_7BE5C0(this, a2, a5, a3);
      sub_751360(&v37);
      sub_7B6C80(&v37);
      result = 1;
      break;


Amaru 02.04.2014 14:56

Цитата:

Сообщение от SeT (Сообщение 32635)
Попробывал сделать такую же магию, нашел case, только он другой... где в таком случае искать обработчик для smsg (билд 16048)?

Код:

    case 0xFBu:
      sub_7BE5C0(this, a2, a5, a3);
      sub_751360(&v37);
      sub_7B6C80(&v37);
      result = 1;
      break;


Не понял, в чем проблема.
Вбиваем в OpcodeTools для 16048 опкод, получаем normal, special, либо auth
Вбиваем в поиск, получаем хендлер

SeT 02.04.2014 15:25

Цитата:

Сообщение от Amaru (Сообщение 32637)
Не понял, в чем проблема.
Вбиваем в OpcodeTools для 16048 опкод, получаем normal, special, либо auth
Вбиваем в поиск, получаем хендлер

Слона и не увидел =) Все нашлось, на своих местах. Спасибо.

SeT 28.07.2014 08:58

Попался normal опокод - SMSG_AUCTION_BIDDER_LIST_RESULT (16135: hex - DB3, offset dec - 5148).
http://paste2.org/V75IIbKV

Дошёл до места - *(_DWORD *)(dword_11C95AC + 5148) = v6;

А вот куда дальше путь держать, не могу понять...

Amaru 29.07.2014 14:48

Как уже говорили, сдампить можно хендлеры нормал опкодов, написав программу.
Либо прицепить дебаггер и посмотреть, какой обработчик вызывается


Текущее время: 07:28. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS