|
Опкоды, Формулы, Клиент Разбор и изучение взаимодействия клиента с сервером |
|
Опции темы | Поиск в этой теме | Опции просмотра |
22.06.2013, 16:35 | #1 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
Пакеты клиент <-> сервер
Доброго времени суток, решил опять посидеть над мангосом, и глянул сразу на катаклизм. Раньше насколько я помню было простое считывание через поток данных из пакета, а сейчас вижу что то добавилось какие-то 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); |
22.06.2013, 17:00 | #2 |
Новичок
Регистрация: 02.07.2010
Сообщений: 23
Сказал(а) спасибо: 2
Поблагодарили 20 раз(а) в 12 сообщениях
|
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. |
Пользователь сказал cпасибо: | Dubstep (13.07.2013) |
22.06.2013, 17:23 | #3 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
Thank you! Do not tell me how to find the indexes codes?
|
22.06.2013, 22:47 | #4 | |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
Клиент дизассемблить и вытаскивать, больше никак. Ну или можно в тринях смотреть и их WPP, но там не все правильно.
В клиенте что-то типа такого будет
Последний раз редактировалось Amaru; 22.06.2013 в 22:53. |
|
23.06.2013, 00:55 | #5 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
Спасибо, буду разбираться!
открыл этот же пакет, но как можно довести индексы до понятного вида? guid[0] и так далее. http://paste2.org/vHNvOHFH Ещё интересует вопрос по поиску опкода, в ида про это возможно? _ESI = (SMSG_MOVE_KNOCK_BACK_struct *)this; Нужно найти один пакет, номер его есть, но структура кривая... Последний раз редактировалось NeatElves; 23.06.2013 в 11:13. |
23.06.2013, 20:41 | #6 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
|
23.06.2013, 21:19 | #7 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
Где бит маска и тп я вижу
Вопрос как найти индексы, т.е. довести *((_BYTE *)v4 + 16) = (unsigned int)v12 >> 7; До _ESI->guid[0] = (unsigned int)v12 >> 7; p.s. Сори за тупые вопросы, с ида не так сильно знаком |
23.06.2013, 22:20 | #8 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
guid[0] - вот 0 твой индекс
|
23.06.2013, 22:55 | #9 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
Вы наверное не поняли.
Я про то что, у меня есть только *((_BYTE *)v4 + 16) = (unsigned int)v12 >> 7; <- тут не понятно какой индекс Вопрос со стоит как сделать так: _ESI->guid[0] = (unsigned int)v12 >> 7; <- тут уже видно что индекс 0, но как дойти до этого(Это вариант Amaru) |
24.06.2013, 10:17 | #10 |
Пользователь
Регистрация: 06.01.2012
Сообщений: 98
Сказал(а) спасибо: 12
Поблагодарили 33 раз(а) в 21 сообщениях
|
Код:
*((_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] |
24.06.2013, 11:56 | #11 | |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
v4 - адрес структуры, выражение в скобках - смещение по адресу.
ида имеет редактор структур + умеет предугадывать структуры кликаешь правой кнопкой по переменной -> Create new struct type Цитата:
Последний раз редактировалось Amaru; 24.06.2013 в 12:00. |
|
Пользователь сказал cпасибо: | Dubstep (24.06.2013) |
24.06.2013, 14:03 | #12 | |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
Цитата:
Есть ещё такой вопрос: как найти sub_* с нужным опкодом? |
|
25.06.2013, 10:29 | #13 |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
Адреса нужно искать как написано здесь http://filebeam.com/80a86ab4f83b6f9e13a749e5646b257c, автор - Chameleon.
|
3 пользователя(ей) сказали cпасибо: |
26.06.2013, 19:49 | #14 | |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
Цитата:
По вписывал разные, удалось ввести оффсет, кинул его в поиск ида, и ничего нужно не нашло, что делаю не так? |
|
27.06.2013, 11:50 | #15 | |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
Цитата:
У меня нашло - 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; Последний раз редактировалось Amaru; 27.06.2013 в 12:34. |
|
Пользователь сказал cпасибо: | Dubstep (28.06.2013) |
28.06.2013, 17:46 | #16 | |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
Цитата:
|
|
08.07.2013, 19:06 | #17 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
Начал смотреть на CMSG опкоды, вот например тулза ничего не выдаёт по 0x0480, как быть?
|
09.07.2013, 16:09 | #19 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
|
09.07.2013, 16:26 | #20 | |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
Цитата:
Будет что-то типа CDataStore__PutUInt32(xxx, 1152); |
|
Пользователь сказал cпасибо: | Dubstep (10.07.2013) |
10.07.2013, 16:03 | #22 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
Спасибо. разобрался
|
11.07.2013, 17:52 | #23 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
Есть ещё не большой вопрос, заметил что с 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 |
12.07.2013, 00:17 | #24 |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
Там ничего особенного нет, также сначала считывается маска, потом байты
Посмотри опкод попроще, например 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; } Последний раз редактировалось Amaru; 12.07.2013 в 00:24. |
Пользователь сказал cпасибо: | Dubstep (13.07.2013) |
13.07.2013, 22:22 | #25 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
спасибо!
|
08.08.2013, 08:03 | #26 |
Новичок
Регистрация: 22.03.2010
Сообщений: 11
Сказал(а) спасибо: 19
Поблагодарили 0 раз(а) в 0 сообщениях
|
а как найти адрес обработчика для такого типа пакетов?
SMSG_MAIL_LIST_RESULT = 0x4217, //15595 для простых выводит jam и по нему ищем, а тут выводит Converted и Offset что с ними делать чтоб найти обработчик? |
08.08.2013, 10:32 | #27 |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
|
09.08.2013, 03:48 | #28 |
Новичок
Регистрация: 22.03.2010
Сообщений: 11
Сказал(а) спасибо: 19
Поблагодарили 0 раз(а) в 0 сообщениях
|
похоже что можно, номер пакета встречается в коде так же как и клиентские номера пакетов.
|
09.08.2013, 10:11 | #29 |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
|
09.08.2013, 10:32 | #30 |
Новичок
Регистрация: 22.03.2010
Сообщений: 11
Сказал(а) спасибо: 19
Поблагодарили 0 раз(а) в 0 сообщениях
|
поправка небольшая, так нашел пакет
SMSG_UPDATE_OBJECT в мопе идет рекурсия и он сам себя по номеру вызывает. |
29.08.2013, 18:23 | #31 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
В курсе кто нибудь что за опкод 0x1027, в тринити он идёт как CMSG_GUILD_SET_ACHIEVEMENT_TRACKING, в мангосе похоже старое название.
|
30.08.2013, 10:06 | #32 |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
в мангосе его и нет.
определенно что-то связанное с гильдейскими ачивами |
30.08.2013, 10:42 | #33 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
Он шлётся если открыть список ачив гильдии и нажать "Следить". И вот что там может отправляться не понятно О_о
|
30.08.2013, 11:18 | #34 |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
|
31.08.2013, 12:04 | #35 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
ага, сначала количество потом сами ачивки.
Но что с ними делать? Может какие-то чудеса происходят при нажатии "Следить", кроме появления сбоку ачивок? На оффе не играл так что не знаю... Последний раз редактировалось Dubstep; 31.08.2013 в 12:08. |
02.04.2014, 01:29 | #36 | |
Ученый
Регистрация: 13.03.2010
Сообщений: 110
Сказал(а) спасибо: 55
Поблагодарили 23 раз(а) в 14 сообщениях
|
Цитата:
Код:
case 0xFBu: sub_7BE5C0(this, a2, a5, a3); sub_751360(&v37); sub_7B6C80(&v37); result = 1; break; |
|
02.04.2014, 14:56 | #37 | |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
Цитата:
Вбиваем в OpcodeTools для 16048 опкод, получаем normal, special, либо auth Вбиваем в поиск, получаем хендлер |
|
Пользователь сказал cпасибо: | SeT (02.04.2014) |
02.04.2014, 15:25 | #38 |
Ученый
Регистрация: 13.03.2010
Сообщений: 110
Сказал(а) спасибо: 55
Поблагодарили 23 раз(а) в 14 сообщениях
|
|
28.07.2014, 08:58 | #39 |
Ученый
Регистрация: 13.03.2010
Сообщений: 110
Сказал(а) спасибо: 55
Поблагодарили 23 раз(а) в 14 сообщениях
|
Попался normal опокод - SMSG_AUCTION_BIDDER_LIST_RESULT (16135: hex - DB3, offset dec - 5148).
http://paste2.org/V75IIbKV Дошёл до места - *(_DWORD *)(dword_11C95AC + 5148) = v6; А вот куда дальше путь держать, не могу понять... |
29.07.2014, 14:48 | #40 |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
Как уже говорили, сдампить можно хендлеры нормал опкодов, написав программу.
Либо прицепить дебаггер и посмотреть, какой обработчик вызывается |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
пакеты от клиента к серверу | acteros | Опкоды, Формулы, Клиент | 34 | 24.07.2014 09:15 |
Клиент и тайм зоны | Amaru | Опкоды, Формулы, Клиент | 5 | 29.05.2012 18:36 |
Пакеты MANGOS | Archon64 | Корзина | 3 | 08.01.2011 17:33 |
Клиент Катаклизма | evilstar | Флудильня | 5 | 04.12.2010 12:58 |
Портативный SQL клиент | selector | Новичкам | 10 | 09.07.2010 17:12 |