diff options
| author | 2015-02-02 21:26:10 -0500 | |
|---|---|---|
| committer | 2015-02-02 21:26:10 -0500 | |
| commit | 448685653e90415ebe10b08e8335462b81c30421 (patch) | |
| tree | 474d9bcc08c2b5441b704595992d3beff1d2587f /src | |
| parent | avoid concurrent modification exception (diff) | |
| download | enigma-448685653e90415ebe10b08e8335462b81c30421.tar.gz enigma-448685653e90415ebe10b08e8335462b81c30421.tar.xz enigma-448685653e90415ebe10b08e8335462b81c30421.zip | |
fix issue with bridge methods
Diffstat (limited to 'src')
| -rw-r--r-- | src/cuchaz/enigma/CommandMain.java | 9 | ||||
| -rw-r--r-- | src/cuchaz/enigma/Deobfuscator.java | 8 | ||||
| -rw-r--r-- | src/cuchaz/enigma/TranslatingTypeLoader.java | 4 | ||||
| -rw-r--r-- | src/cuchaz/enigma/analysis/BridgeFixer.java | 72 | ||||
| -rw-r--r-- | src/cuchaz/enigma/gui/Gui.java | 3 | ||||
| -rw-r--r-- | src/cuchaz/enigma/gui/GuiController.java | 5 |
6 files changed, 14 insertions, 87 deletions
diff --git a/src/cuchaz/enigma/CommandMain.java b/src/cuchaz/enigma/CommandMain.java index 74bd4991..1ec2ad23 100644 --- a/src/cuchaz/enigma/CommandMain.java +++ b/src/cuchaz/enigma/CommandMain.java | |||
| @@ -2,6 +2,7 @@ package cuchaz.enigma; | |||
| 2 | 2 | ||
| 3 | import java.io.File; | 3 | import java.io.File; |
| 4 | import java.io.FileReader; | 4 | import java.io.FileReader; |
| 5 | import java.util.jar.JarFile; | ||
| 5 | 6 | ||
| 6 | import cuchaz.enigma.Deobfuscator.ProgressListener; | 7 | import cuchaz.enigma.Deobfuscator.ProgressListener; |
| 7 | import cuchaz.enigma.mapping.Mappings; | 8 | import cuchaz.enigma.mapping.Mappings; |
| @@ -78,7 +79,7 @@ public class CommandMain { | |||
| 78 | File fileMappings = getReadableFile(getArg(args, 1, "mappings file")); | 79 | File fileMappings = getReadableFile(getArg(args, 1, "mappings file")); |
| 79 | File fileJarIn = getReadableFile(getArg(args, 2, "in jar")); | 80 | File fileJarIn = getReadableFile(getArg(args, 2, "in jar")); |
| 80 | File fileJarOut = getWritableFolder(getArg(args, 3, "out folder")); | 81 | File fileJarOut = getWritableFolder(getArg(args, 3, "out folder")); |
| 81 | Deobfuscator deobfuscator = getDeobfuscator(fileMappings, fileJarIn); | 82 | Deobfuscator deobfuscator = getDeobfuscator(fileMappings, new JarFile(fileJarIn)); |
| 82 | deobfuscator.writeSources(fileJarOut, new ConsoleProgressListener()); | 83 | deobfuscator.writeSources(fileJarOut, new ConsoleProgressListener()); |
| 83 | } | 84 | } |
| 84 | 85 | ||
| @@ -87,16 +88,16 @@ public class CommandMain { | |||
| 87 | File fileMappings = getReadableFile(getArg(args, 1, "mappings file")); | 88 | File fileMappings = getReadableFile(getArg(args, 1, "mappings file")); |
| 88 | File fileJarIn = getReadableFile(getArg(args, 2, "in jar")); | 89 | File fileJarIn = getReadableFile(getArg(args, 2, "in jar")); |
| 89 | File fileJarOut = getWritableFile(getArg(args, 3, "out jar")); | 90 | File fileJarOut = getWritableFile(getArg(args, 3, "out jar")); |
| 90 | Deobfuscator deobfuscator = getDeobfuscator(fileMappings, fileJarIn); | 91 | Deobfuscator deobfuscator = getDeobfuscator(fileMappings, new JarFile(fileJarIn)); |
| 91 | deobfuscator.writeJar(fileJarOut, new ConsoleProgressListener()); | 92 | deobfuscator.writeJar(fileJarOut, new ConsoleProgressListener()); |
| 92 | } | 93 | } |
| 93 | 94 | ||
| 94 | private static Deobfuscator getDeobfuscator(File fileMappings, File fileJar) | 95 | private static Deobfuscator getDeobfuscator(File fileMappings, JarFile jar) |
| 95 | throws Exception { | 96 | throws Exception { |
| 96 | System.out.println("Reading mappings..."); | 97 | System.out.println("Reading mappings..."); |
| 97 | Mappings mappings = new MappingsReader().read(new FileReader(fileMappings)); | 98 | Mappings mappings = new MappingsReader().read(new FileReader(fileMappings)); |
| 98 | System.out.println("Reading jar..."); | 99 | System.out.println("Reading jar..."); |
| 99 | Deobfuscator deobfuscator = new Deobfuscator(fileJar); | 100 | Deobfuscator deobfuscator = new Deobfuscator(jar); |
| 100 | deobfuscator.setMappings(mappings); | 101 | deobfuscator.setMappings(mappings); |
| 101 | return deobfuscator; | 102 | return deobfuscator; |
| 102 | } | 103 | } |
diff --git a/src/cuchaz/enigma/Deobfuscator.java b/src/cuchaz/enigma/Deobfuscator.java index 22c517a1..62c062a5 100644 --- a/src/cuchaz/enigma/Deobfuscator.java +++ b/src/cuchaz/enigma/Deobfuscator.java | |||
| @@ -68,7 +68,6 @@ public class Deobfuscator { | |||
| 68 | void onProgress(int numDone, String message); | 68 | void onProgress(int numDone, String message); |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | private File m_file; | ||
| 72 | private JarFile m_jar; | 71 | private JarFile m_jar; |
| 73 | private DecompilerSettings m_settings; | 72 | private DecompilerSettings m_settings; |
| 74 | private JarIndex m_jarIndex; | 73 | private JarIndex m_jarIndex; |
| @@ -76,9 +75,8 @@ public class Deobfuscator { | |||
| 76 | private MappingsRenamer m_renamer; | 75 | private MappingsRenamer m_renamer; |
| 77 | private Map<TranslationDirection,Translator> m_translatorCache; | 76 | private Map<TranslationDirection,Translator> m_translatorCache; |
| 78 | 77 | ||
| 79 | public Deobfuscator(File file) throws IOException { | 78 | public Deobfuscator(JarFile jar) throws IOException { |
| 80 | m_file = file; | 79 | m_jar = jar; |
| 81 | m_jar = new JarFile(m_file); | ||
| 82 | 80 | ||
| 83 | // build the jar index | 81 | // build the jar index |
| 84 | m_jarIndex = new JarIndex(); | 82 | m_jarIndex = new JarIndex(); |
| @@ -100,7 +98,7 @@ public class Deobfuscator { | |||
| 100 | } | 98 | } |
| 101 | 99 | ||
| 102 | public String getJarName() { | 100 | public String getJarName() { |
| 103 | return m_file.getName(); | 101 | return m_jar.getName(); |
| 104 | } | 102 | } |
| 105 | 103 | ||
| 106 | public JarIndex getJarIndex() { | 104 | public JarIndex getJarIndex() { |
diff --git a/src/cuchaz/enigma/TranslatingTypeLoader.java b/src/cuchaz/enigma/TranslatingTypeLoader.java index 091f916d..9287999b 100644 --- a/src/cuchaz/enigma/TranslatingTypeLoader.java +++ b/src/cuchaz/enigma/TranslatingTypeLoader.java | |||
| @@ -29,7 +29,6 @@ import com.strobel.assembler.metadata.Buffer; | |||
| 29 | import com.strobel.assembler.metadata.ClasspathTypeLoader; | 29 | import com.strobel.assembler.metadata.ClasspathTypeLoader; |
| 30 | import com.strobel.assembler.metadata.ITypeLoader; | 30 | import com.strobel.assembler.metadata.ITypeLoader; |
| 31 | 31 | ||
| 32 | import cuchaz.enigma.analysis.BridgeFixer; | ||
| 33 | import cuchaz.enigma.analysis.JarIndex; | 32 | import cuchaz.enigma.analysis.JarIndex; |
| 34 | import cuchaz.enigma.bytecode.ClassRenamer; | 33 | import cuchaz.enigma.bytecode.ClassRenamer; |
| 35 | import cuchaz.enigma.bytecode.ClassTranslator; | 34 | import cuchaz.enigma.bytecode.ClassTranslator; |
| @@ -168,7 +167,7 @@ public class TranslatingTypeLoader implements ITypeLoader { | |||
| 168 | assertClassName(c, deobfClassEntry); | 167 | assertClassName(c, deobfClassEntry); |
| 169 | 168 | ||
| 170 | // DEBUG | 169 | // DEBUG |
| 171 | // Util.writeClass( c ); | 170 | Util.writeClass( c ); |
| 172 | 171 | ||
| 173 | // we have a transformed class! | 172 | // we have a transformed class! |
| 174 | return c.toBytecode(); | 173 | return c.toBytecode(); |
| @@ -196,7 +195,6 @@ public class TranslatingTypeLoader implements ITypeLoader { | |||
| 196 | assertClassName(c, obfClassEntry); | 195 | assertClassName(c, obfClassEntry); |
| 197 | 196 | ||
| 198 | // do all kinds of deobfuscating transformations on the class | 197 | // do all kinds of deobfuscating transformations on the class |
| 199 | new BridgeFixer(m_jarIndex).fixBridges(c); | ||
| 200 | new MethodParameterWriter(m_deobfuscatingTranslator).writeMethodArguments(c); | 198 | new MethodParameterWriter(m_deobfuscatingTranslator).writeMethodArguments(c); |
| 201 | new ClassTranslator(m_deobfuscatingTranslator).translate(c); | 199 | new ClassTranslator(m_deobfuscatingTranslator).translate(c); |
| 202 | 200 | ||
diff --git a/src/cuchaz/enigma/analysis/BridgeFixer.java b/src/cuchaz/enigma/analysis/BridgeFixer.java deleted file mode 100644 index ad23b000..00000000 --- a/src/cuchaz/enigma/analysis/BridgeFixer.java +++ /dev/null | |||
| @@ -1,72 +0,0 @@ | |||
| 1 | /******************************************************************************* | ||
| 2 | * Copyright (c) 2014 Jeff Martin. | ||
| 3 | * All rights reserved. This program and the accompanying materials | ||
| 4 | * are made available under the terms of the GNU Public License v3.0 | ||
| 5 | * which accompanies this distribution, and is available at | ||
| 6 | * http://www.gnu.org/licenses/gpl.html | ||
| 7 | * | ||
| 8 | * Contributors: | ||
| 9 | * Jeff Martin - initial API and implementation | ||
| 10 | ******************************************************************************/ | ||
| 11 | package cuchaz.enigma.analysis; | ||
| 12 | |||
| 13 | import javassist.CtClass; | ||
| 14 | import javassist.CtMethod; | ||
| 15 | import javassist.bytecode.ConstPool; | ||
| 16 | import javassist.bytecode.Descriptor; | ||
| 17 | import cuchaz.enigma.bytecode.ConstPoolEditor; | ||
| 18 | import cuchaz.enigma.mapping.BehaviorEntry; | ||
| 19 | import cuchaz.enigma.mapping.BehaviorEntryFactory; | ||
| 20 | import cuchaz.enigma.mapping.ClassEntry; | ||
| 21 | import cuchaz.enigma.mapping.MethodEntry; | ||
| 22 | |||
| 23 | public class BridgeFixer { | ||
| 24 | |||
| 25 | private JarIndex m_index; | ||
| 26 | |||
| 27 | public BridgeFixer(JarIndex index) { | ||
| 28 | m_index = index; | ||
| 29 | } | ||
| 30 | |||
| 31 | public void fixBridges(CtClass c) { | ||
| 32 | // rename declared methods | ||
| 33 | for (CtMethod method : c.getDeclaredMethods()) { | ||
| 34 | // get the method entry | ||
| 35 | MethodEntry methodEntry = new MethodEntry( | ||
| 36 | new ClassEntry(Descriptor.toJvmName(c.getName())), | ||
| 37 | method.getName(), | ||
| 38 | method.getSignature() | ||
| 39 | ); | ||
| 40 | MethodEntry bridgeMethodEntry = m_index.getBridgeMethod(methodEntry); | ||
| 41 | if (bridgeMethodEntry != null) { | ||
| 42 | // fix this bridged method | ||
| 43 | method.setName(bridgeMethodEntry.getName()); | ||
| 44 | } | ||
| 45 | } | ||
| 46 | |||
| 47 | // rename method references | ||
| 48 | // translate all the field and method references in the code by editing the constant pool | ||
| 49 | ConstPool constants = c.getClassFile().getConstPool(); | ||
| 50 | ConstPoolEditor editor = new ConstPoolEditor(constants); | ||
| 51 | for (int i = 1; i < constants.getSize(); i++) { | ||
| 52 | switch (constants.getTag(i)) { | ||
| 53 | case ConstPool.CONST_Methodref: | ||
| 54 | case ConstPool.CONST_InterfaceMethodref: { | ||
| 55 | BehaviorEntry behaviorEntry = BehaviorEntryFactory.create(Descriptor.toJvmName(editor.getMemberrefClassname(i)), editor.getMemberrefName(i), editor.getMemberrefType(i)); | ||
| 56 | |||
| 57 | if (behaviorEntry instanceof MethodEntry) { | ||
| 58 | MethodEntry methodEntry = (MethodEntry)behaviorEntry; | ||
| 59 | |||
| 60 | // translate the name and type | ||
| 61 | MethodEntry bridgeMethodEntry = m_index.getBridgeMethod(methodEntry); | ||
| 62 | if (bridgeMethodEntry != null) { | ||
| 63 | // FIXIT FIXIT FIXIT FIXIT FIXIT FIXIT FIXIT | ||
| 64 | editor.changeMemberrefNameAndType(i, bridgeMethodEntry.getName(), bridgeMethodEntry.getSignature()); | ||
| 65 | } | ||
| 66 | } | ||
| 67 | } | ||
| 68 | break; | ||
| 69 | } | ||
| 70 | } | ||
| 71 | } | ||
| 72 | } | ||
diff --git a/src/cuchaz/enigma/gui/Gui.java b/src/cuchaz/enigma/gui/Gui.java index 86ba93b2..e652202c 100644 --- a/src/cuchaz/enigma/gui/Gui.java +++ b/src/cuchaz/enigma/gui/Gui.java | |||
| @@ -33,6 +33,7 @@ import java.util.Collection; | |||
| 33 | import java.util.Collections; | 33 | import java.util.Collections; |
| 34 | import java.util.List; | 34 | import java.util.List; |
| 35 | import java.util.Vector; | 35 | import java.util.Vector; |
| 36 | import java.util.jar.JarFile; | ||
| 36 | 37 | ||
| 37 | import javax.swing.BorderFactory; | 38 | import javax.swing.BorderFactory; |
| 38 | import javax.swing.JEditorPane; | 39 | import javax.swing.JEditorPane; |
| @@ -499,7 +500,7 @@ public class Gui { | |||
| 499 | @Override | 500 | @Override |
| 500 | public void run() { | 501 | public void run() { |
| 501 | try { | 502 | try { |
| 502 | m_controller.openJar(m_jarFileChooser.getSelectedFile()); | 503 | m_controller.openJar(new JarFile(m_jarFileChooser.getSelectedFile())); |
| 503 | } catch (IOException ex) { | 504 | } catch (IOException ex) { |
| 504 | throw new Error(ex); | 505 | throw new Error(ex); |
| 505 | } | 506 | } |
diff --git a/src/cuchaz/enigma/gui/GuiController.java b/src/cuchaz/enigma/gui/GuiController.java index 908c16fa..61fea9c0 100644 --- a/src/cuchaz/enigma/gui/GuiController.java +++ b/src/cuchaz/enigma/gui/GuiController.java | |||
| @@ -17,6 +17,7 @@ import java.io.IOException; | |||
| 17 | import java.util.Collection; | 17 | import java.util.Collection; |
| 18 | import java.util.Deque; | 18 | import java.util.Deque; |
| 19 | import java.util.List; | 19 | import java.util.List; |
| 20 | import java.util.jar.JarFile; | ||
| 20 | 21 | ||
| 21 | import com.google.common.collect.Lists; | 22 | import com.google.common.collect.Lists; |
| 22 | import com.google.common.collect.Queues; | 23 | import com.google.common.collect.Queues; |
| @@ -66,9 +67,9 @@ public class GuiController { | |||
| 66 | return m_isDirty; | 67 | return m_isDirty; |
| 67 | } | 68 | } |
| 68 | 69 | ||
| 69 | public void openJar(final File file) throws IOException { | 70 | public void openJar(final JarFile jar) throws IOException { |
| 70 | m_gui.onStartOpenJar(); | 71 | m_gui.onStartOpenJar(); |
| 71 | m_deobfuscator = new Deobfuscator(file); | 72 | m_deobfuscator = new Deobfuscator(jar); |
| 72 | m_gui.onFinishOpenJar(m_deobfuscator.getJarName()); | 73 | m_gui.onFinishOpenJar(m_deobfuscator.getJarName()); |
| 73 | refreshClasses(); | 74 | refreshClasses(); |
| 74 | } | 75 | } |