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


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


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