Тема: creaturecache.wdb
Показать сообщение отдельно
Старый 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 вне форума   Ответить с цитированием