|
Опкоды, Формулы, Клиент Разбор и изучение взаимодействия клиента с сервером |
|
Опции темы | Поиск в этой теме | Опции просмотра |
04.10.2014, 09:09 | #41 |
Гость
Сообщений: n/a
|
Использую http://www.privatepaste.com/7cc6a57a4d/SovakOpcodes
По второй колонке нахожу нужный мне sub_*** Но вот не могу найти у себя в ida опкоды, помеченные как LEGACY Кто-нибудь знает, что это за опкоды и как их искать в ida? |
04.10.2014, 23:58 | #42 | |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
Цитата:
|
|
05.10.2014, 04:59 | #43 |
Гость
Сообщений: n/a
|
|
06.10.2014, 21:58 | #44 |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
http://paste2.org/tA7HF34c
самый последний кусок вычислает обработчик нормал опкодов и вызывает его (17538 билд) там обычно в одной функции и читалка и обработка. ну а писалки там нет, так как это серверные опкоды Последний раз редактировалось Amaru; 06.10.2014 в 22:04. |
26.11.2014, 00:16 | #45 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
всем привет. решил покапать 603, но вот наткнулся на проблемы.... что то не один из методов по поиску сабов не прокатывает
может кто подскажет как сейчас с этим обстоят дела и как найти их.... |
27.11.2014, 01:59 | #46 |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
клиентские как раньше ищутся, а серверные обработчики немного по другому
находим сначала NetClient::OneMessageReady Код:
void __thiscall NetClient__OneMessageReady(void *this, int a2, int a3, int a4, signed int a5) { void *v5; // ebx@1 int v6; // edi@1 signed int v7; // eax@3 int v8; // eax@6 int v9; // eax@7 size_t v10; // esi@8 int v11; // eax@9 int v12; // ecx@13 signed int v13; // [sp-4h] [bp-12Ch]@19 char v14; // [sp+10h] [bp-118h]@8 void *v15; // [sp+10Ch] [bp-1Ch]@1 int (__stdcall **v16)(int, int, int); // [sp+110h] [bp-18h]@17 int v17; // [sp+114h] [bp-14h]@8 int v18; // [sp+118h] [bp-10h]@8 size_t v19; // [sp+11Ch] [bp-Ch]@8 int v20; // [sp+120h] [bp-8h]@8 int v21; // [sp+124h] [bp-4h]@8 int v22; // [sp+13Ch] [bp+14h]@9 v6 = a5; v5 = this; v15 = this; if ( a5 < 4 || !a4 || (v7 = sub_653578(this, a2), v7 >= 4) ) goto LABEL_4; v8 = (int)(v5 + v7 + 1650); if ( *(_BYTE *)v8 ) { v11 = *(_DWORD *)a4; v22 = *(_DWORD *)a4; if ( *(_DWORD *)a4 == 1882 ) { v13 = 0; } else { if ( *(_DWORD *)a4 == 1994 ) { NetClient__DecompressAndProcess(a2, a4 + 4, v6 - 4); return; } if ( *(_DWORD *)a4 != 5962 ) { if ( *(_DWORD *)a4 == 6105 ) { NetClient__HandleMultiplePackets(a2, a3, a4 + 4, v6 - 4); } else { v12 = (v11 - 1) & 0xF6E; if ( v12 == 1864 || v12 == 1896 ) { v18 = 0; v19 = -1; v21 = 0; v16 = &off_D62168; v17 = a4 + 4; v20 = v6 - 4; NetClient__JAMClientConnectionDispatch(a2, a3, v11, &v16); v16 = &off_D62168; CDataStore__InternalDestroy(&v16); } else { if ( sub_6541A4(v5, a2) ) sub_6252E0(v22, (int)v5, a2, a4, v6); } } return; } v13 = 1; } sub_653613(a2, a4 + 4, v6 - 4, v13); return; } *(_BYTE *)v8 = 1; v9 = strlen("WORLD OF WARCRAFT CONNECTION - SERVER TO CLIENT"); if ( sub_A3DE62(a4, "WORLD OF WARCRAFT CONNECTION - SERVER TO CLIENT", v9) ) { LABEL_4: sub_653F7D(a2, 3u); sub_957D2F((LPCRITICAL_SECTION)a2); return; } v10 = strlen("WORLD OF WARCRAFT CONNECTION - CLIENT TO SERVER") + 1; memmove_0(&v14, "WORLD OF WARCRAFT CONNECTION - CLIENT TO SERVER", v10); v17 = (int)&v14; v18 = 0; v19 = v10; v20 = 4; v21 = 0; WowConnection__Send(&v17, 1); sub_53ACB3( v18, "d:\\buildserver\\wow\\4\\work\\wow-code\\branches\\wow-patch-6_0_3-branch-fastpatch-1\\wow\\source\\wowservices\\PacketPipe.h", 34, 0); } Код:
if ( sub_6541A4(v5, a2) ) sub_6252E0(v22, (int)v5, a2, a4, v6); Код:
if ( (unsigned __int8)(*(int (__cdecl **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD))(*(_DWORD *)v7 + 0x18))( a2, a1, a3, a4, a5) ) Код:
[StructLayout(LayoutKind.Sequential)] struct SMSGHandler { public IntPtr pName; // 0x0 public uint checker; // 0x4 public uint _2; // 0x8 public uint _3; // 0xC public uint _4; // 0x10 public uint dataHandler; // 0x14 public uint connectionChecker; // 0x18 } pName - имя группы, checker - проверка принадлежности группы, dataHandler - адрес обработчика группы, connectionChecker - проверяет номер соединения (?) вот так это выглядит в 19116 Код:
'ClientQuest' Checker: 5F4D44 Connection Checker: 5F4D86 DataHandler: 5F4DD3 _2: 0 _3: 0 _4: 5F4D5C 'Client' Checker: 5F8F77 Connection Checker: 5FF895 DataHandler: 5F90B3 _2: 0 _3: 0 _4: 5FF74D 'ClientGuild' Checker: 61F2BD Connection Checker: 61F2FF DataHandler: 61F34C _2: 0 _3: 0 _4: 61F2D5 'ClientSocial' Checker: 62A9FD Connection Checker: 62AA15 DataHandler: 62AA43 _2: 0 _3: 0 _4: 250000 'ClientSpell' Checker: CAE449 Connection Checker: CAE52D DataHandler: CAE5C8 _2: 0 _3: 0 _4: CAE4B5 'ClientMovement' Checker: CB96EE Connection Checker: CB9898 DataHandler: CB997B _2: 0 _3: 0 _4: CB97BF 'ClientLFG' Checker: CBC9E4 Connection Checker: CBCA26 DataHandler: CBCA54 _2: 0 _3: 0 _4: CBC9FC 'ClientChat' Checker: CBFCED Connection Checker: CBFD2F DataHandler: CBFD5D _2: 0 _3: 0 _4: CBFD05 'ClientGarrison' Checker: CC1461 Connection Checker: CC1501 DataHandler: CC155D _2: 0 _3: 0 _4: CC14AB Код:
char __cdecl sub_5FF895(int a1, int a2, int a3, int a4, int a5) { int v5; // eax@1 int v6; // ecx@3 int v7; // ecx@13 int v8; // ecx@16 int v9; // eax@18 char result; // al@22 v5 = a2 - 1; if ( (((_WORD)a2 - 1) & 0x1F54) != 4608 && (v5 & 0x1DDC) != 208 && (v6 = v5 & 0xDDC, v6 != 256) && v6 != 2304 && (v5 & 0x5D4) != 384 && (v5 & 0x5D6) != 272 && (v5 & 0x76C) != 832 && (v5 & 0x5F4) != 480 && (v5 & 0x15D4) != 4 && (v5 & 0x15C4) != 260 && (v5 & 0x15BE) != 5256 && (v5 & 0x174E) != 1288 && (v7 = v5 & 0x74E, v7 != 1292) && v7 != 1294 && (v5 & 0x74A) != 1800 && (v8 = v5 & 0xFCE, v8 != 1352) && v8 != 1480 && (v9 = v5 & 0xDCE, v9 != 1354) && v9 != 1482 || (unsigned __int8)sub_5FA1D7(a2) && sub_653578((void *)a1, a3) != 1 ) { result = 0; } else { NETEVENTQUEUE__AddEvent_2(a1, 23, a3, a4, a5); result = 1; } return result; } Код:
char __thiscall NetClient__ProcessMessage(void *this, int a2, int a3, int a4, int a5) { char result; // al@1 int v6; // esi@1 void *v7; // edi@1 ++dword_10B8FC4; v6 = a4; v7 = this; CDataStore__GetInt32(&a4); result = sub_625285(v7, a2, a3, a4, v6); if ( !result ) result = (*(int (__thiscall **)(_DWORD))(*(_DWORD *)v6 + 24))(v6); return result; } при желании для этого всего можно тоже сделать OpcodeTools |
27.11.2014, 08:34 | #47 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
спасибо. Реально как нибудь написать тулзу которая достанет нужну инфу в формате типа: ипод - sub_xxxx
|
27.11.2014, 13:34 | #49 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
ясно. Но что то не могу найти OneMessageReady.... по си дампу надо искать? И можете показать на каком нибудь опкоде. пример поиска
|
28.11.2014, 01:57 | #51 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
|
29.11.2014, 01:07 | #53 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
эм, по си дампу не нашёл ни одного GetInt32, CDataStore О_о как найти CMSG ?Оо
|
29.11.2014, 07:38 | #54 | |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Это вручную переименованные функции, для удобного восприятия.
CDataStore - это структура (воссозданная вручную) : Код:
typedef struct { void* vTable; BYTE* buffer; DWORD base; DWORD alloc; DWORD size; DWORD read; } CDataStore; Цитата:
|
|
Пользователь сказал cпасибо: | Dubstep (29.11.2014) |
29.11.2014, 13:48 | #55 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
Как я понял это так, есть DataHandler: 5F90B3, по нему ищу sub_5F90B3, нашёл. там получается большая функция с кучей кейзов, среди них получается есть нужный мне саб, который обрабатывает опкод?
Ну вот ещё вопросы: 1. Как из этих сабов найти нужный 2. И где взять 5F90B3, как я понимаю на каждую группу он свой. вот где взять список этот с адресами Спасибо |
29.11.2014, 14:08 | #56 | ||
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
Цитата:
Цитата:
|
||
29.11.2014, 19:36 | #57 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
что то я всё равно не могу понять.... Покажите пожалуйста на каком нибудь примере как найти, например SMSG_TRAINER_LIST 0x0BA9
кстати, вот пытаюсь найти CMSG_ATTACKSWING = 0x1E9B(7835), ctrl + f по дампу ", 7835)" Код:
//----- (01412016) -------------------------------------------------------- int __thiscall sub_1412016(void *this, int a2) { void *v2; // esi@1 v2 = this; sub_122FC66(a2, 7835); return (*(int (__thiscall **)(_DWORD, _DWORD))(*(_DWORD *)v2 + 4))(v2, a2); } Кстати ещё вопрос, раньше делал си дамп и там уже были созданы CDataStore структуры, а тут вообще пусто... всё надо самому дописывать |
29.11.2014, 21:49 | #58 | |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Цитата:
|
|
01.12.2014, 05:53 | #59 |
Новичок
Регистрация: 29.08.2014
Сообщений: 29
Сказал(а) спасибо: 4
Поблагодарили 0 раз(а) в 0 сообщениях
|
как найти читалку клиента на пакеты типа варденовских, апдейт обджекта и подобных им ( там где просто putData ) и всё, а само читалки нету... всю голову уже сломал
|
01.12.2014, 16:28 | #60 |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
|
04.12.2014, 00:29 | #61 |
Новичок
Регистрация: 29.08.2014
Сообщений: 29
Сказал(а) спасибо: 4
Поблагодарили 0 раз(а) в 0 сообщениях
|
я про пакеты типа
``` { int v2; // ebx@1 void *v3; // esi@1 int v4; // edi@1 int v5; // eax@1 int v6; // eax@1 int v8; // [sp+Ch] [bp-8h]@1 __int16 v9; // [sp+10h] [bp-4h]@1 v2 = a2; v3 = this; LOBYTE(a2) = 0; v4 = (int)((char *)this + 20); v8 = v2; v9 = 0; v5 = CDataStore::Strlen((int)((char *)this + 20)); CDataStore::Write6Bits((int)&v8, v5, a2); CDataStore::FlushBits((int)&v8); CDataStore::PutInt32(v2, *((_DWORD *)v3 + 4)); v6 = CDataStore::Strlen(v4); return CDataStore::PutData(v2, v4, v6); } ``` тут висит PutData - как найти функцию, которая это читает? Последний раз редактировалось NeatElves; 04.12.2014 в 10:01. |
07.12.2014, 05:37 | #62 | |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
Цитата:
|
|
31.07.2015, 12:37 | #63 |
Новичок
Регистрация: 29.08.2014
Сообщений: 29
Сказал(а) спасибо: 4
Поблагодарили 0 раз(а) в 0 сообщениях
|
|
31.07.2015, 14:43 | #64 |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
они все в одном месте... в огромном джамптейбле в функции, которая обрабатывает Client опкоды
|
06.08.2015, 19:57 | #65 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
Доброго всем времени суток какова сейчас(WoD) структура пакета SMSG_WARDEN_DATA?
Последний раз редактировалось Dubstep; 07.08.2015 в 02:41. |
06.08.2015, 23:56 | #66 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
|
07.08.2015, 02:41 | #67 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
|
07.08.2015, 10:44 | #68 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Ой, там все очень ...:
build 20338 Код:
int __thiscall sub_60F77E(int this, int a2) { int v2; // esi@1 v2 = this; CDataStore::ReadInt32(a2, *(_DWORD *)(this + 32)); // data length return sub_410B02(a2, *(_DWORD *)(v2 + 20), *(_DWORD *)(v2 + 32)); } |
07.08.2015, 13:27 | #69 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
спасибо, отличия не знает от лк или каты какой?
|
07.08.2015, 14:33 | #71 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
Круто, PutData =\
Да структура, типы проверок, да бы запарсить это дело Последний раз редактировалось Dubstep; 07.08.2015 в 18:58. |
13.08.2015, 04:27 | #72 |
Новичок
Регистрация: 29.08.2014
Сообщений: 29
Сказал(а) спасибо: 4
Поблагодарили 0 раз(а) в 0 сообщениях
|
вооот.... я всё имел ввиду - как найти читалку к данным из PutData ?
|
15.08.2015, 16:45 | #73 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
|
15.08.2015, 17:00 | #74 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
я например не понял вопрос. что за читалка к данным из PutData?
|
15.08.2015, 22:18 | #75 |
MaNGOS Dev
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
|
Экстрасенс мод он
он имеет в виду как найти код, который генерит дату, которая потом суется putdata в пакет Экстрасенс мод офф Отвечу - все очень просто! открываем ида, и начинаем искать этот код. Отправная точка - адрес данных, которые суются в putdata |
16.08.2015, 14:22 | #76 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
ну это очевидно код, который в каждом опкоде свой, не? на передающей стороне это билдер какой то, на принимающей парсер структур, не?
|
19.08.2015, 17:59 | #77 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
RomanRom2, спасибо, я думаю тут все понимают как это работает.
Но вот подсказать как правильно по ида бегать, было бы хорошо, еще было бы лучше на примере вова. |
20.08.2015, 00:36 | #78 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
ну как как... в общем виде если, то я бегаю примерно так:
сначала ищу по стрингу вообще какое либо место, где есть мое искомое. нахожу какую то функцию, где оно используется. далее смотрю список откуда эта функция вызывается. бегаю там. по ходу исправляю названия переменных, структур или завожу новые - ида это неплохо умеет делать, самостоятельно детектить. иногда наоборот ошибается. все это исправляю. названия полей в структуре конечно получаются в стиле иды, но если ты знаешь что ищешь, то это не вызывает проблем. на примере вова не подскажу к сожалению, но принципы имхо те же. по моему в инете так много готовых ида баз каких хочешь версий и настолько разобранных и чуть ли не компилируемых, что это уже тоже не должно вызывать проблем. TOMRUS их тут выкладывал дофига. |
21.08.2015, 15:35 | #79 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
Допустим, я от функции sub_60F77E, в ней лежит PutData, теоретически я могу просмотреть полное древо вызова ее?
ps TOM_RUS уже к сожалению свои базы не выкладывает ( |
21.11.2015, 18:37 | #80 |
Пользователь
Регистрация: 22.06.2013
Сообщений: 71
Сказал(а) спасибо: 22
Поблагодарили 0 раз(а) в 0 сообщениях
|
доброго времени суток.
Такой вопрос есть функция JAMClientDispatch в ней дикий кейз http://pastebin.com/DDTYQyME (622) Как я понимаю туда приходит опкод, мы его магически преобразуем до v8 далее v8 пускаем через ифы и получаем нужный хэндлер? JAM все smsg? ps. Есть у кого нормальный IDA ? Текущий крашится при попытке диззамблить. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
пакеты от клиента к серверу | 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 |