summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/cuchaz/enigma/Deobfuscator.java45
-rw-r--r--src/main/java/cuchaz/enigma/analysis/JarIndex.java29
-rw-r--r--src/main/java/cuchaz/enigma/config/Config.java4
-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;
38import oml.ast.transformers.Java8Generics; 38import oml.ast.transformers.Java8Generics;
39import oml.ast.transformers.ObfuscatedEnumSwitchRewriterTransform; 39import oml.ast.transformers.ObfuscatedEnumSwitchRewriterTransform;
40import oml.ast.transformers.RemoveObjectCasts; 40import oml.ast.transformers.RemoveObjectCasts;
41import oml.ast.transformers.VaragsFixer; 41import oml.ast.transformers.VarargsFixer;
42import org.objectweb.asm.ClassWriter; 42import org.objectweb.asm.ClassWriter;
43import org.objectweb.asm.Opcodes; 43import org.objectweb.asm.Opcodes;
44import org.objectweb.asm.tree.ClassNode; 44import 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 */
35public class VaragsFixer implements IAstTransform { 35public 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