static void unpack_rkfw(const char *path, uint8_t *buf, uint32_t size) { uint32_t ioff, isize; char rpath[PATH_MAX]; printf("VERSION:%d.%d.%d\n", buf[8], buf[7], buf[6]); printf("\nunpacking\n"); ioff = 0; isize = buf[4]; snprintf(rpath, sizeof(rpath), "%s-HEAD", path); printf("%08x-%08x %s %d bytes\n", ioff, ioff + isize - 1, rpath, isize); write_image(rpath, &buf[ioff], isize); ioff = buf[0x19] | buf[0x1a] << 8 | buf[0x1b] << 16 | buf[0x1c] << 24; isize = buf[0x1d] | buf[0x1e] << 8 | buf[0x1f] << 16 | buf[0x20] << 24; if (memcmp(&buf[ioff], "BOOT", 4) != 0) errx(EXIT_FAILURE, "no BOOT signature"); snprintf(rpath, sizeof(rpath), "%s-BOOT", path); printf("%08x-%08x %s %d bytes\n", ioff, ioff + isize - 1, rpath, isize); write_image(rpath, &buf[ioff], isize); ioff = buf[0x21] | buf[0x22] << 8 | buf[0x23] << 16 | buf[0x24] << 24; isize = buf[0x25] | buf[0x26] << 8 | buf[0x27] << 16 | buf[0x28] << 24; if (memcmp(&buf[ioff], "RKAF", 4) != 0) errx(EXIT_FAILURE, "no RKAF signature"); printf("%08x-%08x update.img %d bytes\n", ioff, ioff + isize - 1, isize); write_image("update.img", &buf[ioff], isize); printf("\nunpacking update.img\n"); printf("================================================================================\n"); unpack_rkaf("update.img", &buf[ioff], isize); printf("================================================================================\n\n"); if (size - (ioff + isize) != 32) errx(EXIT_FAILURE, "invalid MD5 length"); snprintf(rpath, sizeof(rpath), "%s-MD5", path); printf("%08x-%08x %s 32 bytes\n", ioff, ioff + isize - 1, rpath); write_image(rpath, &buf[ioff + isize], 32); }
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; }
int main(int argc, char *argv[]) { if (argc != 2) fatal("rkunpack v%d.%d\nusage: %s update.img\n", RKFLASHTOOL_VERSION_MAJOR, RKFLASHTOOL_VERSION_MINOR, argv[0]); if ((fd = open(argv[1], O_BINARY | O_RDONLY)) == -1) fatal("%s: %s\n", argv[1], strerror(errno)); if ((size = lseek(fd, 0, SEEK_END)) == -1) fatal("%s: %s\n", argv[1], strerror(errno)); #ifdef _WIN32 fm = CreateFileMapping((HANDLE)_get_osfhandle(fd), NULL, PAGE_READONLY, 0, 0, NULL); buf = MapViewOfFile(fm, FILE_MAP_READ, 0, 0, 0); if (!buf) fatal("%s: cannot create MapView of File\n", argv[1]); #else if ((buf = mmap(NULL, size, PROT_READ, MAP_SHARED | MAP_FILE, fd, 0)) == MAP_FAILED) fatal("%s: %s\n", argv[1], strerror(errno)); #endif if (!memcmp(buf, "RKAF", 4)) unpack_rkaf(); else if (!memcmp(buf, "RKFW", 4)) unpack_rkfw(); else fatal("%s: invalid signature\n", argv[1]); printf("unpacked\n"); #ifdef _WIN32 CloseHandle(fm); UnmapViewOfFile(buf); #else munmap(buf, size); #endif close(fd); return 0; }