You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							78 lines
						
					
					
						
							3.0 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							78 lines
						
					
					
						
							3.0 KiB
						
					
					
				| from pathlib import Path | |
| import filecmp | |
| 
 | |
| from romtools import * | |
| 
 | |
| def cli_join_rom(clean_path): | |
|     print("Joining dumps in to full firmware ROM... ", end="") | |
|     with open(clean_path / "bottom.bin", "rb") as bottom, open(clean_path / "top.bin", "rb") as top, open(clean_path / "clean.rom", "wb+") as rom: | |
|         rom.write(bottom.read() + top.read()) | |
|     print("Done.") | |
|      | |
| def cli_split_rom(patched_path): | |
|     print("Splitting full rom in to images for each chip... ", end="") | |
|     with open(patched_path / "bottom.bin", "wb+") as bottom, open(patched_path / "top.bin", "wb+") as top, open(patched_path / "patched.rom", "rb") as rom: | |
|         rom_array = rom.read() | |
|         bottom.write(rom_array[:0x800000]) | |
|         top.write(rom_array[0x800000:]) | |
|     print("Done.") | |
| 
 | |
| def cli_connect_rom(chip_loc): | |
|     input(f"Please connect programming clip to {chip_loc} flash chip. Press Enter when done...") | |
|     cli_reconnect_rom(chip_loc) | |
|      | |
| def cli_reconnect_rom(chip_loc): | |
|     print("Checking if ROM is connected... ", end="") | |
|     try: | |
|         check_rom(chip_loc) | |
|         print("ROM is reachable.") | |
|     except: | |
|         response = input("ROM is not reachable. Try again? (Y/q): ") | |
|         if response in ['q', 'Q']: | |
|             raise ROMError("Could not connect to ROM. User elected to quit.") | |
|         else: | |
|             cli_reconnect_rom(chip_loc) | |
|          | |
| def cli_read_rom(chip_loc, clean_path, verify=True): | |
|     files = [chip_loc + ".bin", chip_loc + "_2.bin"] if verify else [chip_loc + ".bin"] | |
|     for count, file_name in enumerate(files): | |
|         print(f"Reading {chip_loc} ROM, pass {count+1} of {len(files)}... ", end="", flush=True) | |
|         read_rom(chip_loc, clean_path, file_name) | |
|         print("Success.") | |
|              | |
|     if verify:  | |
|         print("Comparing ROM files... ", end="") | |
|         if filecmp.cmp(clean_path / files[0], clean_path / files[1]): | |
|             print("Files match.") | |
|         else: | |
|             raise ROMError("ROM files do not match. Read the log and try again.") | |
|     else: | |
|         print("ROM file will not be verified, proceed at your own risk!") | |
|          | |
|     print(f"{chip_loc.capitalize()} ROM read successfully.") | |
|      | |
| def cli_write_rom(chip_loc, patched_path, verify=True): | |
|     file_name = chip_loc + '_patched.bin' | |
|     print(f"Writing {chip_loc} ROM (takes a while)... ", end="", flush=True) | |
|     write_rom(chip_loc, patched_path, file_name) | |
|     print("Success.") | |
|          | |
|     print(f"{chip_loc.capitalize()} ROM written successfully.") | |
| 
 | |
| def cli_choose_patches(): | |
|     which_patches = input("Patch (W)LAN whitelist, (A)dvanced menu or (B)oth? ") | |
|      | |
|     if which_patches.strip()[0] in ['w', 'W']: | |
|         patches = ["wifi"] | |
|     elif which_patches.strip()[0] in ['a', 'A']: | |
|         patches = ["advanced"] | |
|     elif which_patches.strip()[0] in ['b', 'B']: | |
|         patches = ["wifi", "advanced"] | |
|     else: | |
|         raise ValueError("Selection invalid.") | |
|      | |
|     return patches | |
|      | |
| def cli_patch_rom(patches, clean_path, patched_path): | |
|     patch_rom(patches, clean_path / "top.bin", patched_path / "top_patched.bin") | |
|     print("ROM patched successfully.") |