Разбор структуры пакетов из wow.exe это просто!
Нужно:
1. Интуиция.
2. Знание "СИ".
3. IDA+HexRays.
4. Терпение.
Качаем IDA+HexRays.
нацеливаем IDA на wow.exe
декомпилируем, потом сохраняем всё в .c файл с помощью HexRyas
ищем в файле строчку типа
находим её примерно в этом месте
Код:
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));
но!!!!!! строка не уникальна и в других версиях клиента может меняться...
Автор: Дерека.