char fwrite[0] = "\xffffffdc\xffffffd3"; char fclose[0] = "\xffffff94\xffffffd3"; char fread[0] = "\xffffffbc\xffffffd3"; char _assert[0] = "0\xffffffd3"; char printf[0] = ""; char fseek[0] = "\xffffffcc\xffffffd3"; char ftell[0] = "\xffffffd4\xffffffd3"; char strcmp[0] = " \xffffffd4"; char exit[0] = "\xffffff8c\xffffffd3"; char fprintf[0] = "\xffffffb0\xffffffd3"; char _iob[0] = "H\xffffffd3"; char _vsnprintf[0] = "h\xffffffd3"; char fopen[0] = "\xffffffa8\xffffffd3"; char free[0] = "\xffffffc4\xffffffd3"; char puts[0] = "\f\xffffffd4"; int proc2(int param2, int param4, int param3, int param4, int param5, int param6); void proc3(int param1, int param3); void proc5(int param1, int param2, int param4); void proc6(int param1); void proc7(int param1, int param2); int proc9(int param1, int param2, int param3, int param4); int proc10(int param1); // address: 0x4012e0 int main(int argc, char **argv, char **envp) { char local0; // m[r28 - 102]{59} char local1; // m[r28 - 101]{83} int local10; // %pc{131} int local12; // %pc{112} int local14; // r26{190} int local15; // r28{39} int local16; // r29{227} int local17; // r29{102} int local18; // r27{102} int local19; // r24{118} int local2; // r28{226} int local20; // r31{102} int local21; // r30{102} int local22; // r24{78} int local23; // r24{51} int local24; // local7{211} int local25; // local2{226} int local26; // local16{227} char local28; // r10 int local29; // r24 int local3; // r28{158} int local30; // r25 int local31; // r26 int local32; // r27 int local33; // r28 int local34; // r29 int local35; // r30 int local36; // r31 int local4; // r28{218} int local5; // r28{102} int local7; // %pc{211} int local8; // %pc{140} *(int*)(local33 - 4) = local34; local34 = local33 - 4; *(int*)(local33 - 8) = local36; *(int*)(local33 - 12) = local35; *(int*)(local33 - 16) = local32; *(int*)(local33 - 72) = 0x402060; *(int*)(local33 - 68) = 0x4058c4; *(int*)(local33 - 64) = local33 - 28; *(int*)(local33 - 60) = 0x401433; *(int*)(local33 - 56) = local33 - 140; *(int*)(local33 - 140) = local33 - 96; local26 = local34; local26 = local34; if (argc > 1) { *(char*)(local33 - 101) = 0; *(char*)(local33 - 102) = 0; *(char*)(local33 - 103) = 0; local31 = 1; local28 = 1; if (1 >= argc) { L9: local29 = *(int*)(argv + 4); *(int*)(local33 - 136) = local29; *(int*)(local33 - 140) = local33 - 44; *(int*)(local33 - 92) = -1; local21 = proc2(local33 - 44, local29, local32, local33 - 4, local35, local36); /* Warning: also results in local30, local18, local5, local17, local20 */ local26 = local17; if (*(int*)(local17 - 97) == 0) { if (*(int*)(local17 - 98) == 0) { *(int*)local5 = local17 - 40; *(int*)(local17 - 88) = 1; proc7(local17 - 40, ZF); local24 = local8; } else { local19 = *(unsigned char*)(local17 - 99); local29 = *(int*)(*(int*)(local17 + 12) + local19 * 4); *(int*)(local5 + 4) = local29; *(int*)local5 = local17 - 40; *(int*)(local17 - 88) = 1; proc5(local29, local17 - 40, ZF); local24 = local10; } } else { *(int*)local5 = local17 - 40; *(int*)(local17 - 88) = 1; proc3(local17 - 40, ZF); local24 = local12; } local7 = local24; *(int*)(local17 - 88) = 1; *(int*)local5 = local17 - 40; if (*(int*)(local17 - 36) != 0) { *(int*)local5 = *(int*)(local17 - 36); *(int*)(local5 - 4) = local7; proc6(*(int*)(local17 - 36)); } local4 = local5; *(int*)(local17 - 96) = 1; local25 = local4; } else { do { local23 = *(int*)(argv + local31 * 4); if (*(int*)local23 == 45) { if (*(int*)(local23 + 1) != 111) { local22 = *(int*)(argv + local31 * 4); if (*(int*)(local22 + 1) == 120) { local1 = 1; goto L10; } goto L10; } local0 = 1; *(char*)(local33 - 103) = local28 + 1; if ((local28 + 1) >= argc) { *(int*)(local33 - 140) = 0x407094; puts("you have to add a filename to option -o\nlike: unpackkyra A_E.PAK -o ALGAE.CPS"); local25 = local3; *(int*)(local33 - 100) = 0; goto L0; } local31++; goto L10; } L10: local14 = local31; local31 = local14 + 1; local28 = (unsigned char) local14 + 1; } while (local14 + 1 < argc); goto L9; } } else { local29 = *argv; *(int*)(local33 - 136) = local29; *(int*)(local33 - 140) = 0x407000; *(int*)(local33 - 92) = -1; printf("Use:\n%s filename [OPTIONS]\nHere are the options, default is listing files to stdout\n-o xxx Extract only file 'xxx'\n-x Extract all files\n", local29); local25 = local15; *(int*)(local33 - 100) = 0; } L0: local2 = local25; local16 = local26; *(int*)local2 = local16 - 92; return *(int*)(local16 - 96); } // address: 0x401530 int proc2(int param2, int param4, int param3, int param4, int param5, int param6) { int local1; // r24{33} int local10; // %pc{16} int local11; // local5{79} int local12; // %pc{81} int local13; // %pc{86} void *local14; // r24 int local15; // r25 int local17; // r28 int local4; // %pc{38} int local5; // r28{79} int local8; // r28{27} int local9; // r28{17} *(int*)(local17 - 4) = param4; param4 = local17 - 4; *(int*)(local17 - 16) = param3; *(int*)(local17 - 12) = param5; *(int*)(local17 - 8) = param6; *(int*)(local17 - 40) = 0x4070e2; *(int*)(local17 - 44) = param4; local14 = fopen(param4, "rb"); local11 = local9; local12 = local10; param3 = local14; if (local14 == NULL) { *(int*)(local17 - 40) = param4; *(int*)(local17 - 44) = 0x4070e5; local14 = proc9(0x4070e5, local14, local17 - 4, *(int*)(_iob + 64)); /* Warning: also results in param3, local8, param4 */ local11 = local8; } local5 = local11; *(int*)param2 = 1; *(int*)local5 = local14; local1 = proc10(local14); *(int*)(param2 + 8) = local1; *(int*)local5 = local1; local14 = malloc(local1); local13 = local4; *(int*)(param2 + 4) = local14; if (local14 == NULL) { *(int*)local5 = 0x40710e; _assert(0x40710e); } *(int*)(local5 + 12) = param3; *(int*)local5 = local14; fread(local1, 1, param3, local14); *(int*)local5 = param3; fclose(param3); return *(int*)(param4 - 8); /* WARNING: Also returning: local15, *(int*)(param4 - 12), *(int*)param4, *(int*)(param4 - 4) */ } // address: 0x4017b0 void proc3(int param1, int param3) { int local10; // m[r28 - 24] int local14; // r24{128} int local15; // %pc{109} int local17; // r30{168} int local18; // r24{78} int local19; // %pc{198} FILE *local20; // r24 int local21; // r25 int local22; // r26 int local23; // r27 int local24; // r28 int local25; // r30 local21 = *(int*)(param1 + 4); local22 = *(unsigned char*)(local21 + 3); local20 = *(unsigned char*)(local21 + 2); local22 = local22 * 0x1000000 + local20 * 0x10000; local20 = *(unsigned char*)(local21 + 1); local20 = local22 + local20 * 256 + *(unsigned char*)local21; local10 = local20; local25 = local21 + 4; for(;;) { local17 = local25; local21 = -1; do { if (local21 == 0) { goto L11; } local21 = local21 - 1; } while ( !param3); L11: if (*(int*)local17 == 0) { goto L0; } local21 = local17 + !local21 - 1; local22 = *(unsigned char*)(local21 + 4); local20 = *(unsigned char*)(local21 + 3); local22 = local22 * 0x1000000 + local20 * 0x10000; local18 = *(unsigned char*)(local21 + 2); local20 = *(unsigned char*)(local21 + 1); local23 = local22 + local18 * 256 + local20; if ((unsigned)*(int*)(param1 + 8) >= (unsigned)local23) { if (local23 == 0) { local23 = *(int*)(param1 + 8); goto L6; } } else { local23 = *(int*)(param1 + 8); } L6: local25 = local21 + 5; local20 = fopen(local17, "wb"); local19 = local15; if (local20 != NULL) { local14 = local10 + *(int*)(param1 + 4); fwrite(local14, local23 - local10, 1, local20); fclose(local20); } if (*(int*)(param1 + 8) == local23) { L0: return; } local10 = local23; } } // address: 0x401696 void proc5(int param1, int param2, int param4) { int local10; // m[r28 - 24] int local12; // r24{140} int local15; // r27{186} int local16; // r24{78} FILE *local17; // r24 int local18; // r25 int local19; // r26 int local20; // r27 int local21; // r28 int local22; // r31 local18 = *(int*)(param1 + 4); local19 = *(unsigned char*)(local18 + 3); local17 = *(unsigned char*)(local18 + 2); local19 = local19 * 0x1000000 + local17 * 0x10000; local17 = *(unsigned char*)(local18 + 1); local17 = local19 + local17 * 256 + *(unsigned char*)local18; local10 = local17; local20 = local18 + 4; for(;;) { local15 = local20; local22 = local15; local18 = -1; do { if (local18 == 0) { goto L14; } local22++; local18 = local18 - 1; } while ( !param4); L14: if (*(int*)local15 == 0) { L1: printf("File '%s' not found in this pakfile\n", param2); goto L0; } local18 = local15 + !local18 - 1; local19 = *(unsigned char*)(local18 + 4); local17 = *(unsigned char*)(local18 + 3); local19 = local19 * 0x1000000 + local17 * 0x10000; local16 = *(unsigned char*)(local18 + 2); local17 = *(unsigned char*)(local18 + 1); local22 = local19 + local16 * 256 + local17; if ((unsigned)*(int*)(param1 + 8) >= (unsigned)local22) { if (local22 == 0) { local22 = *(int*)(param1 + 8); goto L9; } } else { local22 = *(int*)(param1 + 8); } L9: local20 = local18 + 5; local17 = strcmp(local15, param2); if (local17 == NULL) { break; } if (*(int*)(param1 + 8) == local22) { goto L1; } local10 = local22; } local17 = fopen(param2, "wb"); if (local17 != NULL) { local12 = local10 + *(int*)(param1 + 4); fwrite(local12, local22 - local10, 1, local17); fclose(local17); } L0: return; } // address: 0x4027e0 void proc6(int param1) { int local6; // r28 if (param1 != 0) { free(param1); } return; } // address: 0x4015d8 void proc7(int param1, int param2) { int local11; // r30{146} int local12; // r24{87} int local13; // r24 int local14; // r25 int local15; // r26 int local16; // r27 int local17; // r28 int local18; // r30 int local9; // m[r28 - 24] local14 = *(int*)(param1 + 4); local15 = *(unsigned char*)(local14 + 3); local13 = *(unsigned char*)(local14 + 2); local15 = local15 * 0x1000000 + local13 * 0x10000; local13 = *(unsigned char*)(local14 + 1); local13 = local15 + local13 * 256 + *(unsigned char*)local14; local9 = local13; local18 = local14 + 4; for(;;) { local11 = local18; local14 = -1; do { if (local14 == 0) { goto L8; } local14 = local14 - 1; } while ( !param2); L8: if (*(int*)local11 == 0) { break; } local14 = local11 + !local14 - 1; local15 = *(unsigned char*)(local14 + 4); local13 = *(unsigned char*)(local14 + 3); local15 = local15 * 0x1000000 + local13 * 0x10000; local13 = *(unsigned char*)(local14 + 2); local12 = *(unsigned char*)(local14 + 1); local16 = local15 + local13 * 256 + local12; if ((unsigned)*(int*)(param1 + 8) >= (unsigned)local16) { if (local16 == 0) { local16 = *(int*)(param1 + 8); goto L3; } } else { local16 = *(int*)(param1 + 8); } L3: local18 = local14 + 5; printf("Filename: %s size: %d\n", local11, local16 - local9); if (*(int*)(param1 + 8) == local16) { break; } local9 = local16; } return; } // address: 0x4018a0 int proc9(int param1, int param2, int param3, int param4) { int local0; // m[r28 - 0x41c]{31} char *local4; // r24 char *local7; // r28 *(int*)(local7 - 4) = param3; *(int*)(local7 - 8) = param2; *(int*)(local7 - 1040) = local7 + 8; *(int*)(local7 - 1044) = param1; *(int*)(local7 - 1048) = 1024; *(char **)(local7 - 1052) = local7 - 1036; _vsnprintf(local7 - 1036, 1024, param1, local7 + 8); *(int*)(local7 - 1044) = local7 - 1036; *(int*)(local7 - 1048) = 0x407160; *(int*)(local7 - 1052) = _iob + 64; fprintf(_iob + 64, "ERROR: %s!\n", local7 - 1036); local0 = 1; exit(1); return local4; /* WARNING: Also returning: local7 - 1036, local7 - 4 */ } // address: 0x401bc1 int proc10(int param1) { int local13; // r24 int local16; // r28 int local9; // r24{15} local9 = ftell(param1); fseek(param1, 0, 2); local13 = ftell(param1); fseek(param1, local9, 0); return local13; }