From df8def23dd0336d8a5d2369c5d4c0f4331838ef4 Mon Sep 17 00:00:00 2001 From: Erlend Ã…mdal Date: Wed, 15 May 2019 12:45:41 +0200 Subject: checkmappings command (#137) * Use expected map sizes for remapped multimaps * Index method and field types * Add package visibility index * Add checkmappings command and use System.err for error messages * Use exit codes for errors * Remove outer class check for package visible only refs * Throw exception on mapping error instead of exiting --- src/main/java/cuchaz/enigma/CommandMain.java | 62 +++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 10 deletions(-) (limited to 'src/main/java/cuchaz/enigma/CommandMain.java') diff --git a/src/main/java/cuchaz/enigma/CommandMain.java b/src/main/java/cuchaz/enigma/CommandMain.java index c9f8382..db4fd12 100644 --- a/src/main/java/cuchaz/enigma/CommandMain.java +++ b/src/main/java/cuchaz/enigma/CommandMain.java @@ -11,35 +11,47 @@ package cuchaz.enigma; +import cuchaz.enigma.analysis.index.JarIndex; import cuchaz.enigma.translation.mapping.EntryMapping; import cuchaz.enigma.translation.mapping.serde.MappingFormat; import cuchaz.enigma.translation.mapping.tree.EntryTree; +import cuchaz.enigma.translation.representation.entry.ClassEntry; import java.io.File; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Locale; +import java.util.Set; import java.util.jar.JarFile; +import java.util.stream.Collectors; public class CommandMain { public static void main(String[] args) throws Exception { try { // process the command - String command = getArg(args, 0, "command", true); - if (command.equalsIgnoreCase("deobfuscate")) { - deobfuscate(args); - } else if (command.equalsIgnoreCase("decompile")) { - decompile(args); - } else if (command.equalsIgnoreCase("convertmappings")) { - convertMappings(args); - } else { - throw new IllegalArgumentException("Command not recognized: " + command); + String command = getArg(args, 0, "command", true).toLowerCase(Locale.ROOT); + switch (command) { + case "deobfuscate": + deobfuscate(args); + break; + case "decompile": + decompile(args); + break; + case "convertmappings": + convertMappings(args); + break; + case "checkmappings": + checkMappings(args); + break; + default: + throw new IllegalArgumentException("Command not recognized: " + command); } } catch (IllegalArgumentException ex) { - System.out.println(ex.getMessage()); + System.err.println(ex.getMessage()); printHelp(); + System.exit(1); } } @@ -51,6 +63,7 @@ public class CommandMain { System.out.println("\t\tdeobfuscate []"); System.out.println("\t\tdecompile []"); System.out.println("\t\tconvertmappings "); + System.out.println("\t\tcheckmappings "); } private static void decompile(String[] args) throws Exception { @@ -100,6 +113,35 @@ public class CommandMain { saveFormat.write(mappings, result.toPath(), new ConsoleProgressListener()); } + private static void checkMappings(String[] args) throws Exception { + File fileJarIn = getReadableFile(getArg(args, 1, "in jar", true)); + Path fileMappings = getReadablePath(getArg(args, 2, "enigma mapping", true)); + + System.out.println("Reading JAR..."); + Deobfuscator deobfuscator = new Deobfuscator(new JarFile(fileJarIn)); + System.out.println("Reading mappings..."); + + MappingFormat format = chooseEnigmaFormat(fileMappings); + EntryTree mappings = format.read(fileMappings, ProgressListener.VOID); + deobfuscator.setMappings(mappings); + + JarIndex idx = deobfuscator.getJarIndex(); + + boolean error = false; + + for (Set partition : idx.getPackageVisibilityIndex().getPartitions()) { + long packages = partition.stream().map(deobfuscator.getMapper()::deobfuscate).map(ClassEntry::getPackageName).distinct().count(); + if (packages > 1) { + error = true; + System.err.println("ERROR: Must be in one package:\n" + partition.stream().map(deobfuscator.getMapper()::deobfuscate).map(ClassEntry::toString).sorted().collect(Collectors.joining("\n"))); + } + } + + if (error) { + throw new Exception("Access violations detected"); + } + } + private static MappingFormat chooseEnigmaFormat(Path path) { if (Files.isDirectory(path)) { return MappingFormat.ENIGMA_DIRECTORY; -- cgit v1.2.3