06.12.2013, 10:57 | #1 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
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() скорее всего эта функция считывает строку с размером, который ранее был прочитан и за'xor'ен, что-то в этом роде: Код:
*(_DWORD *)(v3 + 4) ^= (unsigned int)&unk_FFFFFF & (CDataStore__Read11Bits((int)&v23, v27) ^ *(_DWORD *)(v3 + 4)); Код:
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; } Ибо если просто считывать как строку, то поля сдвигаются и дальше идут не верные значения. |