#include "magiskboot.h" /******************** Patch Boot Image *********************/ static void usage(char *arg0) { fprintf(stderr, "%s --unpack \n", arg0); fprintf(stderr, " Unpack to kernel, ramdisk.cpio, (second), (dtb) into the\n current directory\n"); fprintf(stderr, "\n"); fprintf(stderr, "%s --repack [outbootimg]\n", arg0); fprintf(stderr, " Repack kernel, ramdisk.cpio[.ext], second, dtb... from current directory\n"); fprintf(stderr, " to [outbootimg], or new-boot.img if not specified.\n"); fprintf(stderr, " It will compress ramdisk.cpio with the same method used in \n"); fprintf(stderr, " if exists, or attempt to find ramdisk.cpio.[ext], and repack\n"); fprintf(stderr, " directly with the compressed ramdisk file\n"); fprintf(stderr, "\n"); fprintf(stderr, "%s --hexpatch \n", arg0); fprintf(stderr, " Search in , and replace with \n"); fprintf(stderr, "\n"); fprintf(stderr, "%s --cpio- [flags...] [params...]\n", arg0); fprintf(stderr, " Do cpio related cmds to (modifications are done directly)\n Supported commands:\n"); fprintf(stderr, " --cpio-rm [-r] \n Remove entry from cpio, flag -r to remove recursively\n"); fprintf(stderr, " --cpio-mkdir \n Create directory as an \n"); fprintf(stderr, " --cpio-add \n Add as an ; replaces if already exists\n"); fprintf(stderr, " --cpio-extract \n Extract to \n"); fprintf(stderr, " --cpio-test \n Return value: 0/not patched 1/Magisk 2/SuperSU\n"); fprintf(stderr, " --cpio-patch-dmverity \n Remove dm-verity\n"); fprintf(stderr, " --cpio-patch-forceencrypt \n Change forceencrypt flag to encryptable\n"); fprintf(stderr, "\n"); fprintf(stderr, "%s --compress[=method] \n", arg0); fprintf(stderr, " Compress with [method], or gzip if not specified.\n Supported methods: " SUP_LIST "\n"); fprintf(stderr, "\n"); fprintf(stderr, "%s --decompress \n", arg0); fprintf(stderr, " Auto check file type, and decompress accordingly\n Supported methods: " SUP_LIST "\n"); fprintf(stderr, "\n"); fprintf(stderr, "%s --sha1 \n", arg0); fprintf(stderr, " Print the SHA1 checksum for \n"); fprintf(stderr, "\n"); fprintf(stderr, "%s --cleanup\n", arg0); fprintf(stderr, " Cleanup the current working directory\n"); fprintf(stderr, "\n"); exit(1); } void error(int rc, const char *msg, ...) { va_list ap; va_start(ap, msg); vfprintf(stderr, msg, ap); fprintf(stderr,"\n\n"); va_end(ap); exit(rc); } int main(int argc, char *argv[]) { printf("MagiskBoot (by topjohnwu) - Boot Image Modification Tool\n\n"); if (argc > 1 && strcmp(argv[1], "--cleanup") == 0) { cleanup(); } else if (argc > 2 && strcmp(argv[1], "--sha1") == 0) { char sha1[21], *buf; size_t size; mmap_ro(argv[2], (unsigned char **) &buf, &size); SHA1(sha1, buf, size); for (int i = 0; i < 20; ++i) printf("%02x", sha1[i]); printf("\n"); munmap(buf, size); } else if (argc > 2 && strcmp(argv[1], "--unpack") == 0) { unpack(argv[2]); } else if (argc > 2 && strcmp(argv[1], "--repack") == 0) { repack(argv[2], argc > 3 ? argv[3] : NEW_BOOT); } else if (argc > 2 && strcmp(argv[1], "--decompress") == 0) { decomp_file(argv[2]); } else if (argc > 2 && strncmp(argv[1], "--compress", 10) == 0) { char *method; method = strchr(argv[1], '='); if (method == NULL) method = "gzip"; else method++; comp_file(method, argv[2]); } else if (argc > 4 && strcmp(argv[1], "--hexpatch") == 0) { hexpatch(argv[2], argv[3], argv[4]); } else if (argc > 2 && strncmp(argv[1], "--cpio", 6) == 0) { char *command; command = strchr(argv[1] + 2, '-'); if (command == NULL) usage(argv[0]); else ++command; if (cpio_commands(command, argc - 2, argv + 2)) usage(argv[0]); } else { usage(argv[0]); } return 0; }