summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar jeff2015-02-02 21:26:10 -0500
committerGravatar jeff2015-02-02 21:26:10 -0500
commit448685653e90415ebe10b08e8335462b81c30421 (patch)
tree474d9bcc08c2b5441b704595992d3beff1d2587f /src
parentavoid concurrent modification exception (diff)
downloadenigma-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.java9
-rw-r--r--src/cuchaz/enigma/Deobfuscator.java8
-rw-r--r--src/cuchaz/enigma/TranslatingTypeLoader.java4
-rw-r--r--src/cuchaz/enigma/analysis/BridgeFixer.java72
-rw-r--r--src/cuchaz/enigma/gui/Gui.java3
-rw-r--r--src/cuchaz/enigma/gui/GuiController.java5
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
3import java.io.File; 3import java.io.File;
4import java.io.FileReader; 4import java.io.FileReader;
5import java.util.jar.JarFile;
5 6
6import cuchaz.enigma.Deobfuscator.ProgressListener; 7import cuchaz.enigma.Deobfuscator.ProgressListener;
7import cuchaz.enigma.mapping.Mappings; 8import 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;
29import com.strobel.assembler.metadata.ClasspathTypeLoader; 29import com.strobel.assembler.metadata.ClasspathTypeLoader;
30import com.strobel.assembler.metadata.ITypeLoader; 30import com.strobel.assembler.metadata.ITypeLoader;
31 31
32import cuchaz.enigma.analysis.BridgeFixer;
33import cuchaz.enigma.analysis.JarIndex; 32import cuchaz.enigma.analysis.JarIndex;
34import cuchaz.enigma.bytecode.ClassRenamer; 33import cuchaz.enigma.bytecode.ClassRenamer;
35import cuchaz.enigma.bytecode.ClassTranslator; 34import 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 ******************************************************************************/
11package cuchaz.enigma.analysis;
12
13import javassist.CtClass;
14import javassist.CtMethod;
15import javassist.bytecode.ConstPool;
16import javassist.bytecode.Descriptor;
17import cuchaz.enigma.bytecode.ConstPoolEditor;
18import cuchaz.enigma.mapping.BehaviorEntry;
19import cuchaz.enigma.mapping.BehaviorEntryFactory;
20import cuchaz.enigma.mapping.ClassEntry;
21import cuchaz.enigma.mapping.MethodEntry;
22
23public 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;
33import java.util.Collections; 33import java.util.Collections;
34import java.util.List; 34import java.util.List;
35import java.util.Vector; 35import java.util.Vector;
36import java.util.jar.JarFile;
36 37
37import javax.swing.BorderFactory; 38import javax.swing.BorderFactory;
38import javax.swing.JEditorPane; 39import 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;
17import java.util.Collection; 17import java.util.Collection;
18import java.util.Deque; 18import java.util.Deque;
19import java.util.List; 19import java.util.List;
20import java.util.jar.JarFile;
20 21
21import com.google.common.collect.Lists; 22import com.google.common.collect.Lists;
22import com.google.common.collect.Queues; 23import 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 }