Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Опкоды, Формулы, Клиент > Копаем клиент

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

Копаем клиент Копаем клиент

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.12.2013, 10:57   #1
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию creaturecache.wdb

Разбираю структуру "creaturecache.wdb", вот исходная функция:
Код:
bool __thiscall sub_75CE08(void *this, int a2, unsigned int a3)
{
    int v3; // esi@1
    unsigned int v5; // eax@5
    unsigned int v6; // eax@6
    int v7; // ecx@6
    unsigned int v8; // eax@7
    int v9; // ecx@7
    int v10; // ecx@9
    int v11; // edi@11
    int v12; // ecx@15
    bool v13; // zf@15
    int v14; // eax@16
    int v15; // eax@16
    int v16; // ecx@17
    int v17; // ecx@19
    __int128 v18; // xmm0@20
    int v19; // eax@21
    char v20; // ST08_1@21
    unsigned int v21; // eax@25
    int v22; // eax@28
    int v23; // [sp+Ch] [bp-18h]@1
    __int16 v24; // [sp+10h] [bp-14h]@1
    int v25; // [sp+14h] [bp-10h]@7
    int v26; // [sp+18h] [bp-Ch]@6
    int v27; // [sp+1Ch] [bp-8h]@1
    int i; // [sp+20h] [bp-4h]@5

    v23 = a2;
    LOBYTE(v27) = 0;
    v3 = (int)this;
    v24 = 2048;
    *(_DWORD *)(v3 + 4) ^= (unsigned int)&unk_FFFFFF & (CDataStore__Read11Bits((int)&v23, v27) ^ *(_DWORD *)(v3 + 4));
    if ( ((unsigned int)&unk_FFFFFF & *(_DWORD *)(v3 + 4)) <= 0x400 )
    {
        LOBYTE(v27) = 0;
        *(_DWORD *)(v3 + 12) ^= (unsigned int)&unk_FFFFFF & (CDataStore__Read11Bits((int)&v23, v27) ^ *(_DWORD *)(v3 + 12));
        if ( ((unsigned int)&unk_FFFFFF & *(_DWORD *)(v3 + 12)) <= 0x400 )
        {
            LOBYTE(v27) = 0;
            *(_DWORD *)(v3 + 20) ^= (unsigned int)&unk_FFFFFF & (CDataStore__Read6Bits((int)&v23, v27) ^ *(_DWORD *)(v3 + 20));
            if ( ((unsigned int)&unk_FFFFFF & *(_DWORD *)(v3 + 20)) <= 0x20 )
            {
                v5 = CDataStore__ReadBit((int)&v23);
                v27 = 0;
                *(_BYTE *)(v3 + 44) = v5 != 0;
                i = v3 + 144;
                while ( 1 )
                {
                    LOBYTE(v26) = 0;
                    v6 = CDataStore__Read11Bits((int)&v23, v26);
                    v7 = i;
                    *(_DWORD *)(v7 - 32) ^= (unsigned int)&unk_FFFFFF & (v6 ^ *(_DWORD *)(i - 32));
                    if ( ((unsigned int)&unk_FFFFFF & *(_DWORD *)(v7 - 32)) > 0x401 )
                        break;
                    LOBYTE(v25) = 0;
                    v8 = CDataStore__Read11Bits((int)&v23, v25);
                    v9 = i;
                    *(_DWORD *)v9 ^= (unsigned int)&unk_FFFFFF & (v8 ^ *(_DWORD *)i);
                    if ( ((unsigned int)&unk_FFFFFF & *(_DWORD *)v9) > 0x401 )
                        break;
                    ++v27;
                    i = v9 + 8;
                    if ( (unsigned int)v27 >= 4 )
                    {
                        v27 = 0;
                        v10 = v3 + 108;
                        for ( i = v3 + 108; ; v10 = i )
                        {
                            v11 = a2;
                            if ( !sub_A45DED(v10, a2, (unsigned int)&unk_FFFFFF & *(_DWORD *)(v10 + 4), a3) )// read string ???
                                break;
                            if ( !sub_A45DED(i + 32, v11, (unsigned int)&unk_FFFFFF & *(_DWORD *)(i + 36), a3) )
                                break;
                            ++v27;
                            i += 8;
                            if ( (unsigned int)v27 >= 4 )
                            {
                                a2 = v3 + 76;
                                i = 2;
                                do
                                {
                                    v27 = 0;
                                    CDataStore__GetInt32(v11, (int)&v27);
                                    v12 = a2;
                                    a2 += 4;
                                    v13 = i-- == 1;
                                    *(_DWORD *)v12 = v27;
                                }
                                while ( !v13 );
                                a2 = 0;
                                CDataStore__GetInt32(v11, (int)&a2);
                                v14 = a2;
                                a2 = 0;
                                *(_DWORD *)(v3 + 24) = v14;
                                CDataStore__GetInt32(v11, (int)&a2);
                                v15 = a2;
                                a2 = 0;
                                *(_DWORD *)(v3 + 28) = v15;
                                CDataStore__GetInt32(v11, (int)&a2);
                                *(_DWORD *)(v3 + 32) = a2;
                                a2 = v3 + 84;
                                i = 2;
                                do
                                {
                                    v27 = 0;
                                    CDataStore__GetInt32(v11, (int)&v27);
                                    v16 = a2;
                                    a2 += 4;
                                    v13 = i-- == 1;
                                    *(_DWORD *)v16 = v27;
                                }
                                while ( !v13 );
                                a2 = v3 + 92;
                                i = 4;
                                do
                                {
                                    v27 = 0;
                                    CDataStore__GetInt32(v11, (int)&v27);
                                    v17 = a2;
                                    a2 += 4;
                                    v13 = i-- == 1;
                                    *(_DWORD *)v17 = v27;
                                }
                                while ( !v13 );
                                a2 = 0;
                                CDataStore__GetFloat(v11, (int)&a2);
                                *(_DWORD *)(v3 + 36) = a2;
                                a2 = 0;
                                CDataStore__GetFloat(v11, (int)&a2);
                                v18 = (unsigned int)a2;
                                a2 = 0;
                                *(_DWORD *)(v3 + 40) = v18;
                                CDataStore__GetInt32(v11, (int)&a2);
                                if ( *(_DWORD *)(v11 + 16) - *(_DWORD *)(v11 + 20) < (unsigned int)(4 * a2)
                                  || (CDataStore__Write22Bits_0(v3 + 48, a2),
                                      a2 = 0,
                                      CDataStore__GetInt32(v11, (int)&a2),
                                      v19 = a2,
                                      a2 = 0,
                                      *(_DWORD *)(v3 + 68) = v19,
                                      CDataStore__GetInt32(v11, (int)&a2),
                                      v20 = a3,
                                      *(_DWORD *)(v3 + 72) = a2,
                                      !sub_A45DED(v3, v11, (unsigned int)&unk_FFFFFF & *(_DWORD *)(v3 + 4), v20))
                                  || !sub_A45DED(v3 + 8, v11, (unsigned int)&unk_FFFFFF & *(_DWORD *)(v3 + 12), a3)
                                  || !sub_A45DED(v3 + 16, v11, (unsigned int)&unk_FFFFFF & *(_DWORD *)(v3 + 20), a3) )
                                    return 0;
                                a3 = 0;
                                while ( 1 )
                                {
                                    v21 = *(_DWORD *)(v3 + 64);
                                    if ( v21 == -1 )
                                        v21 = *(_DWORD *)(v3 + 48);
                                    if ( a3 >= v21 )
                                        break;
                                    a2 = 0;
                                    CDataStore__GetInt32(v11, (int)&a2);
                                    v22 = sub_7DA455(v3 + 48, a3++);
                                    *(_DWORD *)v22 = a2;
                                }
                                return (*(int (__thiscall **)(int))(*(_DWORD *)v11 + 20))(v11) && sub_75BF7E(v3);
                            }
                        }
                        return 0;
                    }
                }
            }
        }
    }
    return 0;
}
получилось следующее:
Код:
int()
xor_int(11) //[1]
xor_int(11) //[2]
xor_int(6)  //[3]

