From 6235bfc5ab85cdd471e315c52c413991fb9dbddf Mon Sep 17 00:00:00 2001 From: Thog Date: Sun, 30 Oct 2016 23:37:29 +0100 Subject: BREAKING CHANGE: Implement modifier transformer Known Bugs: - Inner class modifier isn't saved to mapping - Inner class modifier isn't applied to bytecode --- .../cuchaz/enigma/bytecode/InnerClassWriter.java | 39 +++++++++++++++++----- 1 file changed, 31 insertions(+), 8 deletions(-) (limited to 'src/main/java/cuchaz/enigma/bytecode/InnerClassWriter.java') diff --git a/src/main/java/cuchaz/enigma/bytecode/InnerClassWriter.java b/src/main/java/cuchaz/enigma/bytecode/InnerClassWriter.java index 6d92610..6e2a29d 100644 --- a/src/main/java/cuchaz/enigma/bytecode/InnerClassWriter.java +++ b/src/main/java/cuchaz/enigma/bytecode/InnerClassWriter.java @@ -15,22 +15,22 @@ import com.google.common.collect.Lists; import java.util.Collection; import java.util.List; +import cuchaz.enigma.Deobfuscator; import cuchaz.enigma.analysis.JarIndex; -import cuchaz.enigma.mapping.BehaviorEntry; -import cuchaz.enigma.mapping.ClassEntry; -import cuchaz.enigma.mapping.EntryFactory; +import cuchaz.enigma.mapping.*; +import javassist.ClassPool; import javassist.CtClass; -import javassist.bytecode.AccessFlag; -import javassist.bytecode.ConstPool; -import javassist.bytecode.EnclosingMethodAttribute; -import javassist.bytecode.InnerClassesAttribute; +import javassist.NotFoundException; +import javassist.bytecode.*; public class InnerClassWriter { private JarIndex index; + private Translator deobfuscatorTranslator; - public InnerClassWriter(JarIndex index) { + public InnerClassWriter(JarIndex index, Translator deobfuscatorTranslator) { this.index = index; + this.deobfuscatorTranslator = deobfuscatorTranslator; } public void write(CtClass c) { @@ -96,6 +96,29 @@ public class InnerClassWriter { } } + // FIXME: modiffier is not applied to inner class + public static void changeModifier(CtClass c, InnerClassesAttribute attr, Translator translator) + { + ClassPool pool = c.getClassPool(); + for (int i = 0; i < attr.tableLength(); i++) { + + String innerName = attr.innerClass(i); + // get the inner class full name (which has already been translated) + ClassEntry classEntry = new ClassEntry(Descriptor.toJvmName(innerName)); + try + { + CtClass innerClass = pool.get(innerName); + Mappings.EntryModifier modifier = translator.getModifier(classEntry); + if (modifier != null && modifier != Mappings.EntryModifier.UNCHANGED) + ClassRenamer.applyModifier(innerClass, modifier); + } catch (NotFoundException e) + { + // This shouldn't be possible in theory + //e.printStackTrace(); + } + } + } + private void writeInnerClass(InnerClassesAttribute attr, List obfClassChain, ClassEntry obfClassEntry) { // get the new inner class name -- cgit v1.2.3