From 6a6afff21d868af9ffa013dcd2124a0f42a7f577 Mon Sep 17 00:00:00 2001 From: Maschell Date: Tue, 1 Feb 2022 23:27:30 +0100 Subject: [PATCH] Improve dev common key detection, fix splitted file support on non-windows machines --- pom.xml | 4 +- src/main/java/de/mas/jwudtool/Main.java | 69 +++++++++++-------------- 2 files changed, 33 insertions(+), 40 deletions(-) diff --git a/pom.xml b/pom.xml index 9c55c3a..14f1da0 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.mas jwudtool - 0.4 + 0.5 @@ -79,7 +79,7 @@ com.github.Maschell JNUSLib - 90e83fe + 822cf2d diff --git a/src/main/java/de/mas/jwudtool/Main.java b/src/main/java/de/mas/jwudtool/Main.java index 233bfae..85681bd 100644 --- a/src/main/java/de/mas/jwudtool/Main.java +++ b/src/main/java/de/mas/jwudtool/Main.java @@ -58,7 +58,7 @@ public class Main { } CommandLineParser parser = new DefaultParser(); - CommandLine cmd = null; + CommandLine cmd; try { cmd = parser.parse(options, args); } catch (MissingArgumentException e) { @@ -76,14 +76,18 @@ public class Main { boolean devMode = false; byte[] titlekey = null; - readKey(new File(HOMEPATH + File.separator + "common.key")).ifPresent(key -> Main.commonKey = key); - readKey(new File("common.key")).ifPresent(key -> Main.commonKey = key); - if (cmd.hasOption(OPTION_HELP)) { showHelp(options); return; } + if (cmd.hasOption(OPTION_DEVMODE)) { + devMode = true; + } + + readKey(new File(HOMEPATH + File.separator + (devMode ? "devcommon.key" : "common.key"))).ifPresent(key -> Main.commonKey = key); + readKey(new File("common.key")).ifPresent(key -> Main.commonKey = key); + if (cmd.hasOption(OPTION_IN)) { input = cmd.getOptionValue(OPTION_IN); } @@ -114,10 +118,6 @@ public class Main { overwrite = true; } - if (cmd.hasOption(OPTION_DEVMODE)) { - devMode = true; - } - if (cmd.hasOption(OPTION_COMPRESS)) { boolean verify = true; System.out.println("Compressing: " + input); @@ -171,6 +171,7 @@ public class Main { return; } } + System.out.println("Done!"); } private static void extract(String input, String output, boolean devMode, boolean overwrite, byte[] titlekey, String arg) throws Exception { @@ -183,39 +184,35 @@ public class Main { boolean extractHashes = false; switch (arg) { - case "all": - extractAll = true; - break; - case "content": - extractContent = true; - break; - case "ticket": - extractTicket = true; - break; - case "hashes": - extractHashes = true; - break; - default: - System.out.println("Argument not found:" + arg); - return; + case "all": + extractAll = true; + break; + case "content": + extractContent = true; + break; + case "ticket": + extractTicket = true; + break; + case "hashes": + extractHashes = true; + break; + default: + System.out.println("Argument not found:" + arg); + return; } + assert input != null; File inputFile = new File(input); System.out.println("Extracting: " + inputFile.getAbsolutePath()); - WiiUDisc wudInfo = null; + WiiUDisc wudInfo; if (!devMode) { wudInfo = WUDLoader.load(inputFile.getAbsolutePath(), titlekey); } else { wudInfo = WUDLoader.loadDev(inputFile.getAbsolutePath()); } - if (wudInfo == null) { - System.out.println("Failed to load WUX " + inputFile.getAbsolutePath()); - return; - } - List titles = WUDLoader.getGamePartionsAsNUSTitles(wudInfo, Main.commonKey); System.out.println("Found " + titles.size() + " titles on the Disc."); for (val title : titles) { @@ -248,23 +245,19 @@ public class Main { private static void decryptFile(String input, String output, String regex, boolean devMode, boolean overwrite, byte[] titlekey) throws Exception { if (input == null) { System.out.println("You need to provide an input file"); + return; } File inputFile = new File(input); System.out.println("Decrypting: " + inputFile.getAbsolutePath()); - WiiUDisc wudInfo = null; + WiiUDisc wudInfo; if (!devMode) { wudInfo = WUDLoader.load(inputFile.getAbsolutePath(), titlekey); } else { wudInfo = WUDLoader.loadDev(inputFile.getAbsolutePath()); } - if (wudInfo == null) { - System.out.println("Failed to load Wii U Disc Image " + inputFile.getAbsolutePath()); - return; - } - List partitions = WUDLoader.getPartitonsAsFSTDataProvider(wudInfo, Main.commonKey); System.out.println("Found " + partitions.size() + " titles on the Disc."); @@ -326,7 +319,7 @@ public class Main { } System.out.println("Parsing WUD image."); WUDImage image = new WUDImage(inputImage); - Optional outputFile = Optional.empty(); + Optional outputFile; if (!decompress) { outputFile = WUDService.compressWUDToWUX(image, output, overwrite); if (outputFile.isPresent()) { @@ -358,10 +351,10 @@ public class Main { byte[] key; try { key = Files.readAllBytes(file.toPath()); - if (key != null && key.length == 16) { + if (key.length == 16) { return Optional.of(key); } - } catch (IOException e) { + } catch (IOException ignored) { } } return Optional.empty();