int main(int argc, char **argv) { FILE *fp_in, *fp_out; int action = 0; if (argc != 4) { fprintf(stderr, "usage: %s [-a|-r] <input> <output>\n", argv[0]); return 1; } if (strcmp(argv[1], "-a") == 0) { action = 1; } else if (strcmp(argv[1], "-r") == 0) { action = 2; } else { fprintf(stderr, "usage: %s [-a|-r] <input> <output>\n", argv[0]); } fp_in = fopen(argv[2], "r"); if (!fp_in) { fprintf(stderr, "can't open input file '%s': %s\n", argv[2], strerror(errno)); return 1; } fp_out = fopen(argv[3], "w"); if (!fp_out) { fprintf(stderr, "can't open output file '%s': %s\n", argv[3], strerror(errno)); return 1; } switch (action) { case 1: pack_krnl(fp_in, fp_out); break; case 2: unpack_krnl(fp_in, fp_out); break; default: break; } return 0; }
int main(int argc, char **argv) { FILE *fp_in, *fp_out; int action = 0; if (argc != 4) { fprintf(stderr, "Not enough arguments!"); help(argv); return 1; } fp_in = fopen(argv[2], "rb"); if (!fp_in) { fprintf(stderr, "can't open input file '%s': %s\n", argv[2], strerror(errno)); return 1; } fp_out = fopen(argv[3], "wb"); if (!fp_out) { fprintf(stderr, "can't open output file '%s': %s\n", argv[3], strerror(errno)); return 1; } if (strcmp(argv[1],"-pack") == 0) { pack_krnl(fp_in, fp_out); } else if (strcmp(argv[1],"-unpack") == 0) { unpack_krnl(fp_in, fp_out); } else { help(argv); return 1; } return 0; }
int main(int argc, char *argv[]) { off_t size; uint8_t *buf; int fd; if (argc != 2) { fprintf(stderr, "usage: %s image\n", argv[0]); exit(EXIT_FAILURE); } if ((fd = open(argv[1], O_RDONLY)) == -1) err(EXIT_FAILURE, "%s", argv[1]); if ((size = lseek(fd, 0, SEEK_END)) == -1) err(EXIT_FAILURE, "%s", argv[1]); if ((buf = mmap(NULL, size, PROT_READ, MAP_SHARED | MAP_FILE, fd, 0)) == MAP_FAILED) err(EXIT_FAILURE, "%s", argv[1]); if (memcmp(buf, "RKFW", 4) == 0) unpack_rkfw(argv[1], buf, size); else if (memcmp(buf, "RKAF", 4) == 0) unpack_rkaf(argv[1], buf, size); else if (memcmp(buf, "KRNL", 4) == 0 || memcmp(buf, "PARM", 4) == 0) unpack_krnl(argv[1], buf, size); else if (memcmp(buf, "ANDROID!", 8) == 0) unpack_android(argv[1], buf, size); else errx(EXIT_FAILURE, "invalid signature"); printf("unpacked\n"); munmap(buf, size); close(fd); return EXIT_SUCCESS; }
static void unpack_rkaf(const char *path, uint8_t *buf, uint32_t size) { uint32_t fsize, ioff, isize, noff, nsize; uint8_t *p; int count; const char *name, *fpath, *sep; char dir[PATH_MAX]; fsize = (buf[4] | buf[5] << 8 | buf[6] << 16 | buf[7] << 24) + 4; if (fsize != size) fprintf(stderr, "invalid file size (should be %u bytes)\n", fsize); printf("FIRMWARE_VER:%d.%d.%d\n", buf[0x87], buf[0x86], buf[0x84]); printf("MACHINE_MODEL:%s\n", &buf[0x08]); printf("MACHINE_ID:%s\n", &buf[0x2a]); printf("MANUFACTURER:%s\n", &buf[0x48]); count = buf[0x88] | buf[0x89] << 8 | buf[0x8a] << 16 | buf[0x8b] << 24; printf("\nunpacking %d files\n", count); printf("-------------------------------------------------------------------------------\n"); for (p = &buf[0x8c]; count > 0; p += 0x70, count--) { name = (const char *)p; fpath = (const char *)&p[0x20]; nsize = p[0x5c] | p[0x5d] << 8 | p[0x5e] << 16 | p[0x5f] << 24; ioff = p[0x60] | p[0x61] << 8 | p[0x62] << 16 | p[0x63] << 24; noff = p[0x64] | p[0x65] << 8 | p[0x66] << 16 | p[0x67] << 24; isize = p[0x68] | p[0x69] << 8 | p[0x6a] << 16 | p[0x6b] << 24; fsize = p[0x6c] | p[0x6d] << 8 | p[0x6e] << 16 | p[0x6f] << 24; if (memcmp(fpath, "SELF", 4) == 0) printf("----------------- %s:%s:0x%x@0x%x (%s)", name, fpath, nsize, noff, path); else { printf("%08x-%08x %s:%s", ioff, ioff + isize - 1, name, fpath); if (noff != 0xffffffffU) printf(":0x%x@0x%x", nsize, noff); if (memcmp(name, "parameter", 9) == 0) { ioff += 8; fsize -= 12; } sep = fpath; while ((sep = strchr(sep, '/')) != NULL) { memcpy(dir, fpath, sep - fpath); dir[sep - fpath] = '\0'; if (mkdir(dir, 0755) == -1 && errno != EEXIST) err(EXIT_FAILURE, "%s", dir); sep++; } write_image(fpath, &buf[ioff], fsize); if (memcmp(&buf[ioff], "KRNL", 4) == 0 || memcmp(&buf[ioff], "PARM", 4) == 0) unpack_krnl(fpath, &buf[ioff], fsize); } printf(" %d bytes\n", fsize); } printf("-------------------------------------------------------------------------------\n"); }