Created
August 31, 2018 21:21
-
-
Save GoobyCorp/0f9e21c006e9d0c48ac76fd73b1dd686 to your computer and use it in GitHub Desktop.
Angry Birds 2 Index File Generator
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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