diff --git a/native/jni/magiskboot/dtb.cpp b/native/jni/magiskboot/dtb.cpp index 00b633fb3..5f726ee95 100644 --- a/native/jni/magiskboot/dtb.cpp +++ b/native/jni/magiskboot/dtb.cpp @@ -94,7 +94,7 @@ static void print_node(const void *fdt, int node = 0, int depth = 0) { } } -static int find_fstab(const void *fdt, int parent) { +static int find_fstab(const void *fdt, int parent = 0) { int node, fstab; fdt_for_each_subnode(node, fdt, parent) { if (strcmp(fdt_get_name(fdt, node, nullptr), "fstab") == 0) @@ -106,7 +106,7 @@ static int find_fstab(const void *fdt, int parent) { return -1; } -static void dtb_dump(const char *file) { +static void dtb_print(const char *file, bool fstab) { size_t size ; uint8_t *dtb, *fdt; fprintf(stderr, "Loading dtbs from [%s]\n", file); @@ -116,8 +116,17 @@ static void dtb_dump(const char *file) { for (int i = 0; i < size; ++i) { if (memcmp(dtb + i, DTB_MAGIC, 4) == 0) { fdt = dtb + i; - fprintf(stderr, "Dumping dtb.%04d\n", dtb_num++); - print_node(fdt); + if (fstab) { + int node = find_fstab(fdt); + if (node >= 0) { + fprintf(stderr, "Found fstab in dtb.%04d\n", dtb_num); + print_node(fdt, node); + } + } else { + fprintf(stderr, "Printing dtb.%04d\n", dtb_num); + print_node(fdt); + } + dtb_num++; } } fprintf(stderr, "\n"); @@ -165,15 +174,20 @@ static void dtb_patch(const char *file, int patch) { exit(!found); } -int dtb_commands(const char *cmd, int argc, char *argv[]) { - if (argc == 0) return 1; - if (strcmp(cmd, "dump") == 0) - dtb_dump(argv[0]); - else if (strcmp(cmd, "patch") == 0) - dtb_patch(argv[0], 1); - else if (strcmp(cmd, "test") == 0) - dtb_patch(argv[0], 0); +int dtb_commands(int argc, char *argv[]) { + char *dtb = argv[0]; + ++argv; + --argc; + + if (argv[0] == "print"sv) { + dtb_print(dtb, argc > 1 && argv[1] == "-f"sv); + } else if (argv[0] == "patch"sv) { + dtb_patch(dtb, 1); + } else if (argv[0] == "test"sv) { + dtb_patch(dtb, 0); + } else { + return 1; + } + return 0; } - - diff --git a/native/jni/magiskboot/magiskboot.h b/native/jni/magiskboot/magiskboot.h index 6621b94f1..1ecd82ccd 100644 --- a/native/jni/magiskboot/magiskboot.h +++ b/native/jni/magiskboot/magiskboot.h @@ -17,7 +17,7 @@ int unpack(const char *image, bool hdr = false); void repack(const char* orig_image, const char* out_image, bool force_nocomp = false); int hexpatch(const char *image, const char *from, const char *to); int cpio_commands(int argc, char *argv[]); -int dtb_commands(const char *cmd, int argc, char *argv[]); +int dtb_commands(int argc, char *argv[]); // Pattern bool patch_verity(void **buf, uint32_t *size, bool patch = true); diff --git a/native/jni/magiskboot/main.cpp b/native/jni/magiskboot/main.cpp index 772612c75..891f7576f 100644 --- a/native/jni/magiskboot/main.cpp +++ b/native/jni/magiskboot/main.cpp @@ -16,94 +16,100 @@ using namespace std; static void usage(char *arg0) { fprintf(stderr, - FULL_VER(MagiskBoot) " - Boot Image Modification Tool\n" - "Usage: %s [args...]\n" - "\n" - "Supported actions:\n" - " unpack [-h] \n" - " Unpack to, if available, kernel, kernel_dtb, ramdisk.cpio,\n" - " second, dtb, extra, and recovery_dtbo into current directory.\n" - " If '-h' is provided, it will dump header info to 'header',\n" - " which will be parsed when repacking.\n" - " Return values:\n" - " 0:valid 1:error 2:chromeos\n" - "\n" - " repack [-n] [outbootimg]\n" - " Repack boot image components from current directory\n" - " to [outbootimg], or new-boot.img if not specified.\n" - " If '-n' is provided, it will not attempt to recompress ramdisk.cpio,\n" - " otherwise it will compress ramdisk.cpio and kernel with the same method\n" - " in if the file provided is not already compressed.\n" - "\n" - " hexpatch \n" - " Search in , and replace with \n" - "\n" - " cpio [commands...]\n" - " Do cpio commands to (modifications are done directly)\n" - " Each command is a single argument, use quotes if necessary\n" - " Supported commands:\n" - " exists ENTRY\n" - " Return 0 if ENTRY exists, else return 1\n" - " rm [-r] ENTRY\n" - " Remove ENTRY, specify [-r] to remove recursively\n" - " mkdir MODE ENTRY\n" - " Create directory ENTRY in permissions MODE\n" - " ln TARGET ENTRY\n" - " Create a symlink to TARGET with the name ENTRY\n" - " mv SOURCE DEST\n" - " Move SOURCE to DEST\n" - " add MODE ENTRY INFILE\n" - " Add INFILE as ENTRY in permissions MODE; replaces ENTRY if exists\n" - " extract [ENTRY OUT]\n" - " Extract ENTRY to OUT, or extract all entries to current directory\n" - " test\n" - " Test the current cpio's patch status\n" - " Return values:\n" - " 0:stock 1:Magisk 2:unsupported (phh, SuperSU, Xposed)\n" - " patch KEEPVERITY KEEPFORCEENCRYPT\n" - " Ramdisk patches. KEEP**** are boolean values\n" - " backup ORIG\n" - " Create ramdisk backups from ORIG\n" - " restore\n" - " Restore ramdisk from ramdisk backup stored within incpio\n" - " sha1\n" - " Print stock boot SHA1 if previously backed up in ramdisk\n" - "\n" - " dtb- \n" - " Do dtb related cmds to (modifications are done directly)\n" - " Supported commands:\n" - " dump\n" - " Dump all contents from dtb for debugging\n" - " test\n" - " Check if fstab has verity/avb flags\n" - " Return values:\n" - " 0:flag exists 1:no flags\n" - " patch\n" - " Search for fstab and remove verity/avb\n" - "\n" - " compress[=method] [outfile]\n" - " Compress with [method] (default: gzip), optionally to [outfile]\n" - " /[outfile] can be '-' to be STDIN/STDOUT\n" - " Supported methods: " - , arg0); +FULL_VER(MagiskBoot) R"EOF( - Boot Image Modification Tool + +Usage: %s [args...] + +Supported actions: + unpack [-h] + Unpack to, if available, kernel, kernel_dtb, ramdisk.cpio, + second, dtb, extra, and recovery_dtbo into current directory. + If '-h' is provided, it will dump header info to 'header', + which will be parsed when repacking. + Return values: + 0:valid 1:error 2:chromeos + + repack [-n] [outbootimg] + Repack boot image components from current directory + to [outbootimg], or new-boot.img if not specified. + If '-n' is provided, it will not attempt to recompress ramdisk.cpio, + otherwise it will compress ramdisk.cpio and kernel with the same method + in if the file provided is not already compressed. + + hexpatch + Search in , and replace with + + cpio [commands...] + Do cpio commands to (modifications are done directly) + Each command is a single argument, add quotes for each command + Supported commands: + exists ENTRY + Return 0 if ENTRY exists, else return 1 + rm [-r] ENTRY + Remove ENTRY, specify [-r] to remove recursively + mkdir MODE ENTRY + Create directory ENTRY in permissions MODE + ln TARGET ENTRY + Create a symlink to TARGET with the name ENTRY + mv SOURCE DEST + Move SOURCE to DEST + add MODE ENTRY INFILE + Add INFILE as ENTRY in permissions MODE; replaces ENTRY if exists + extract [ENTRY OUT] + Extract ENTRY to OUT, or extract all entries to current directory + test + Test the current cpio's patch status + Return values: + 0:stock 1:Magisk 2:unsupported (phh, SuperSU, Xposed) + patch KEEPVERITY KEEPFORCEENCRYPT + Ramdisk patches. KEEP**** are boolean values + backup ORIG + Create ramdisk backups from ORIG + restore + Restore ramdisk from ramdisk backup stored within incpio + sha1 + Print stock boot SHA1 if previously backed up in ramdisk + + dtb [args...] + Do commands to (modifications are done directly) + Supported commands: + print [-f] + Print all contents from dtb for debugging + Specify [-f] to only print fstab nodes + test + Check if fstab has verity/avb flags + Return values: + 0:flag exists 1:no flags + patch + Search for fstab and remove verity/avb + + compress[=method] [outfile] + Compress with [method] (default: gzip), optionally to [outfile] + /[outfile] can be '-' to be STDIN/STDOUT + Supported methods: )EOF", arg0); + for (auto &it : name2fmt) fprintf(stderr, "%s ", it.first.data()); - fprintf(stderr, - "\n\n" - " decompress [outfile]\n" - " Detect method and decompress , optionally to [outfile]\n" - " /[outfile] can be '-' to be STDIN/STDOUT\n" - " Supported methods: "); + + fprintf(stderr, R"EOF( + + decompress [outfile] + Detect method and decompress , optionally to [outfile] + /[outfile] can be '-' to be STDIN/STDOUT + Supported methods: )EOF"); + for (auto &it : name2fmt) fprintf(stderr, "%s ", it.first.data()); - fprintf(stderr, - "\n\n" - " sha1 \n" - " Print the SHA1 checksum for \n" - "\n" - " cleanup\n" - " Cleanup the current working directory\n" - "\n"); + + fprintf(stderr, R"EOF( + + sha1 + Print the SHA1 checksum for + + cleanup + Cleanup the current working directory + +)EOF"); exit(1); } @@ -165,10 +171,8 @@ int main(int argc, char *argv[]) { } else if (argc > 2 && action == "cpio"sv) { if (cpio_commands(argc - 2, argv + 2)) usage(argv[0]); - } else if (argc > 2 && str_starts(action, "dtb")) { - if (action[3] != '-') - usage(argv[0]); - if (dtb_commands(&action[4], argc - 2, argv + 2)) + } else if (argc > 2 && action == "dtb") { + if (dtb_commands(argc - 2, argv + 2)) usage(argv[0]); } else { usage(argv[0]);