# HG changeset patch # User Mychaela Falconia # Date 1510948687 0 # Node ID 9f2e0c34fe33ea54b6182c7b282cfe38661c5379 # Parent 2cc7a17c38595d388629cd57918c4315c0f6e615 ftmdump (C1xx factory data reverse eng) tool written diff -r 2cc7a17c3859 -r 9f2e0c34fe33 .hgignore --- a/.hgignore Thu Nov 16 04:19:58 2017 +0000 +++ b/.hgignore Fri Nov 17 19:58:07 2017 +0000 @@ -29,6 +29,7 @@ ^miscprog/atsc$ ^miscprog/calextract$ ^miscprog/factdiff$ +^miscprog/ftmdump$ ^miscprog/grokdsn$ ^miscprog/imeibrute$ ^miscprog/memwrite-grep$ diff -r 2cc7a17c3859 -r 9f2e0c34fe33 miscprog/Makefile --- a/miscprog/Makefile Thu Nov 16 04:19:58 2017 +0000 +++ b/miscprog/Makefile Fri Nov 17 19:58:07 2017 +0000 @@ -1,7 +1,7 @@ CC= gcc CFLAGS= -O2 -STD= atsc calextract factdiff grokdsn memwrite-grep mokosrec2bin pircalextr \ - pircksum pircksum2 rfcap-grep +STD= atsc calextract factdiff ftmdump grokdsn memwrite-grep mokosrec2bin \ + pircalextr pircksum pircksum2 rfcap-grep CRYPTO= imeibrute pirimei PROGS= ${STD} ${CRYPTO} @@ -16,6 +16,7 @@ atsc: atsc.c calextract: calextract.c factdiff: factdiff.c +ftmdump: ftmdump.c grokdsn: grokdsn.c imeibrute: imeibrute.c memwrite-grep: memwrite-grep.c diff -r 2cc7a17c3859 -r 9f2e0c34fe33 miscprog/ftmdump.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/miscprog/ftmdump.c Fri Nov 17 19:58:07 2017 +0000 @@ -0,0 +1,76 @@ +/* + * This program parses the record structure in Compal's FTM sector (or at least + * that's what I *think* it is called) and dumps each record in hex for further + * human analysis. + */ + +#include +#include +#include +#include +#include + +char *infname; +FILE *inf; +u_char header[8]; +u_char endmarker[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; +unsigned hdr_words[4]; + +main(argc, argv) + char **argv; +{ + if (argc < 2 || argc > 3) { + fprintf(stderr, "usage: %s binfile [offset]\n", argv[0]); + exit(1); + } + infname = argv[1]; + inf = fopen(infname, "r"); + if (!inf) { + perror(infname); + exit(1); + } + if (argc == 3) + fseek(inf, strtoul(argv[2], 0, 0), SEEK_SET); + for (;;) { + fread(header, 1, 8, inf); + if (!bcmp(header, endmarker, 8)) + break; + process_record(); + } + exit(0); +} + +process_record() +{ + u_char readbuf[16]; + int pos, chunk, i, c; + + for (i = 0; i < 4; i++) + hdr_words[i] = header[i*2] | (header[i*2+1] << 8); + printf("%04X %04X %04X %04X:\n\n", hdr_words[0], hdr_words[1], + hdr_words[2], hdr_words[3]); + for (pos = 0; pos < hdr_words[3]; pos += chunk) { + chunk = hdr_words[3] - pos; + if (chunk > 16) + chunk = 16; + fread(readbuf, 1, chunk, inf); + printf("%04X:", pos); + for (i = 0; i < 16; i++) { + if (i == 0 || i == 8) + putchar(' '); + if (i < chunk) + printf(" %02X", readbuf[i]); + else + fputs(" ", stdout); + } + fputs(" ", stdout); + for (i = 0; i < chunk; i++) { + c = readbuf[i]; + if (c < ' ' || c > '~') + c = '.'; + putchar(c); + } + putchar('\n'); + } + putchar('\n'); +}