Very simple bytecode. {{{#!highlight c++ #include #include #include #include #include #include const char * filename; bool trap = false; void fread_or_die(void * a, size_t b, size_t c, FILE * d) { size_t got = fread(a, b, c, d); if(feof(d)) {/*puts("feof"); puts(filename);*/ trap = true;} if(ferror(d)) {/*puts("ferror");*/ trap = true;} if(got != c) {trap = true;} } struct filedata { char name[0xD]; uint32_t len; uint32_t start; }; struct extdata { char ext[0x4]; uint32_t count; uint32_t start; std::vector files; }; std::vector extensions; int main(int argc, char ** argv) { if(argc < 2) return 0; for(int argument = 1; argument < argc; argument++) { trap = false; filename = argv[argument]; auto f = fopen(filename, "rb"); unsigned char trash[512]; fseek(f, 0x18, SEEK_SET); uint32_t num_offsets; fread_or_die(&num_offsets, 4, 1, f); fseek(f, 0x458 + 4*num_offsets, SEEK_SET); while(!feof(f) and !ferror(f) and !trap) { uint16_t command; uint16_t length; fread_or_die(&command, 2, 1, f); if(trap) break; fread_or_die(&length, 2, 1, f); if(trap) break; //printf("%04X (%04X) : \n", command, length); uint32_t start = ftell(f); while(ftell(f) - start < length) { uint8_t comma_type; fread_or_die(&comma_type, 1, 1, f); if(trap) break; #define GENERIC(M, N) \ case (M): \ /*printf("%02X : ", command);*/ \ fread_or_die(trash, 1, (N), f); /*for(int i = 0; i < (N); i++) printf("%02X ", trash[i]); puts(""); */ \ break; #define GOODSTRING(M, N) \ case (M): \ /*if(!visited[(M)]) printf("%02X : ", command);*/ \ fread_or_die(trash, 1, (N), f); \ for(;;) { int c = fgetc(f); if(c == 0) break; if(command == 0x07DA) putc(c, stdout); } /*if(!visited[(M)])*/ if(command == 0x07DA) puts(""); \ /*visited[(M)] = true;*/ \ break; #define CONSUME(M) \ case (M): \ /*if(!visited[(M)]) printf("%02X : ", command);*/ \ while(ftell(f) - start != length) fgetc(f); \ break; switch(comma_type) { GENERIC(0x01, 4) GENERIC(0x02, 4) GOODSTRING(0x03, 0) CONSUME(0x04) default: printf("Unknown stack comma %02X at %08X in %s\n", comma_type, ftell(f)-1, filename); exit(0); } } if(ftell(f) - start != length) { printf("sync error at %X08\n", ftell(f)); exit(0); } } } } }}}