| 
									
										
										
										
											2018-10-24 21:08:06 -04:00
										 |  |  | #include <mincrypt/sha.h>
 | 
					
						
							| 
									
										
										
										
											2020-03-09 01:50:30 -07:00
										 |  |  | #include <utils.hpp>
 | 
					
						
							| 
									
										
										
										
											2018-10-24 21:08:06 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-09 01:50:30 -07:00
										 |  |  | #include "magiskboot.hpp"
 | 
					
						
							|  |  |  | #include "compress.hpp"
 | 
					
						
							| 
									
										
										
										
											2016-09-08 20:59:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-15 15:59:57 -07:00
										 |  |  | using namespace std; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-02 23:16:10 -08:00
										 |  |  | static void print_methods() { | 
					
						
							|  |  |  |     for (int fmt = GZIP; fmt < LZOP; ++fmt) { | 
					
						
							|  |  |  |         fprintf(stderr, "%s ", fmt2name[(format_t) fmt]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-25 03:29:12 +08:00
										 |  |  | static void usage(char *arg0) { | 
					
						
							| 
									
										
										
										
											2020-12-30 22:11:24 -08:00
										 |  |  |     fprintf(stderr, | 
					
						
							| 
									
										
										
										
											2020-06-01 04:15:37 -07:00
										 |  |  | R"EOF(MagiskBoot - Boot Image Modification Tool | 
					
						
							| 
									
										
										
										
											2019-09-20 03:53:58 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | Usage: %s <action> [args...] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Supported actions: | 
					
						
							| 
									
										
										
										
											2019-10-29 15:48:58 -03:00
										 |  |  |   unpack [-n] [-h] <bootimg> | 
					
						
							| 
									
										
										
										
											2019-09-20 03:53:58 -04:00
										 |  |  |     Unpack <bootimg> to, if available, kernel, kernel_dtb, ramdisk.cpio, | 
					
						
							|  |  |  |     second, dtb, extra, and recovery_dtbo into current directory. | 
					
						
							| 
									
										
										
										
											2019-10-29 15:48:58 -03:00
										 |  |  |     If '-n' is provided, it will not attempt to decompress kernel or | 
					
						
							|  |  |  |     ramdisk.cpio from their original formats. | 
					
						
							| 
									
										
										
										
											2019-09-20 03:53:58 -04:00
										 |  |  |     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] <origbootimg> [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 <origbootimg> if the file provided is not already compressed. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   hexpatch <file> <hexpattern1> <hexpattern2> | 
					
						
							|  |  |  |     Search <hexpattern1> in <file>, and replace with <hexpattern2> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   cpio <incpio> [commands...] | 
					
						
							| 
									
										
										
										
											2020-05-05 01:03:09 -07:00
										 |  |  |     Do cpio commands to <incpio> (modifications are done in-place) | 
					
						
							| 
									
										
										
										
											2019-09-20 03:53:58 -04:00
										 |  |  |     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) | 
					
						
							| 
									
										
										
										
											2019-09-21 05:55:23 -04:00
										 |  |  |       patch | 
					
						
							| 
									
										
										
										
											2020-05-05 01:03:09 -07:00
										 |  |  |         Apply ramdisk patches | 
					
						
							|  |  |  |         Configure with env variables: KEEPVERITY KEEPFORCEENCRYPT | 
					
						
							| 
									
										
										
										
											2019-09-20 03:53:58 -04:00
										 |  |  |       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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-21 05:30:04 -04:00
										 |  |  |   dtb <input> <action> [args...] | 
					
						
							|  |  |  |     Do dtb related actions to <input> | 
					
						
							|  |  |  |     Supported actions: | 
					
						
							| 
									
										
										
										
											2019-09-20 03:53:58 -04:00
										 |  |  |       print [-f] | 
					
						
							| 
									
										
										
										
											2019-09-21 05:30:04 -04:00
										 |  |  |         Print all contents of dtb for debugging | 
					
						
							| 
									
										
										
										
											2019-09-20 03:53:58 -04:00
										 |  |  |         Specify [-f] to only print fstab nodes | 
					
						
							| 
									
										
										
										
											2020-05-05 01:03:09 -07:00
										 |  |  |       patch | 
					
						
							| 
									
										
										
										
											2019-09-20 03:53:58 -04:00
										 |  |  |         Search for fstab and remove verity/avb | 
					
						
							| 
									
										
										
										
											2020-05-05 01:03:09 -07:00
										 |  |  |         Modifications are done directly to the file in-place | 
					
						
							|  |  |  |         Configure with env variables: KEEPVERITY | 
					
						
							| 
									
										
										
										
											2019-09-20 03:53:58 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-30 13:04:39 +08:00
										 |  |  |   split <input> | 
					
						
							|  |  |  |     Split image.*-dtb into kernel + kernel_dtb | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sha1 <file> | 
					
						
							|  |  |  |     Print the SHA1 checksum for <file> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   cleanup | 
					
						
							|  |  |  |     Cleanup the current working directory | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-20 03:53:58 -04:00
										 |  |  |   compress[=method] <infile> [outfile] | 
					
						
							|  |  |  |     Compress <infile> with [method] (default: gzip), optionally to [outfile] | 
					
						
							|  |  |  |     <infile>/[outfile] can be '-' to be STDIN/STDOUT | 
					
						
							|  |  |  |     Supported methods: )EOF", arg0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-02 23:16:10 -08:00
										 |  |  |     print_methods(); | 
					
						
							| 
									
										
										
										
											2019-09-20 03:53:58 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-30 22:11:24 -08:00
										 |  |  |     fprintf(stderr, R"EOF( | 
					
						
							| 
									
										
										
										
											2019-09-20 03:53:58 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   decompress <infile> [outfile] | 
					
						
							|  |  |  |     Detect method and decompress <infile>, optionally to [outfile] | 
					
						
							|  |  |  |     <infile>/[outfile] can be '-' to be STDIN/STDOUT | 
					
						
							|  |  |  |     Supported methods: )EOF"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-02 23:16:10 -08:00
										 |  |  |     print_methods(); | 
					
						
							| 
									
										
										
										
											2019-09-20 03:53:58 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-30 22:11:24 -08:00
										 |  |  |     fprintf(stderr, "\n\n"); | 
					
						
							|  |  |  |     exit(1); | 
					
						
							| 
									
										
										
										
											2017-02-25 03:29:12 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-24 14:58:44 +08:00
										 |  |  | int main(int argc, char *argv[]) { | 
					
						
							| 
									
										
										
										
											2020-12-30 22:11:24 -08:00
										 |  |  |     cmdline_logging(); | 
					
						
							|  |  |  |     umask(0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (argc < 2) | 
					
						
							|  |  |  |         usage(argv[0]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Skip '--' for backwards compatibility
 | 
					
						
							|  |  |  |     string_view action(argv[1]); | 
					
						
							|  |  |  |     if (str_starts(action, "--")) | 
					
						
							|  |  |  |         action = argv[1] + 2; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (action == "cleanup") { | 
					
						
							|  |  |  |         fprintf(stderr, "Cleaning up...\n"); | 
					
						
							|  |  |  |         unlink(HEADER_FILE); | 
					
						
							|  |  |  |         unlink(KERNEL_FILE); | 
					
						
							|  |  |  |         unlink(RAMDISK_FILE); | 
					
						
							|  |  |  |         unlink(SECOND_FILE); | 
					
						
							|  |  |  |         unlink(KER_DTB_FILE); | 
					
						
							|  |  |  |         unlink(EXTRA_FILE); | 
					
						
							|  |  |  |         unlink(RECV_DTBO_FILE); | 
					
						
							|  |  |  |         unlink(DTB_FILE); | 
					
						
							|  |  |  |     } else if (argc > 2 && action == "sha1") { | 
					
						
							|  |  |  |         uint8_t sha1[SHA_DIGEST_SIZE]; | 
					
						
							|  |  |  |         void *buf; | 
					
						
							|  |  |  |         size_t size; | 
					
						
							|  |  |  |         mmap_ro(argv[2], buf, size); | 
					
						
							|  |  |  |         SHA_hash(buf, size, sha1); | 
					
						
							|  |  |  |         for (uint8_t i : sha1) | 
					
						
							|  |  |  |             printf("%02x", i); | 
					
						
							|  |  |  |         printf("\n"); | 
					
						
							|  |  |  |         munmap(buf, size); | 
					
						
							|  |  |  |     } else if (argc > 2 && action == "split") { | 
					
						
							|  |  |  |         return split_image_dtb(argv[2]); | 
					
						
							|  |  |  |     } else if (argc > 2 && action == "unpack") { | 
					
						
							|  |  |  |         int idx = 2; | 
					
						
							|  |  |  |         bool nodecomp = false; | 
					
						
							|  |  |  |         bool hdr = false; | 
					
						
							|  |  |  |         for (;;) { | 
					
						
							|  |  |  |             if (idx >= argc) | 
					
						
							|  |  |  |                 usage(argv[0]); | 
					
						
							|  |  |  |             if (argv[idx][0] != '-') | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             for (char *flag = &argv[idx][1]; *flag; ++flag) { | 
					
						
							|  |  |  |                 if (*flag == 'n') | 
					
						
							|  |  |  |                     nodecomp = true; | 
					
						
							|  |  |  |                 else if (*flag == 'h') | 
					
						
							|  |  |  |                     hdr = true; | 
					
						
							|  |  |  |                 else | 
					
						
							|  |  |  |                     usage(argv[0]); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             ++idx; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return unpack(argv[idx], nodecomp, hdr); | 
					
						
							|  |  |  |     } else if (argc > 2 && action == "repack") { | 
					
						
							|  |  |  |         if (argv[2] == "-n"sv) { | 
					
						
							|  |  |  |             if (argc == 3) | 
					
						
							|  |  |  |                 usage(argv[0]); | 
					
						
							|  |  |  |             repack(argv[3], argv[4] ? argv[4] : NEW_BOOT, true); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             repack(argv[2], argv[3] ? argv[3] : NEW_BOOT); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } else if (argc > 2 && action == "decompress") { | 
					
						
							|  |  |  |         decompress(argv[2], argv[3]); | 
					
						
							|  |  |  |     } else if (argc > 2 && str_starts(action, "compress")) { | 
					
						
							|  |  |  |         compress(action[8] == '=' ? &action[9] : "gzip", argv[2], argv[3]); | 
					
						
							|  |  |  |     } else if (argc > 4 && action == "hexpatch") { | 
					
						
							|  |  |  |         return hexpatch(argv[2], argv[3], argv[4]); | 
					
						
							|  |  |  |     } else if (argc > 2 && action == "cpio"sv) { | 
					
						
							|  |  |  |         if (cpio_commands(argc - 2, argv + 2)) | 
					
						
							|  |  |  |             usage(argv[0]); | 
					
						
							|  |  |  |     } else if (argc > 3 && action == "dtb") { | 
					
						
							|  |  |  |         if (dtb_commands(argc - 2, argv + 2)) | 
					
						
							|  |  |  |             usage(argv[0]); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         usage(argv[0]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2017-02-24 14:58:44 +08:00
										 |  |  | } |