From a88175ffc95792b88a8724f66db6dda2b8cc32ee Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Tue, 17 Jul 2018 19:14:08 +0200 Subject: ASM Based Class Translator (#1) * Initial port to ASM * Package updates * Annotation + inner class translation * Fix inner class mapping * More bytecode translation * Signature refactoring * Fix highlighting of mapped names * Fix parameter name offset * Fix anonymous class generation * Fix issues with inner class signature transformation * Fix bridged method detection * Fix compile issues * Resolve all failed tests * Apply deobfuscated name to transformed classes * Fix class signatures not being translated * Fix frame array type translation * Fix frame array type translation * Fix array translation in method calls * Fix method reference and bridge detection * Fix handling of null deobf mappings * Parameter translation in interfaces * Fix enum parameter index offset * Fix parsed local variable indexing * Fix stackoverflow on rebuilding method names * Ignore invalid decompiled variable indices * basic source jar * Output directly to file on source export * Make decompile parallel * fix incorrect super calls * Use previous save state to delete old mapping files * Fix old mappings not properly being removed * Fix old mappings not properly being removed * make isMethodProvider public (cherry picked from commit ebad6a9) * speed up Deobfuscator's getSources by using a single TranslatingTypeloader and caching the ClassLoaderTypeloader * ignore .idea project folders * move SynchronizedTypeLoader to a non-inner * fix signature remap of inners for now * index & resolve method/field references for usages view * Allow reader/writer subclasses to provide the underlying file operations * fix giving obf classes a name not removing them from the panel * buffer the ParsedJar class entry inputstream, allow use with a jarinputstream * make CachingClasspathTypeLoader public * make CachingClasspathTypeLoader public * support enum switches with obfuscated SwitchMaps --- src/test/java/cuchaz/enigma/TestInnerClasses.java | 49 ++++------------------- 1 file changed, 8 insertions(+), 41 deletions(-) (limited to 'src/test/java/cuchaz/enigma/TestInnerClasses.java') diff --git a/src/test/java/cuchaz/enigma/TestInnerClasses.java b/src/test/java/cuchaz/enigma/TestInnerClasses.java index 38db0df..843a63c 100644 --- a/src/test/java/cuchaz/enigma/TestInnerClasses.java +++ b/src/test/java/cuchaz/enigma/TestInnerClasses.java @@ -12,7 +12,9 @@ package cuchaz.enigma; import cuchaz.enigma.analysis.JarIndex; -import cuchaz.enigma.mapping.ClassEntry; +import cuchaz.enigma.analysis.ParsedJar; +import cuchaz.enigma.mapping.entry.ClassEntry; +import cuchaz.enigma.mapping.entry.ReferencedEntryPool; import org.junit.Test; import java.util.jar.JarFile; @@ -26,16 +28,10 @@ import static org.hamcrest.Matchers.nullValue; public class TestInnerClasses { - private static final ClassEntry AnonymousOuter = newClass("a"); - private static final ClassEntry AnonymousInner = newClass("a$1"); private static final ClassEntry SimpleOuter = newClass("d"); private static final ClassEntry SimpleInner = newClass("d$a"); private static final ClassEntry ConstructorArgsOuter = newClass("c"); private static final ClassEntry ConstructorArgsInner = newClass("c$a"); - private static final ClassEntry AnonymousWithScopeArgsOuter = newClass("b"); - private static final ClassEntry AnonymousWithScopeArgsInner = newClass("b$1"); - private static final ClassEntry AnonymousWithOuterAccessOuter = newClass("e"); - private static final ClassEntry AnonymousWithOuterAccessInner = newClass("e$1"); private static final ClassEntry ClassTreeRoot = newClass("f"); private static final ClassEntry ClassTreeLevel1 = newClass("f$a"); private static final ClassEntry ClassTreeLevel2 = newClass("f$a$a"); @@ -45,8 +41,8 @@ public class TestInnerClasses { public TestInnerClasses() throws Exception { - index = new JarIndex(); - JarFile jar = new JarFile("build/test-obf/innerClasses.jar"); + index = new JarIndex(new ReferencedEntryPool()); + ParsedJar jar = new ParsedJar(new JarFile("build/test-obf/innerClasses.jar")); index.indexJar(jar, true); deobfuscator = new Deobfuscator(jar); } @@ -55,42 +51,16 @@ public class TestInnerClasses { public void simple() { assertThat(index.getOuterClass(SimpleInner), is(SimpleOuter)); assertThat(index.getInnerClasses(SimpleOuter), containsInAnyOrder(SimpleInner)); - assertThat(index.isAnonymousClass(SimpleInner), is(false)); decompile(SimpleOuter); } - @Test - public void anonymous() { - assertThat(index.getOuterClass(AnonymousInner), is(AnonymousOuter)); - assertThat(index.getInnerClasses(AnonymousOuter), containsInAnyOrder(AnonymousInner)); - assertThat(index.isAnonymousClass(AnonymousInner), is(true)); - decompile(AnonymousOuter); - } - @Test public void constructorArgs() { assertThat(index.getOuterClass(ConstructorArgsInner), is(ConstructorArgsOuter)); assertThat(index.getInnerClasses(ConstructorArgsOuter), containsInAnyOrder(ConstructorArgsInner)); - assertThat(index.isAnonymousClass(ConstructorArgsInner), is(false)); decompile(ConstructorArgsOuter); } - @Test - public void anonymousWithScopeArgs() { - assertThat(index.getOuterClass(AnonymousWithScopeArgsInner), is(AnonymousWithScopeArgsOuter)); - assertThat(index.getInnerClasses(AnonymousWithScopeArgsOuter), containsInAnyOrder(AnonymousWithScopeArgsInner)); - assertThat(index.isAnonymousClass(AnonymousWithScopeArgsInner), is(true)); - decompile(AnonymousWithScopeArgsOuter); - } - - @Test - public void anonymousWithOuterAccess() { - assertThat(index.getOuterClass(AnonymousWithOuterAccessInner), is(AnonymousWithOuterAccessOuter)); - assertThat(index.getInnerClasses(AnonymousWithOuterAccessOuter), containsInAnyOrder(AnonymousWithOuterAccessInner)); - assertThat(index.isAnonymousClass(AnonymousWithOuterAccessInner), is(true)); - decompile(AnonymousWithOuterAccessOuter); - } - @Test public void classTree() { @@ -101,8 +71,7 @@ public class TestInnerClasses { // level 1 ClassEntry fullClassEntry = new ClassEntry(ClassTreeRoot.getName() - + "$" + ClassTreeLevel1.getInnermostClassName() - ); + + "$" + ClassTreeLevel1.getInnermostClassName()); assertThat(index.containsObfClass(fullClassEntry), is(true)); assertThat(index.getOuterClass(ClassTreeLevel1), is(ClassTreeRoot)); assertThat(index.getInnerClasses(ClassTreeLevel1), containsInAnyOrder(ClassTreeLevel2)); @@ -110,8 +79,7 @@ public class TestInnerClasses { // level 2 fullClassEntry = new ClassEntry(ClassTreeRoot.getName() + "$" + ClassTreeLevel1.getInnermostClassName() - + "$" + ClassTreeLevel2.getInnermostClassName() - ); + + "$" + ClassTreeLevel2.getInnermostClassName()); assertThat(index.containsObfClass(fullClassEntry), is(true)); assertThat(index.getOuterClass(ClassTreeLevel2), is(ClassTreeLevel1)); assertThat(index.getInnerClasses(ClassTreeLevel2), containsInAnyOrder(ClassTreeLevel3)); @@ -120,8 +88,7 @@ public class TestInnerClasses { fullClassEntry = new ClassEntry(ClassTreeRoot.getName() + "$" + ClassTreeLevel1.getInnermostClassName() + "$" + ClassTreeLevel2.getInnermostClassName() - + "$" + ClassTreeLevel3.getInnermostClassName() - ); + + "$" + ClassTreeLevel3.getInnermostClassName()); assertThat(index.containsObfClass(fullClassEntry), is(true)); assertThat(index.getOuterClass(ClassTreeLevel3), is(ClassTreeLevel2)); assertThat(index.getInnerClasses(ClassTreeLevel3), is(empty())); -- cgit v1.2.3