bit()

while(4)
	xor_int(11) // [1,i]
	xor_int(11) // [2,i]

while(4)
	read_unk_str(/*[1,i]*/)
	read_unk_str(/*[2,i]*/)

int()
int()
int()
int()
int()
int()
int()
int()
int()
int()
int()
float()
float()
int()
int()
int()
read_unk_str(/*[1]*/)
read_unk_str(/*[2]*/)
read_unk_str(/*[3]*/)

while(???)
	int()
Собственно завис пока на функции read_unk_str (sub_A45DED)
скорее всего эта функция считывает строку с размером, который ранее был прочитан и за'xor'ен, что-то в этом роде:
Код:
*(_DWORD *)(v3 + 4) ^= (unsigned int)&unk_FFFFFF & (CDataStore__Read11Bits((int)&v23, v27) ^ *(_DWORD *)(v3 + 4));
размер строки получается в виде len(str) + 1
Код:
char __thiscall sub_A45DED(int this, int a2, int a3, char a4)
{
    int v4; // edi@1
    int v5; // esi@1

    v4 = a3;
    v5 = this;
    if ( a3 )
    {
        if ( a3 == 1 )
        {
            *(_DWORD *)(this + 4) &= 0xFE000000u;
            *(_DWORD *)this = &unk_D115FF;
        }
        else
        {
            CDataStore__GetData(a2, (int)&a3, a3);
            if ( !a3 || *(_BYTE *)(v4 - 1 + a3) )
                return 0;
            if ( a4 )
            {
                *(_DWORD *)v5 = a3;
                *(_DWORD *)(v5 + 4) = *(_DWORD *)(v5 + 4) & 0xFE000000 | (unsigned int)&unk_FFFFFF & (v4 - 1);
            }
            else
            {
                sub_A45D2C((void *)v5, a3, v4 - 1);
            }
        }
    }
    return 1;
}
Собственно вопрос, что делает эта функция?
Ибо если просто считывать как строку, то поля сдвигаются и дальше идут не верные значения.
__________________
Konctantin вне форума   Ответить с цитированием
 


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

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



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


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