diff options
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/cuchaz/enigma/Deobfuscator.java | 45 | ||||
| -rw-r--r-- | src/main/java/cuchaz/enigma/analysis/JarIndex.java | 29 | ||||
| -rw-r--r-- | src/main/java/cuchaz/enigma/config/Config.java | 4 | ||||
| -rw-r--r-- | src/main/java/oml/ast/transformers/VarargsFixer.java (renamed from src/main/java/oml/ast/transformers/VaragsFixer.java) | 4 |
4 files changed, 60 insertions, 22 deletions
diff --git a/src/main/java/cuchaz/enigma/Deobfuscator.java b/src/main/java/cuchaz/enigma/Deobfuscator.java index f42b59f2..0c671589 100644 --- a/src/main/java/cuchaz/enigma/Deobfuscator.java +++ b/src/main/java/cuchaz/enigma/Deobfuscator.java | |||
| @@ -38,7 +38,7 @@ import oml.ast.transformers.InvalidIdentifierFix; | |||
| 38 | import oml.ast.transformers.Java8Generics; | 38 | import oml.ast.transformers.Java8Generics; |
| 39 | import oml.ast.transformers.ObfuscatedEnumSwitchRewriterTransform; | 39 | import oml.ast.transformers.ObfuscatedEnumSwitchRewriterTransform; |
| 40 | import oml.ast.transformers.RemoveObjectCasts; | 40 | import oml.ast.transformers.RemoveObjectCasts; |
| 41 | import oml.ast.transformers.VaragsFixer; | 41 | import oml.ast.transformers.VarargsFixer; |
| 42 | import org.objectweb.asm.ClassWriter; | 42 | import org.objectweb.asm.ClassWriter; |
| 43 | import org.objectweb.asm.Opcodes; | 43 | import org.objectweb.asm.Opcodes; |
| 44 | import org.objectweb.asm.tree.ClassNode; | 44 | import org.objectweb.asm.tree.ClassNode; |
| @@ -337,6 +337,21 @@ public class Deobfuscator { | |||
| 337 | } | 337 | } |
| 338 | } | 338 | } |
| 339 | 339 | ||
| 340 | public boolean isMethodProvider(MethodEntry methodEntry) { | ||
| 341 | Set<ClassEntry> classEntries = new HashSet<>(); | ||
| 342 | addAllPotentialAncestors(classEntries, methodEntry.getOwnerClassEntry()); | ||
| 343 | |||
| 344 | for (ClassEntry parentEntry : classEntries) { | ||
| 345 | MethodEntry ancestorMethodEntry = entryPool.getMethod(parentEntry, methodEntry.getName(), methodEntry.getDesc()); | ||
| 346 | if (jarIndex.containsObfMethod(ancestorMethodEntry)) { | ||
| 347 | return false; | ||
| 348 | } | ||
| 349 | } | ||
| 350 | |||
| 351 | return true; | ||
| 352 | } | ||
| 353 | |||
| 354 | @Deprecated | ||
| 340 | public boolean isMethodProvider(ClassEntry classObfEntry, MethodEntry methodEntry) { | 355 | public boolean isMethodProvider(ClassEntry classObfEntry, MethodEntry methodEntry) { |
| 341 | Set<ClassEntry> classEntries = new HashSet<>(); | 356 | Set<ClassEntry> classEntries = new HashSet<>(); |
| 342 | addAllPotentialAncestors(classEntries, classObfEntry); | 357 | addAllPotentialAncestors(classEntries, classObfEntry); |
| @@ -379,10 +394,12 @@ public class Deobfuscator { | |||
| 379 | Entry obfEntry = entry.getKey(); | 394 | Entry obfEntry = entry.getKey(); |
| 380 | String name = entry.getValue(); | 395 | String name = entry.getValue(); |
| 381 | 396 | ||
| 382 | try { | 397 | if (name != null) { |
| 383 | rename(obfEntry, name); | 398 | try { |
| 384 | } catch (IllegalNameException exception) { | 399 | rename(obfEntry, name); |
| 385 | System.out.println("WARNING: " + exception.getMessage()); | 400 | } catch (IllegalNameException exception) { |
| 401 | System.out.println("WARNING: " + exception.getMessage()); | ||
| 402 | } | ||
| 386 | } | 403 | } |
| 387 | } | 404 | } |
| 388 | }); | 405 | }); |
| @@ -394,15 +411,15 @@ public class Deobfuscator { | |||
| 394 | for (MethodMapping methodMapping : Lists.newArrayList(classMapping.methods())) { | 411 | for (MethodMapping methodMapping : Lists.newArrayList(classMapping.methods())) { |
| 395 | ClassEntry classObfEntry = classMapping.getObfEntry(); | 412 | ClassEntry classObfEntry = classMapping.getObfEntry(); |
| 396 | MethodEntry obfEntry = methodMapping.getObfEntry(classObfEntry); | 413 | MethodEntry obfEntry = methodMapping.getObfEntry(classObfEntry); |
| 414 | boolean isProvider = isMethodProvider(obfEntry); | ||
| 397 | 415 | ||
| 398 | if (isMethodProvider(classObfEntry, obfEntry)) { | 416 | if (hasDeobfuscatedName(obfEntry) |
| 399 | if (hasDeobfuscatedName(obfEntry) | 417 | && !(methodMapping.getDeobfName().equals(methodMapping.getObfName()))) { |
| 400 | && !(methodMapping.getDeobfName().equals(methodMapping.getObfName()))) { | 418 | renameEntries.put(obfEntry, isProvider ? methodMapping.getDeobfName() : null); |
| 401 | renameEntries.put(obfEntry, methodMapping.getDeobfName()); | 419 | } |
| 402 | } | ||
| 403 | 420 | ||
| 404 | ArrayList<LocalVariableMapping> arguments = Lists.newArrayList(methodMapping.arguments()); | 421 | if (isProvider) { |
| 405 | for (LocalVariableMapping localVariableMapping : arguments) { | 422 | for (LocalVariableMapping localVariableMapping : methodMapping.arguments()) { |
| 406 | Entry argObfEntry = localVariableMapping.getObfEntry(obfEntry); | 423 | Entry argObfEntry = localVariableMapping.getObfEntry(obfEntry); |
| 407 | if (hasDeobfuscatedName(argObfEntry)) { | 424 | if (hasDeobfuscatedName(argObfEntry)) { |
| 408 | renameEntries.put(argObfEntry, deobfuscateEntry(argObfEntry).getName()); | 425 | renameEntries.put(argObfEntry, deobfuscateEntry(argObfEntry).getName()); |
| @@ -675,12 +692,12 @@ public class Deobfuscator { | |||
| 675 | public static void runCustomTransforms(AstBuilder builder, DecompilerContext context){ | 692 | public static void runCustomTransforms(AstBuilder builder, DecompilerContext context){ |
| 676 | List<IAstTransform> transformers = Arrays.asList( | 693 | List<IAstTransform> transformers = Arrays.asList( |
| 677 | new ObfuscatedEnumSwitchRewriterTransform(context), | 694 | new ObfuscatedEnumSwitchRewriterTransform(context), |
| 678 | new VaragsFixer(context), | 695 | new VarargsFixer(context), |
| 679 | new RemoveObjectCasts(context), | 696 | new RemoveObjectCasts(context), |
| 680 | new Java8Generics(), | 697 | new Java8Generics(), |
| 681 | new InvalidIdentifierFix() | 698 | new InvalidIdentifierFix() |
| 682 | ); | 699 | ); |
| 683 | for (IAstTransform transform : transformers){ | 700 | for (IAstTransform transform : transformers) { |
| 684 | transform.run(builder.getCompilationUnit()); | 701 | transform.run(builder.getCompilationUnit()); |
| 685 | } | 702 | } |
| 686 | } | 703 | } |
diff --git a/src/main/java/cuchaz/enigma/analysis/JarIndex.java b/src/main/java/cuchaz/enigma/analysis/JarIndex.java index 5917a32f..64ea7950 100644 --- a/src/main/java/cuchaz/enigma/analysis/JarIndex.java +++ b/src/main/java/cuchaz/enigma/analysis/JarIndex.java | |||
| @@ -268,13 +268,34 @@ public class JarIndex { | |||
| 268 | } | 268 | } |
| 269 | 269 | ||
| 270 | public MethodInheritanceTreeNode getMethodInheritance(Translator deobfuscatingTranslator, MethodEntry obfMethodEntry) { | 270 | public MethodInheritanceTreeNode getMethodInheritance(Translator deobfuscatingTranslator, MethodEntry obfMethodEntry) { |
| 271 | |||
| 272 | // travel to the ancestor implementation | 271 | // travel to the ancestor implementation |
| 272 | LinkedList<ClassEntry> entries = new LinkedList<>(); | ||
| 273 | entries.add(obfMethodEntry.getOwnerClassEntry()); | ||
| 274 | |||
| 275 | // TODO: This could be optimized to not go through interfaces repeatedly... | ||
| 276 | |||
| 273 | ClassEntry baseImplementationClassEntry = obfMethodEntry.getOwnerClassEntry(); | 277 | ClassEntry baseImplementationClassEntry = obfMethodEntry.getOwnerClassEntry(); |
| 274 | for (ClassEntry ancestorClassEntry : this.translationIndex.getAncestry(obfMethodEntry.getOwnerClassEntry())) { | 278 | |
| 279 | for (ClassEntry itf : getInterfaces(obfMethodEntry.getOwnerClassEntry().getClassName())) { | ||
| 280 | MethodEntry itfMethodEntry = entryPool.getMethod(itf, obfMethodEntry.getName(), obfMethodEntry.getDesc().toString()); | ||
| 281 | if (itfMethodEntry != null && containsObfMethod(itfMethodEntry)) { | ||
| 282 | baseImplementationClassEntry = itf; | ||
| 283 | } | ||
| 284 | } | ||
| 285 | |||
| 286 | for (ClassEntry ancestorClassEntry : this.translationIndex.getAncestry(entries.remove())) { | ||
| 275 | MethodEntry ancestorMethodEntry = entryPool.getMethod(ancestorClassEntry, obfMethodEntry.getName(), obfMethodEntry.getDesc().toString()); | 287 | MethodEntry ancestorMethodEntry = entryPool.getMethod(ancestorClassEntry, obfMethodEntry.getName(), obfMethodEntry.getDesc().toString()); |
| 276 | if (ancestorMethodEntry != null && containsObfMethod(ancestorMethodEntry)) { | 288 | if (ancestorMethodEntry != null) { |
| 277 | baseImplementationClassEntry = ancestorClassEntry; | 289 | if (containsObfMethod(ancestorMethodEntry)) { |
| 290 | baseImplementationClassEntry = ancestorClassEntry; | ||
| 291 | } | ||
| 292 | |||
| 293 | for (ClassEntry itf : getInterfaces(ancestorClassEntry.getClassName())) { | ||
| 294 | MethodEntry itfMethodEntry = entryPool.getMethod(itf, obfMethodEntry.getName(), obfMethodEntry.getDesc().toString()); | ||
| 295 | if (itfMethodEntry != null && containsObfMethod(itfMethodEntry)) { | ||
| 296 | baseImplementationClassEntry = itf; | ||
| 297 | } | ||
| 298 | } | ||
| 278 | } | 299 | } |
| 279 | } | 300 | } |
| 280 | 301 | ||
diff --git a/src/main/java/cuchaz/enigma/config/Config.java b/src/main/java/cuchaz/enigma/config/Config.java index 87ef3531..75ced70c 100644 --- a/src/main/java/cuchaz/enigma/config/Config.java +++ b/src/main/java/cuchaz/enigma/config/Config.java | |||
| @@ -62,7 +62,7 @@ public class Config { | |||
| 62 | public void loadConfig() throws IOException { | 62 | public void loadConfig() throws IOException { |
| 63 | if (!ENIGMA_DIR.exists()) ENIGMA_DIR.mkdirs(); | 63 | if (!ENIGMA_DIR.exists()) ENIGMA_DIR.mkdirs(); |
| 64 | File configFile = new File(ENIGMA_DIR, "config.json"); | 64 | File configFile = new File(ENIGMA_DIR, "config.json"); |
| 65 | if (configFile.exists()) gson.fromJson(Files.toString(configFile, Charset.defaultCharset()), Config.class); | 65 | if (configFile.exists()) gson.fromJson(Files.asCharSource(configFile, Charset.defaultCharset()).read(), Config.class); |
| 66 | else { | 66 | else { |
| 67 | this.reset(); | 67 | this.reset(); |
| 68 | Files.touch(configFile); | 68 | Files.touch(configFile); |
| @@ -71,7 +71,7 @@ public class Config { | |||
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | public void saveConfig() throws IOException { | 73 | public void saveConfig() throws IOException { |
| 74 | Files.write(gson.toJson(this), CONFIG_FILE, Charset.defaultCharset()); | 74 | Files.asCharSink(CONFIG_FILE, Charset.defaultCharset()).write(gson.toJson(this)); |
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | public void reset() throws IOException { | 77 | public void reset() throws IOException { |
diff --git a/src/main/java/oml/ast/transformers/VaragsFixer.java b/src/main/java/oml/ast/transformers/VarargsFixer.java index cd711ae0..5810373d 100644 --- a/src/main/java/oml/ast/transformers/VaragsFixer.java +++ b/src/main/java/oml/ast/transformers/VarargsFixer.java | |||
| @@ -32,10 +32,10 @@ import java.util.List; | |||
| 32 | /** | 32 | /** |
| 33 | * Created by Thiakil on 12/07/2018. | 33 | * Created by Thiakil on 12/07/2018. |
| 34 | */ | 34 | */ |
| 35 | public class VaragsFixer implements IAstTransform { | 35 | public class VarargsFixer implements IAstTransform { |
| 36 | private final DecompilerContext _context; | 36 | private final DecompilerContext _context; |
| 37 | 37 | ||
| 38 | public VaragsFixer(final DecompilerContext context) { | 38 | public VarargsFixer(final DecompilerContext context) { |
| 39 | _context = VerifyArgument.notNull(context, "context"); | 39 | _context = VerifyArgument.notNull(context, "context"); |
| 40 | } | 40 | } |
| 41 | 41 | ||