From 7f749b4689dfb212580abbd568818e95a922fe49 Mon Sep 17 00:00:00 2001 From: Björn Stenberg Date: Thu, 8 Jan 2004 00:22:27 +0000 Subject: Added support for multimedia .ajz files git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4199 a1c6a512-1295-4272-9138-f99709370657 --- tools/descramble.c | 105 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 95 insertions(+), 10 deletions(-) diff --git a/tools/descramble.c b/tools/descramble.c index d28e18a951..8ba8d4a18f 100644 --- a/tools/descramble.c +++ b/tools/descramble.c @@ -26,11 +26,14 @@ int main (int argc, char** argv) unsigned char *inbuf,*outbuf; unsigned char *iname = argv[1]; unsigned char *oname = argv[2]; + unsigned char header[32]; int headerlen = 6; + int descramble = 1; FILE* file; if (argc < 3) { - printf("usage: %s [-fm] [-v2] \n",argv[0]); + printf("usage: %s [-fm] [-v2] [-mm] \n", + argv[0]); return -1; } @@ -39,6 +42,13 @@ int main (int argc, char** argv) iname = argv[2]; oname = argv[3]; } + + if (!strcmp(argv[1], "-mm")) { + headerlen = 16; + iname = argv[2]; + oname = argv[3]; + descramble = 0; + } /* open file and check size */ file = fopen(iname,"rb"); @@ -48,7 +58,13 @@ int main (int argc, char** argv) } fseek(file,0,SEEK_END); length = ftell(file) - headerlen; /* skip header */ - fseek(file,headerlen,SEEK_SET); + fseek(file,0,SEEK_SET); + i = fread(header, 1, headerlen, file); + if ( !i ) { + perror(iname); + return -1; + } + inbuf = malloc(length); outbuf = malloc(length); if ( !inbuf || !outbuf ) { @@ -64,15 +80,84 @@ int main (int argc, char** argv) } fclose(file); - /* descramble */ - slen = length/4; - for (i = 0; i < length; i++) { - unsigned long addr = ((i % slen) << 2) + i/slen; - unsigned char data = inbuf[i]; - data = ~((data >> 1) | ((data << 7) & 0x80)); /* poor man's ROR */ - outbuf[addr] = data; + if (descramble) { + /* descramble */ + slen = length/4; + for (i = 0; i < length; i++) { + unsigned long addr = ((i % slen) << 2) + i/slen; + unsigned char data = inbuf[i]; + data = ~((data >> 1) | ((data << 7) & 0x80)); /* poor man's ROR */ + outbuf[addr] = data; + } } - + else { + void* tmpptr; + unsigned int j=0; + int stringlen = 32; + int unpackedsize; + unsigned char xorstring[32]; + + unpackedsize = ((unsigned int*)header)[1]; + length = ((unsigned int*)header)[2]; + + /* calculate the xor string used */ + for (i=0; i top) { + top = bytecount[c]; + topchar = c; + } + } + xorstring[i] = topchar; + } + printf("XOR string: %.*s\n", stringlen, xorstring); + + /* xor the buffer */ + for (i=0; i j) + src -= 0x1000; + + for (x=0; x