Ru-MaNGOS

Вернуться   Ru-MaNGOS > Документация > Прочая документация

Важная информация

Прочая документация Помощь, книги, инструкции, описания

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.03.2010, 16:14   #1
DeusModus
Администратор
 
Аватар для DeusModus
 
Регистрация: 07.03.2010
Адрес: Питер.
Сообщений: 69
Сказал(а) спасибо: 66
Поблагодарили 102 раз(а) в 15 сообщениях
Записей в дневнике: 12
DeusModus отключил(а) отображение уровня репутации
Хорошо Разбор пакетов WoW

Разбор структуры пакетов из wow.exe это просто!

Нужно:
1. Интуиция.
2. Знание "СИ".
3. IDA+HexRays.
4. Терпение.

Качаем IDA+HexRays.
нацеливаем IDA на wow.exe
декомпилируем, потом сохраняем всё в .c файл с помощью HexRyas

ищем в файле строчку типа
Код:
(461, (int)
находим её примерно в этом месте
Код:
  sub_5F9870(459, (int)sub_401220, 0);
  sub_5F9870(461, (int)sub_401330, 0);
итак
Код:
sub_5F9870() это что то типа OpcodeHandler()
для удобства переименовываем
Код:
sub_5F9870->OpcodeHandler
получаем
Код:
  OpcodeHandler(459, (int)sub_401220, 0);
  OpcodeHandler(461, (int)sub_401330, 0);
sub_401220() это функция обработки пакета под номером 459(SMSG_NOTIFICATION)
ищём по коду эту функцию sub_401220().
......
находим что то типа
Код:
//----- (00401220) --------------------------------------------------------
signed int __usercall sub_401220<eax>(__int64 a1<edi:ebp>, int a2, int a3, int a4, int a5)
{
....................

  v5 = (int)&v9;
  v10 = 1;
  v11 = 0;
  sub_422B90(a5, (int)&v9, 0x1000u);
  if ( !sub_6A6BF0(&v9, "DEBUGACTION: ", 0xDu) )
    v5 = (int)&v12;
  if ( *(_BYTE *)v5 == 126 )
sub_422B90() это функция для чтения строки(СИ строки с нулём на конце) из опкода.
переименовываем её в ReadString()

находим в начале файла.
int __thiscall ReadString(int this, int a2, unsigned int a3);


и переименовываем все рядом стоящими функции типа так...
Код:
int __thiscall ReadByte(int this, int a2);
int __thiscall ReadInt8(int this, int a2);
int __thiscall ReadInt16(int this, int a2);
int __thiscall ReadInt32(int this, int a2);
int __thiscall ReadInt64(int this, int a2);
int __thiscall ReadFloat(int this, int a2);
>int __thiscall ReadString(int this, int a2, unsigned int a3);
int __thiscall ReadString2(int this, int a2, int a3);
int __thiscall callReadString2(int this, int a2, int a3);
int __thiscall ReadPascalString(int this, int a2, int a3);

теперь мы знаем какие функции какой тип данных считывают из пакета


ИТАК. теперь мы хотим разобрать структуру какого либо SMSG пакета.
Обратите внимание, что CMSG пакеты разбираются по другому и пока что я это описывать не буду.
И ещё, некоторые пакеты SMSG которые есть в Opcodes.h(Мангос) их нету в wow.exe
это связанно с тем что эти пакеты только для GM клиента и в обычном клиенте их просто нет

Так вот... к примеру мы хотим узнать что за структура у пакета
SMSG_LOOT_LIST = 0x3F9,
переводим 0x3F9 в десятичное число и ищём по нашему коду.
OpcodeHandler(1017, (int)

нашли к примеру
OpcodeHandler(1017, (int)sub_65E100, 0);

переходим к sub_65E100

Код:
//----- (0065E100) --------------------------------------------------------
signed int __cdecl sub_65E100(int a1, int a2, int a3, int a4)
{
  int v4; // eax@1
  int v5; // esi@1
  __int64 v7; // [sp+4h] [bp-8h]@1

  v5 = a4;
  ReadInt64(a4, (int)&v7);
  v4 = sub_46DB20(v7, 8);
  if ( v4 )
    sub_65D6D0(v4, v5);
  return 1;
}
Видим что считывается только ReadInt64() int64, скорее всего этого GUID чего либо.
всё, структуру опкода мы знаем

все адреса приведённые здесь sub_65E100, sub_401220 и т.д. меняются с каждой версией клиента,
так что нужно полагаться на интуицию



и ещё... клиент бывает считывает Пакованный гуид из пакета...
функция считывания выглядит примерно так

Код:
//----- (006A5870) --------------------------------------------------------
int __cdecl sub_6A5870(int a1, int a2)
{
  int v2; // ebx@1
  unsigned int v3; // edi@1
  int v4; // esi@1
  int v6; // ecx@1
  __int64 v7; // qax@3
  unsigned __int8 v8; // [sp+Fh] [bp-1h]@3

  v6 = a1;
  v4 = a2;
  v2 = 0;
  *(_DWORD *)a2 = 0;
  *(_DWORD *)(a2 + 4) = 0;
  ReadInt8(v6, (int)((char *)&a2 + 3));
  v3 = 0;
  do
  {
    if ( (unsigned __int8)(1 << v2) & BYTE3(a2) )
    {
      ReadInt8(a1, (int)&v8);
      v7 = v8 << (char)v3;
      *(_DWORD *)v4 |= v7;
      *(_DWORD *)(v4 + 4) |= *((_DWORD *)&v7 + 1);
    }
    v3 += 8;
    ++v2;
  }
  while ( v3 < 0x40 );
  return a1;
}
можно найти быстро её если искать строку
ReadInt8(v6, (int)((char *)&a2 + 3));
но!!!!!! строка не уникальна и в других версиях клиента может меняться...


Автор: Дерека.
DeusModus вне форума   Ответить с цитированием
22 пользователя(ей) сказали cпасибо:
Amaru (25.06.2012), Archon64 (12.01.2011), CruncH (08.03.2010), Dereka (29.04.2011), fedr (17.07.2012), Feel the Power (07.03.2010), Gerald (07.03.2010), Hantet (26.05.2010), lordinpvp (08.03.2010), Lurker (28.04.2011), Mayss (08.03.2010), Shadez (28.04.2011), sven (01.04.2010)
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разбор кода Спелов partizanes Прочая документация 7 24.01.2012 15:29
шифрование пакетов в 3.3.2 84ivan Копаем клиент 8 05.10.2010 19:10
Шифрование пакетов в 11685 Konctantin Корзина 2 27.03.2010 12:34


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


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot