Разбираю структуру "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;
}
Собственно вопрос, что делает эта функция?
Ибо если просто считывать как строку, то поля сдвигаются и дальше идут не верные значения.