int proc2(int *param1, char *param2); void proc3(void *param1, int param2); void proc5(void *param1, char param2[], int param3); void proc6(void *param1); void proc7(void *param1, int param2); int proc9(char *param1); int proc10(FILE *param1); // address: 0x4012e0 int main(int argc, char **argv, char **envp) { unsigned int dl; // r10 void *eax; // r24 int *ebp; // r29 int *ebx; // r27 unsigned int *ecx; // r25 int *edi; // r31 unsigned int edx; // r26 int *esi; // r30 void *esp; // r28 unsigned int local23; // r24{118} int local29; // %pc{211} int local30; // %pc{140} int local32; // %pc{131} int local34; // %pc{112} unsigned int local36; // r26{190} void **local37; // r28{102} int *local38; // r29{102} int *local39; // r24{78} void *local40; // r24{51} int local41; // local29{211} int *local42; // r29{227} ebp = (int *)(esp - 4); local42 = ebp; local42 = ebp; if (argc > 1) { edx = 1; dl = 1; if (1 >= argc) { L9: eax = *(argv + 4); esi = proc2((int *)(esp - 44), eax); /* Warning: also results in ecx, ebx, local37, local38, edi */ local42 = local38; if (*(local38 - 97) == 0) { if (*(local38 - 98) == 0) { *local37 = local38 - 40; *(int*)(local38 - 88) = 1; proc7(local38 - 40, ZF); local41 = local30; } else { local23 = *(unsigned char*)(local38 - 99); eax = *(*(local38 + 12) + local23 * 4); *(char **)(local37 + 4) = eax; *local37 = local38 - 40; *(int*)(local38 - 88) = 1; proc5(eax, local38 - 40, ZF); local41 = local32; } } else { *local37 = local38 - 40; *(int*)(local38 - 88) = 1; proc3(local38 - 40, ZF); local41 = local34; } local29 = local41; *(int*)(local38 - 88) = 1; *local37 = local38 - 40; if (*(local38 - 36) != 0) { *local37 = *(local38 - 36); *(int*)(local37 - 4) = local29; proc6(*(local38 - 36)); } esp = local37; *(int*)(local38 - 96) = 1; } else { do { local40 = *(argv + edx * 4); if (*local40 == 45) { if (*(local40 + 1) != 111) { local39 = *(argv + edx * 4); if (*(local39 + 1) == 120) { goto L10; } goto L10; } if ((int)(dl + 1) >= argc) { puts("you have to add a filename to option -o\nlike: unpackkyra A_E.PAK -o ALGAE.CPS"); goto L0; } edx++; goto L10; } L10: local36 = edx; edx = local36 + 1; dl = (unsigned char) local36 + 1; } while (local36 + 1 < argc); goto L9; } } else { eax = *argv; 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", eax); } L0: ebp = local42; *esp = ebp - 92; return *(ebp - 96); } // address: 0x401530 int proc2(int *param1, char *param2) { FILE *eax; // r24 int *ebp; // r29 FILE *ebx; // r27 int ecx; // r25 void *esp; // r28 union { FILE * x443; int x444; } local11; // m[ *union**r28]{93} union { FILE * x443; int x444; } local16; // m[ *union**r28]{35} int local17; // %pc{38} void *local20; // r28{27} void *local21; // r28{17} int local22; // %pc{16} union { FILE ** x405; union { int x403; FILE * x404; } * x406; int * x410; char ** x422; union { FILE * x443; int x444; } * x445; union { int x403; FILE * x404; } * x447; union { FILE * x443; int x444; } * x452; union { FILE * x443; int x444; } * x466; union { int x403; FILE * x404; } * x467; union { FILE * x443; int x444; } * x469; union { FILE * x443; int x444; } * x477; union { int x403; FILE * x404; } * x478; union { FILE * x443; int x444; } * x480; union { FILE * x443; int x444; } * x488; union { int x403; FILE * x404; } * x489; union { FILE * x443; int x444; } * x491; union { FILE * x443; int x444; } * x499; union { int x403; FILE * x404; } * x500; union { FILE * x443; int x444; } * x502; union { FILE * x443; int x444; } * x510; union { int x403; FILE * x404; } * x511; union { FILE * x443; int x444; } * x513; union { FILE * x443; int x444; } * x521; union { int x403; FILE * x404; } * x522; union { FILE * x443; int x444; } * x524; union { FILE * x443; int x444; } * x532; union { int x403; FILE * x404; } * x533; union { FILE * x443; int x444; } * x535; union { FILE * x443; int x444; } * x543; union { int x403; FILE * x404; } * x544; union { FILE * x443; int x444; } * x546; union { FILE * x443; int x444; } * x554; union { int x403; FILE * x404; } * x555; union { FILE * x443; int x444; } * x557; union { FILE * x443; int x444; } * x565; union { int x403; FILE * x404; } * x566; union { FILE * x443; int x444; } * x568; union { FILE * x443; int x444; } * x576; union { int x403; FILE * x404; } * x577; union { FILE * x443; int x444; } * x579; union { FILE * x443; int x444; } * x587; union { int x403; FILE * x404; } * x588; union { FILE * x443; int x444; } * x590; union { FILE * x443; int x444; } * x598; union { int x403; FILE * x404; } * x599; union { FILE * x443; int x444; } * x601; union { FILE * x443; int x444; } * x609; union { int x403; FILE * x404; } * x610; union { FILE * x443; int x444; } * x612; union { FILE * x443; int x444; } * x620; union { int x403; FILE * x404; } * x621; union { FILE * x443; int x444; } * x623; union { FILE * x443; int x444; } * x631; union { int x403; FILE * x404; } * x632; union { FILE * x443; int x444; } * x634; union { FILE * x443; int x444; } * x642; union { int x403; FILE * x404; } * x643; union { FILE * x443; int x444; } * x645; union { FILE * x443; int x444; } * x653; union { int x403; FILE * x404; } * x654; union { FILE * x443; int x444; } * x656; union { FILE * x443; int x444; } * x2728; union { int x403; FILE * x404; } * x2729; union { FILE * x443; int x444; } * x2733; union { FILE * x443; int x444; } * x2747; union { int x403; FILE * x404; } * x2748; union { FILE * x443; int x444; } * x2750; union { FILE * x443; int x444; } * x2758; union { int x403; FILE * x404; } * x2759; union { FILE * x443; int x444; } * x2761; union { FILE * x443; int x444; } * x2769; union { int x403; FILE * x404; } * x2770; union { FILE * x443; int x444; } * x2772; union { FILE * x443; int x444; } * x2780; union { int x403; FILE * x404; } * x2781; union { FILE * x443; int x444; } * x2783; union { FILE * x443; int x444; } * x2791; union { int x403; FILE * x404; } * x2792; union { FILE * x443; int x444; } * x2794; union { FILE * x443; int x444; } * x2802; union { int x403; FILE * x404; } * x2803; union { FILE * x443; int x444; } * x2805; union { FILE * x443; int x444; } * x2813; union { int x403; FILE * x404; } * x2814; union { FILE * x443; int x444; } * x2816; union { FILE * x443; int x444; } * x2824; union { int x403; FILE * x404; } * x2825; union { FILE * x443; int x444; } * x2827; union { FILE * x443; int x444; } * x2835; union { int x403; FILE * x404; } * x2836; union { FILE * x443; int x444; } * x2838; union { FILE * x443; int x444; } * x2846; union { int x403; FILE * x404; } * x2847; union { FILE * x443; int x444; } * x2849; union { FILE * x443; int x444; } * x2857; union { int x403; FILE * x404; } * x2858; union { FILE * x443; int x444; } * x2860; union { FILE * x443; int x444; } * x2868; union { int x403; FILE * x404; } * x2869; union { FILE * x443; int x444; } * x2871; union { FILE * x443; int x444; } * x2879; union { int x403; FILE * x404; } * x2880; union { FILE * x443; int x444; } * x2882; union { FILE * x443; int x444; } * x2890; union { int x403; FILE * x404; } * x2891; union { FILE * x443; int x444; } * x2893; union { FILE * x443; int x444; } * x2901; union { int x403; FILE * x404; } * x2902; union { FILE * x443; int x444; } * x2904; union { FILE * x443; int x444; } * x2912; union { int x403; FILE * x404; } * x2913; union { FILE * x443; int x444; } * x2915; union { FILE * x443; int x444; } * x2923; union { int x403; FILE * x404; } * x2924; union { FILE * x443; int x444; } * x2926; union { FILE * x443; int x444; } * x2934; union { int x403; FILE * x404; } * x2935; union { FILE * x443; int x444; } * x2937; union { FILE * x443; int x444; } * x2945; union { int x403; FILE * x404; } * x2946; union { FILE * x443; int x444; } * x2948; } local23; // local7{79} int local24; // %pc{81} int local25; // %pc{86} union { FILE * x443; int x444; } local26; // local11{93} union { FILE ** x405; union { int x403; FILE * x404; } * x406; int * x410; char ** x422; union { FILE * x443; int x444; } * x445; union { int x403; FILE * x404; } * x447; union { FILE * x443; int x444; } * x452; union { FILE * x443; int x444; } * x466; union { int x403; FILE * x404; } * x467; union { FILE * x443; int x444; } * x469; union { FILE * x443; int x444; } * x477; union { int x403; FILE * x404; } * x478; union { FILE * x443; int x444; } * x480; union { FILE * x443; int x444; } * x488; union { int x403; FILE * x404; } * x489; union { FILE * x443; int x444; } * x491; union { FILE * x443; int x444; } * x499; union { int x403; FILE * x404; } * x500; union { FILE * x443; int x444; } * x502; union { FILE * x443; int x444; } * x510; union { int x403; FILE * x404; } * x511; union { FILE * x443; int x444; } * x513; union { FILE * x443; int x444; } * x521; union { int x403; FILE * x404; } * x522; union { FILE * x443; int x444; } * x524; union { FILE * x443; int x444; } * x532; union { int x403; FILE * x404; } * x533; union { FILE * x443; int x444; } * x535; union { FILE * x443; int x444; } * x543; union { int x403; FILE * x404; } * x544; union { FILE * x443; int x444; } * x546; union { FILE * x443; int x444; } * x554; union { int x403; FILE * x404; } * x555; union { FILE * x443; int x444; } * x557; union { FILE * x443; int x444; } * x565; union { int x403; FILE * x404; } * x566; union { FILE * x443; int x444; } * x568; union { FILE * x443; int x444; } * x576; union { int x403; FILE * x404; } * x577; union { FILE * x443; int x444; } * x579; union { FILE * x443; int x444; } * x587; union { int x403; FILE * x404; } * x588; union { FILE * x443; int x444; } * x590; union { FILE * x443; int x444; } * x598; union { int x403; FILE * x404; } * x599; union { FILE * x443; int x444; } * x601; union { FILE * x443; int x444; } * x609; union { int x403; FILE * x404; } * x610; union { FILE * x443; int x444; } * x612; union { FILE * x443; int x444; } * x620; union { int x403; FILE * x404; } * x621; union { FILE * x443; int x444; } * x623; union { FILE * x443; int x444; } * x631; union { int x403; FILE * x404; } * x632; union { FILE * x443; int x444; } * x634; union { FILE * x443; int x444; } * x642; union { int x403; FILE * x404; } * x643; union { FILE * x443; int x444; } * x645; union { FILE * x443; int x444; } * x653; union { int x403; FILE * x404; } * x654; union { FILE * x443; int x444; } * x656; union { FILE * x443; int x444; } * x2728; union { int x403; FILE * x404; } * x2729; union { FILE * x443; int x444; } * x2733; union { FILE * x443; int x444; } * x2747; union { int x403; FILE * x404; } * x2748; union { FILE * x443; int x444; } * x2750; union { FILE * x443; int x444; } * x2758; union { int x403; FILE * x404; } * x2759; union { FILE * x443; int x444; } * x2761; union { FILE * x443; int x444; } * x2769; union { int x403; FILE * x404; } * x2770; union { FILE * x443; int x444; } * x2772; union { FILE * x443; int x444; } * x2780; union { int x403; FILE * x404; } * x2781; union { FILE * x443; int x444; } * x2783; union { FILE * x443; int x444; } * x2791; union { int x403; FILE * x404; } * x2792; union { FILE * x443; int x444; } * x2794; union { FILE * x443; int x444; } * x2802; union { int x403; FILE * x404; } * x2803; union { FILE * x443; int x444; } * x2805; union { FILE * x443; int x444; } * x2813; union { int x403; FILE * x404; } * x2814; union { FILE * x443; int x444; } * x2816; union { FILE * x443; int x444; } * x2824; union { int x403; FILE * x404; } * x2825; union { FILE * x443; int x444; } * x2827; union { FILE * x443; int x444; } * x2835; union { int x403; FILE * x404; } * x2836; union { FILE * x443; int x444; } * x2838; union { FILE * x443; int x444; } * x2846; union { int x403; FILE * x404; } * x2847; union { FILE * x443; int x444; } * x2849; union { FILE * x443; int x444; } * x2857; union { int x403; FILE * x404; } * x2858; union { FILE * x443; int x444; } * x2860; union { FILE * x443; int x444; } * x2868; union { int x403; FILE * x404; } * x2869; union { FILE * x443; int x444; } * x2871; union { FILE * x443; int x444; } * x2879; union { int x403; FILE * x404; } * x2880; union { FILE * x443; int x444; } * x2882; union { FILE * x443; int x444; } * x2890; union { int x403; FILE * x404; } * x2891; union { FILE * x443; int x444; } * x2893; union { FILE * x443; int x444; } * x2901; union { int x403; FILE * x404; } * x2902; union { FILE * x443; int x444; } * x2904; union { FILE * x443; int x444; } * x2912; union { int x403; FILE * x404; } * x2913; union { FILE * x443; int x444; } * x2915; union { FILE * x443; int x444; } * x2923; union { int x403; FILE * x404; } * x2924; union { FILE * x443; int x444; } * x2926; union { FILE * x443; int x444; } * x2934; union { int x403; FILE * x404; } * x2935; union { FILE * x443; int x444; } * x2937; union { FILE * x443; int x444; } * x2945; union { int x403; FILE * x404; } * x2946; union { FILE * x443; int x444; } * x2948; } local7; // r28{79} int local8; // r24{33} char *local9; // r24{39} ebp = (int *)(esp - 4); eax = fopen(param2, "rb"); local23 = local21; local24 = local22; ebx = eax; if (eax == NULL) { eax = proc9("couldn't open file '%s'"); /* Warning: also results in ebx, local20, ebp */ local23 = local20; } local7 = local23; *param1 = 1; *(FILE **)esp = eax; local8 = proc10(eax); *(int*)(param1 + 8) = local8; local16 = local8; local9 = malloc(local8); local25 = local17; local26 = local16; *(char **)(param1 + 4) = local9; if (local9 == NULL) { *(FILE **)esp = 0x40710e; _assert(0x40710e); local26 = *(union { FILE * x443; int x444; } *)esp; } local11 = local26; *(FILE **)(local7 + 12) = ebx; *(char **)esp = local9; fread(local8, 1, ebx, local9); *(FILE **)esp = ebx; fclose(ebx); return *(ebp - 8); /* WARNING: Also returning: ecx, *(ebp - 12), *ebp, *(ebp - 4) */ } // address: 0x4017b0 void proc3(void *param1, int param2) { unsigned int eax; // r24 unsigned int ebx; // r27 unsigned int *ecx; // r25 unsigned int edx; // r26 int *esi; // r30 int *esp; // r28 unsigned int local11; // m[r28 - 24] int local12; // r25{49} int local13; // r25{176} int local14; // r25{54} int local15; // r25{181} FILE *local16; // r24{110} char *local17; // r24{128} int local21; // %pc{109} int *local23; // r30{168} unsigned int local24; // r24{78} int local25; // local13{176} int local26; // local15{181} int local27; // %pc{198} ecx = *(param1 + 4); edx = *(unsigned char*)(ecx + 3); eax = *(unsigned char*)(ecx + 2); edx = edx * 0x1000000 + eax * 0x10000; eax = *(unsigned char*)(ecx + 1); eax = edx + eax * 256 + *(unsigned char*)ecx; local11 = eax; esi = ecx + 4; for(;;) { local23 = esi; local12 = -1; local25 = local12; do { local13 = local25; local26 = local13; if (local13 == 0) { goto L11; } local14 = local13 - 1; local25 = local14; local26 = local14; } while ( !param2); L11: local15 = local26; if (*local23 == 0) { goto L0; } ecx = local23 + !local15 - 1; edx = *(unsigned char*)(ecx + 4); eax = *(unsigned char*)(ecx + 3); edx = edx * 0x1000000 + eax * 0x10000; local24 = *(unsigned char*)(ecx + 2); eax = *(unsigned char*)(ecx + 1); ebx = edx + local24 * 256 + eax; if (*(param1 + 8) >= ebx) { if (ebx == 0) { ebx = *(param1 + 8); goto L6; } } else { ebx = *(param1 + 8); } L6: esi = ecx + 5; local16 = fopen(local23, "wb"); local27 = local21; if (local16 != NULL) { local17 = local11 + *(param1 + 4); fwrite(local17, ebx - local11, 1, local16); fclose(local16); } if (*(param1 + 8) == ebx) { L0: return; } local11 = ebx; } } // address: 0x401696 void proc5(void *param1, char param2[], int param3) { unsigned int eax; // r24 int *ebx; // r27 unsigned int *ecx; // r25 unsigned int edx; // r26 int *esp; // r28 unsigned int local11; // m[r28 - 24] int local12; // r25{49} int local13; // r25{196} int local14; // r25{54} int local15; // r25{201} unsigned int local16; // r31{89} unsigned int local17; // r31{94} unsigned int local18; // r31{101} unsigned int local19; // r31{208} FILE *local20; // r24{122} char *local21; // r24{140} int *local25; // r27{186} unsigned int local26; // r24{78} int local27; // local13{196} int local28; // local15{201} unsigned int local29; // local19{208} ecx = *(param1 + 4); edx = *(unsigned char*)(ecx + 3); eax = *(unsigned char*)(ecx + 2); edx = edx * 0x1000000 + eax * 0x10000; eax = *(unsigned char*)(ecx + 1); eax = edx + eax * 256 + *(unsigned char*)ecx; local11 = eax; ebx = ecx + 4; for(;;) { local25 = ebx; local12 = -1; local27 = local12; do { local13 = local27; local28 = local13; if (local13 == 0) { goto L14; } local14 = local13 - 1; local27 = local14; local28 = local14; } while ( !param3); L14: local15 = local28; if (*local25 == 0) { L1: printf("File '%s' not found in this pakfile\n", param2); goto L0; } ecx = local25 + !local15 - 1; edx = *(unsigned char*)(ecx + 4); eax = *(unsigned char*)(ecx + 3); edx = edx * 0x1000000 + eax * 0x10000; local26 = *(unsigned char*)(ecx + 2); eax = *(unsigned char*)(ecx + 1); local16 = edx + local26 * 256 + eax; local29 = local16; if (*(param1 + 8) >= local16) { if (local16 == 0) { local18 = *(param1 + 8); local29 = local18; goto L9; } } else { local17 = *(param1 + 8); local29 = local17; } L9: local19 = local29; ebx = ecx + 5; eax = strcmp(local25, param2); if (eax == 0) { break; } if (*(param1 + 8) == local19) { goto L1; } local11 = local19; } local20 = fopen(param2, "wb"); if (local20 != NULL) { local21 = local11 + *(param1 + 4); fwrite(local21, local19 - local11, 1, local20); fclose(local20); } L0: return; } // address: 0x4027e0 void proc6(void *param1) { void *esp; // r28 if (param1 != NULL) { free(param1); } return; } // address: 0x4015d8 void proc7(void *param1, int param2) { unsigned int eax; // r24 unsigned int ebx; // r27 unsigned int *ecx; // r25 unsigned int edx; // r26 int *esi; // r30 int *esp; // r28 unsigned int local10; // m[r28 - 24] int local11; // r25{49} int local12; // r25{154} int local13; // r25{54} int local14; // r25{159} int *local16; // r30{146} unsigned int local17; // r24{87} int local18; // local12{154} int local19; // local14{159} ecx = *(param1 + 4); edx = *(unsigned char*)(ecx + 3); eax = *(unsigned char*)(ecx + 2); edx = edx * 0x1000000 + eax * 0x10000; eax = *(unsigned char*)(ecx + 1); eax = edx + eax * 256 + *(unsigned char*)ecx; local10 = eax; esi = ecx + 4; for(;;) { local16 = esi; local11 = -1; local18 = local11; do { local12 = local18; local19 = local12; if (local12 == 0) { goto L8; } local13 = local12 - 1; local18 = local13; local19 = local13; } while ( !param2); L8: local14 = local19; if (*local16 == 0) { break; } ecx = local16 + !local14 - 1; edx = *(unsigned char*)(ecx + 4); eax = *(unsigned char*)(ecx + 3); edx = edx * 0x1000000 + eax * 0x10000; eax = *(unsigned char*)(ecx + 2); local17 = *(unsigned char*)(ecx + 1); ebx = edx + eax * 256 + local17; if (*(param1 + 8) >= ebx) { if (ebx == 0) { ebx = *(param1 + 8); goto L3; } } else { ebx = *(param1 + 8); } L3: esi = ecx + 5; printf("Filename: %s size: %d\n", local16, ebx - local10); if (*(param1 + 8) == ebx) { break; } local10 = ebx; } return; } // address: 0x4018a0 int proc9(char *param1) { int eax; // r24 void *esp; // r28 _vsnprintf((char *)(esp - 1036), 1024, param1, esp + 8); fprintf(*0x40d168 + 64, "ERROR: %s!\n", (char *)(esp - 1036)); exit(1); return eax; /* WARNING: Also returning: (void *)(esp - 1036), (void *)(esp - 4) */ } // address: 0x401bc1 int proc10(FILE *param1) { int eax; // r24 void *esp; // r28 int local9; // r24{15} local9 = ftell(param1); fseek(param1, 0, 2); eax = ftell(param1); fseek(param1, local9, 0); return eax; }