FreeCalypso > hg > freecalypso-reveng
annotate pirollback/catino.c @ 106:a39a38bbec4d
analysis of what osmocon's voodoo payloads disassemble to in ARM/Thumb
| author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> | 
|---|---|
| date | Mon, 31 Mar 2014 06:33:14 +0000 | 
| parents | 18fa570685de | 
| children | 
| rev | line source | 
|---|---|
| 49 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 1 #include <stdio.h> | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 2 #include <stdlib.h> | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 3 #include <string.h> | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 4 #include <strings.h> | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 5 #include "types.h" | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 6 #include "struct.h" | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 7 | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 8 extern char *imgfile; | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 9 extern struct inode_info inode[]; | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 10 extern int last_inode; | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 11 extern int journal_start_ino; | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 12 | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 13 u8 * | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 14 find_end_of_chunk(ino) | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 15 { | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 16 struct inode_info *ch = inode + ino; | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 17 u8 *p; | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 18 int i; | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 19 | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 20 p = ch->dataptr + ch->len; | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 21 for (i = 1; i <= 16; i++) { | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 22 if (!p[-i]) | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 23 return(p - i); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 24 if (p[-1] != 0xFF) | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 25 break; | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 26 } | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 27 fprintf(stderr, | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 28 "chunk starting at %x (inode #%x): no valid termination found\n", | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 29 ch->offset, ino); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 30 exit(1); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 31 } | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 32 | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 33 dump_cont_chain(start) | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 34 { | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 35 int ino; | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 36 struct inode_info *inf; | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 37 u8 *endp; | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 38 | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 39 for (ino = start; ino; ino = inf->descend) { | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 40 inf = inode + ino; | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 41 if (inf->type != 0xF4) { | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 42 fprintf(stderr, | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 43 "continuation chunk #%x does not have type F4\n", | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 44 ino); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 45 exit(1); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 46 } | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 47 endp = find_end_of_chunk(ino); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 48 write(1, inf->dataptr, endp - inf->dataptr); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 49 } | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 50 } | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 51 | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 52 do_cat(ino) | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 53 { | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 54 struct inode_info *inf = inode + ino; | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 55 u8 *endp; | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 56 | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 57 if (inf->type != 0xF1) { | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 58 fprintf(stderr, "error: requested inode is not a file\n"); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 59 exit(1); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 60 } | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 61 endp = find_end_of_chunk(ino); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 62 if (endp > inf->byte_after_name) | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 63 write(1, inf->byte_after_name, endp - inf->byte_after_name); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 64 dump_cont_chain(inf->descend); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 65 } | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 66 | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 67 main(argc, argv) | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 68 char **argv; | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 69 { | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 70 int ino; | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 71 char *strtoul_endp; | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 72 | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 73 if (argc != 3) { | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 74 usage: fprintf(stderr, "usage: %s ffs-image inode\n", argv[0]); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 75 exit(1); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 76 } | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 77 imgfile = argv[1]; | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 78 ino = strtoul(argv[2], &strtoul_endp, 16); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 79 if (!argv[2][0] || *strtoul_endp) | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 80 goto usage; | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 81 read_img_file(); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 82 read_inodes(); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 83 walk_tree(); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 84 check_object_names(); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 85 parse_journal(); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 86 check_object_names(); /* rerun for "undeleted" objects */ | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 87 if (ino < 1 || ino > last_inode) { | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 88 fprintf(stderr, "%s: bad inode number specified\n", argv[0]); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 89 exit(1); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 90 } | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 91 do_cat(ino); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 92 exit(0); | 
| 
18fa570685de
pirollback: catino implemented, works
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: diff
changeset | 93 } | 
