Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save GoobyCorp/0f9e21c006e9d0c48ac76fd73b1dd686 to your computer and use it in GitHub Desktop.
Save GoobyCorp/0f9e21c006e9d0c48ac76fd73b1dd686 to your computer and use it in GitHub Desktop.
Angry Birds 2 Index File Generator
int __cdecl LocalClientStorageProvider__GenerateAndSaveIndexFile(int instance, char *path)
{
int AES_0; // esi
int AES_1; // esi
int ms; // esi
int bw; // edi
int v6; // ebp
int v7; // eax
int v8; // ebp
unsigned int AES_2; // eax
int v10; // eax
int v11; // eax
int AES_3; // ebp
int AES_4; // ebp
int AES_5; // ebp
int AES_6; // ebp
int AES_7; // ebp
int v17; // eax
int AES_8; // ebp
int v19; // eax
int array_0; // esi
signed int index; // ebp
char xor_val; // al
int v23; // edi
int v24; // eax
int v25; // eax
int v26; // eax
int l_433; // esi
unsigned int l_433_len; // ecx
unsigned int mod_val; // edi
int v30; // eax
int *FS_0; // esi
int FS_PTR; // ecx
unsigned int v33; // ebp
int v34; // edx
unsigned __int16 v35; // si
int FS_1; // esi
int v37; // eax
int array_1; // [esp+14h] [ebp-18h]
int output; // [esp+14h] [ebp-18h]
// private static byte[] l_433; // 0x0
// protected static string SaveDirectory; // 0x4
// private const int HeaderLength = 4; // 0x0
// private IFileSystem <FileSystem>k__BackingField; // 0x8
// private AesManaged m_aes; // 0xC
if ( !(byte_2341B8B & 1) )
{
sub_1609D44("is_generic");
byte_2341B8B = 1;
}
AES_0 = *(_DWORD *)(instance + 12);
if ( !AES_0 )
NullPointerReference();
(*(void (__cdecl **)(int, _DWORD))(*(_DWORD *)AES_0 + 372))(AES_0, *(_DWORD *)(*(_DWORD *)AES_0 + 376));// this.aes.GenerateIV();
AES_1 = *(_DWORD *)(instance + 12);
if ( !AES_1 )
NullPointerReference();
(*(void (__cdecl **)(int, _DWORD))(*(_DWORD *)AES_1 + 380))(AES_1, *(_DWORD *)(*(_DWORD *)AES_1 + 384));// this.aes.GenerateKey();
ms = sub_1645020(unk_23184AC); // MemoryStream ms = new MemoryStream();
MemoryStream___ctor(ms);
bw = sub_1645020(unk_2318474);
BinaryWriter___ctor_65775(bw, ms); // BinaryWriter bw = new BinaryWriter((Stream)ms);
v6 = unk_23180FC;
sub_15FCC36(unk_23180FC);
v7 = sub_1649CFA(v6, 2);
v8 = v7;
if ( !v7 )
NullPointerReference();
AES_2 = *(_DWORD *)(v7 + 12);
if ( !AES_2 )
{
v10 = sub_1637A1E();
Exception(v10, 0);
}
*(_BYTE *)(v8 + 16) = -85;
if ( AES_2 <= 1 )
{
v11 = sub_1637A1E();
Exception(v11, 0);
}
*(_BYTE *)(v8 + 17) = -70;
if ( !bw )
NullPointerReference();
(*(void (__cdecl **)(int, int, _DWORD))(*(_DWORD *)bw + 260))(bw, v8, *(_DWORD *)(*(_DWORD *)bw + 264));// bw.Write(new byte[2] {0xAB, 0xBA});
if ( !bw )
NullPointerReference();
(*(void (__cdecl **)(int, signed int, _DWORD))(*(_DWORD *)bw + 284))(bw, 1, *(_DWORD *)(*(_DWORD *)bw + 288));// bw.Write((short)1);
AES_3 = *(_DWORD *)(instance + 12);
if ( !AES_3 )
NullPointerReference();
AES_4 = (*(int (__cdecl **)(int, _DWORD))(*(_DWORD *)AES_3 + 252))(AES_3, *(_DWORD *)(*(_DWORD *)AES_3 + 256));
if ( !AES_4 )
NullPointerReference();
if ( !bw )
NullPointerReference();
(*(void (__cdecl **)(int, _DWORD, _DWORD))(*(_DWORD *)bw + 284))(
bw,
*(signed __int16 *)(AES_4 + 12),
*(_DWORD *)(*(_DWORD *)bw + 288)); // bw.Write((short)this.aes.IV.Length);
AES_5 = *(_DWORD *)(instance + 12);
if ( !AES_5 )
NullPointerReference();
AES_6 = (*(int (__cdecl **)(int, _DWORD))(*(_DWORD *)AES_5 + 268))(AES_5, *(_DWORD *)(*(_DWORD *)AES_5 + 272));
if ( !AES_6 )
NullPointerReference();
if ( !bw )
NullPointerReference();
(*(void (__cdecl **)(int, _DWORD, _DWORD))(*(_DWORD *)bw + 284))(
bw,
*(signed __int16 *)(AES_6 + 12),
*(_DWORD *)(*(_DWORD *)bw + 288)); // bw.Write((short)this.aes.Key.Length);
AES_7 = *(_DWORD *)(instance + 12);
if ( !AES_7 )
NullPointerReference();
v17 = (*(int (__cdecl **)(int, _DWORD))(*(_DWORD *)AES_7 + 252))(AES_7, *(_DWORD *)(*(_DWORD *)AES_7 + 256));
(*(void (__cdecl **)(int, int, _DWORD))(*(_DWORD *)bw + 260))(bw, v17, *(_DWORD *)(*(_DWORD *)bw + 264));// bw.Write(this.aes.IV);
AES_8 = *(_DWORD *)(instance + 12);
if ( !AES_8 )
NullPointerReference();
v19 = (*(int (__cdecl **)(int, _DWORD))(*(_DWORD *)AES_8 + 268))(AES_8, *(_DWORD *)(*(_DWORD *)AES_8 + 272));
(*(void (__cdecl **)(int, int, _DWORD))(*(_DWORD *)bw + 260))(bw, v19, *(_DWORD *)(*(_DWORD *)bw + 264));// bw.Write(this.aes.Key);
(*(void (__cdecl **)(int, _DWORD))(*(_DWORD *)bw + 236))(bw, *(_DWORD *)(*(_DWORD *)bw + 240));// bw.Flush();
if ( !ms )
NullPointerReference();
array_0 = (*(int (__cdecl **)(int, _DWORD))(*(_DWORD *)ms + 404))(ms, *(_DWORD *)(*(_DWORD *)ms + 408));
array_1 = array_0; // byte[] array = ms.ToArray();
for ( index = 20; ; ++index )
{
v23 = index - 16;
if ( !array_0 )
NullPointerReference();
v24 = *(_DWORD *)(array_0 + 12);
if ( v23 >= v24 )
break;
if ( v24 <= (unsigned int)v23 )
{
v25 = sub_1637A1E();
Exception(v25, 0);
}
v26 = unk_231BBB4;
if ( *(_BYTE *)(unk_231BBB4 + 178) & 1 && !*(_DWORD *)(unk_231BBB4 + 96) )
{
sub_161DF48(unk_231BBB4);
v26 = unk_231BBB4;
}
l_433 = **(_DWORD **)(v26 + 80); // l_433 - The key used to encrypt/decrypt/hash player data
if ( !l_433 )
NullPointerReference();
l_433_len = *(_DWORD *)(l_433 + 12); // l_433.Length
mod_val = (index - 20) % (signed int)l_433_len;// (index - 4) % l_433.Length
if ( l_433_len <= mod_val )
{
v30 = sub_1637A1E();
Exception(v30, 0);
}
xor_val = *(_BYTE *)(l_433 + mod_val + 16); // l_433[(index - 4) % l_433.Length]
array_0 = array_1;
*(_BYTE *)(array_0 + index) ^= xor_val; // array_0[index] ^= xor_val;
}
output = array_0;
FS_0 = *(int **)(instance + 8);
if ( !FS_0 )
NullPointerReference();
FS_PTR = *FS_0;
LOWORD(v33) = *(_WORD *)(*FS_0 + 170);
if ( (_WORD)v33 )
{
v34 = *(_DWORD *)(FS_PTR + 76);
v35 = 0;
v33 = (unsigned __int16)v33;
while ( *(_DWORD *)(v34 + 8 * v35) != unk_231DFFC )
{
if ( ++v35 >= v33 )
goto LABEL_55;
}
v37 = FS_PTR + 8 * *(_DWORD *)(v34 + 8 * v35 + 4) + 180;
FS_1 = *(_DWORD *)(instance + 8);
}
else
{
LABEL_55:
FS_1 = *(_DWORD *)(instance + 8);
v37 = sub_15FF432(*(_DWORD *)(instance + 8), unk_231DFFC, 0);
}
return (*(int (__cdecl **)(int, char *, int, _DWORD))v37)(FS_1, path, output, *(_DWORD *)(v37 + 4));// this.FS_1.WriteAllBytes(path, output);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment