summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar jeff2015-03-11 11:44:24 -0400
committerGravatar jeff2015-03-11 11:44:24 -0400
commitdc2120999c137aa4763ea2358b8df83f4098d280 (patch)
treeadf96d87f675e76ab3beebadac9c35c1e04b5517
parentgeneralized field matching (diff)
downloadenigma-dc2120999c137aa4763ea2358b8df83f4098d280.tar.gz
enigma-dc2120999c137aa4763ea2358b8df83f4098d280.tar.xz
enigma-dc2120999c137aa4763ea2358b8df83f4098d280.zip
working on writing mappings based on all the matches
-rw-r--r--src/cuchaz/enigma/ConvertMain.java50
-rw-r--r--src/cuchaz/enigma/convert/MappingsConverter.java50
-rw-r--r--src/cuchaz/enigma/mapping/ClassMapping.java18
-rw-r--r--src/cuchaz/enigma/mapping/FieldMapping.java4
-rw-r--r--src/cuchaz/enigma/mapping/MethodMapping.java4
5 files changed, 109 insertions, 17 deletions
diff --git a/src/cuchaz/enigma/ConvertMain.java b/src/cuchaz/enigma/ConvertMain.java
index c3a2ad5c..15658d90 100644
--- a/src/cuchaz/enigma/ConvertMain.java
+++ b/src/cuchaz/enigma/ConvertMain.java
@@ -49,15 +49,10 @@ public class ConvertMain {
49 49
50 // match methods/constructors 50 // match methods/constructors
51 //computeMethodMatches(methodMatchesFile, destJar, outMappingsFile, classMatchesFile); 51 //computeMethodMatches(methodMatchesFile, destJar, outMappingsFile, classMatchesFile);
52 editMethodMatches(sourceJar, destJar, outMappingsFile, mappings, classMatchesFile, methodMatchesFile); 52 //editMethodMatches(sourceJar, destJar, outMappingsFile, mappings, classMatchesFile, methodMatchesFile);
53 53
54 /* TODO 54 // write final converted mappings
55 // write out the converted mappings 55 writeFinalMappings(outMappingsFile, sourceJar, destJar, mappings, classMatchesFile, fieldMatchesFile, methodMatchesFile);
56 FileWriter writer = new FileWriter(outMappingsFile);
57 new MappingsWriter().write(writer, mappings);
58 writer.close();
59 System.out.println("Wrote converted mappings to:\n\t" + outMappingsFile.getAbsolutePath());
60 */
61 } 56 }
62 57
63 private static void computeClassMatches(File classMatchesFile, JarFile sourceJar, JarFile destJar, Mappings mappings) 58 private static void computeClassMatches(File classMatchesFile, JarFile sourceJar, JarFile destJar, Mappings mappings)
@@ -93,7 +88,7 @@ public class ConvertMain {
93 Deobfuscators deobfuscators = new Deobfuscators(sourceJar, destJar); 88 Deobfuscators deobfuscators = new Deobfuscators(sourceJar, destJar);
94 deobfuscators.source.setMappings(mappings); 89 deobfuscators.source.setMappings(mappings);
95 90
96 Mappings newMappings = MappingsConverter.newMappings(classMatches, mappings, deobfuscators.source, deobfuscators.source); 91 Mappings newMappings = MappingsConverter.newMappings(classMatches, mappings, deobfuscators.source, deobfuscators.dest);
97 92
98 try (FileWriter out = new FileWriter(outMappingsFile)) { 93 try (FileWriter out = new FileWriter(outMappingsFile)) {
99 new MappingsWriter().write(out, newMappings); 94 new MappingsWriter().write(out, newMappings);
@@ -114,7 +109,12 @@ public class ConvertMain {
114 System.out.println("Writing matches..."); 109 System.out.println("Writing matches...");
115 110
116 // get the matched and unmatched mappings 111 // get the matched and unmatched mappings
117 MemberMatches<FieldEntry> fieldMatches = MappingsConverter.computeFieldMatches(destDeobfuscator, destMappings, classMatches); 112 MemberMatches<FieldEntry> fieldMatches = MappingsConverter.computeMemberMatches(
113 destDeobfuscator,
114 destMappings,
115 classMatches,
116 MappingsConverter.getFieldDoer()
117 );
118 118
119 MatchesWriter.writeMembers(fieldMatches, memberMatchesFile); 119 MatchesWriter.writeMembers(fieldMatches, memberMatchesFile);
120 System.out.println("Wrote:\n\t" + memberMatchesFile.getAbsolutePath()); 120 System.out.println("Wrote:\n\t" + memberMatchesFile.getAbsolutePath());
@@ -160,7 +160,12 @@ public class ConvertMain {
160 System.out.println("Writing method matches..."); 160 System.out.println("Writing method matches...");
161 161
162 // get the matched and unmatched mappings 162 // get the matched and unmatched mappings
163 MemberMatches<BehaviorEntry> methodMatches = MappingsConverter.computeBehaviorMatches(destDeobfuscator, destMappings, classMatches); 163 MemberMatches<BehaviorEntry> methodMatches = MappingsConverter.computeMemberMatches(
164 destDeobfuscator,
165 destMappings,
166 classMatches,
167 MappingsConverter.getMethodDoer()
168 );
164 169
165 MatchesWriter.writeMembers(methodMatches, methodMatchesFile); 170 MatchesWriter.writeMembers(methodMatches, methodMatchesFile);
166 System.out.println("Wrote:\n\t" + methodMatchesFile.getAbsolutePath()); 171 System.out.println("Wrote:\n\t" + methodMatchesFile.getAbsolutePath());
@@ -192,6 +197,29 @@ public class ConvertMain {
192 } 197 }
193 }); 198 });
194 } 199 }
200
201 private static void writeFinalMappings(File outMappingsFile, JarFile sourceJar, JarFile destJar, Mappings mappings, File classMatchesFile, File fieldMatchesFile, File methodMatchesFile)
202 throws IOException {
203
204 System.out.println("Reading matches...");
205 ClassMatches classMatches = MatchesReader.readClasses(classMatchesFile);
206 MemberMatches<FieldEntry> fieldMatches = MatchesReader.readMembers(fieldMatchesFile);
207 MemberMatches<BehaviorEntry> methodMatches = MatchesReader.readMembers(methodMatchesFile);
208
209 Deobfuscators deobfuscators = new Deobfuscators(sourceJar, destJar);
210 deobfuscators.source.setMappings(mappings);
211
212 // apply matches
213 Mappings newMappings = MappingsConverter.newMappings(classMatches, mappings, deobfuscators.source, deobfuscators.dest);
214 MappingsConverter.applyMemberMatches(newMappings, fieldMatches, MappingsConverter.getFieldDoer());
215 MappingsConverter.applyMemberMatches(newMappings, methodMatches, MappingsConverter.getMethodDoer());
216
217 // write out the converted mappings
218 try (FileWriter out = new FileWriter(outMappingsFile)) {
219 new MappingsWriter().write(out, newMappings);
220 }
221 System.out.println("Wrote converted mappings to:\n\t" + outMappingsFile.getAbsolutePath());
222 }
195 223
196 private static class Deobfuscators { 224 private static class Deobfuscators {
197 225
diff --git a/src/cuchaz/enigma/convert/MappingsConverter.java b/src/cuchaz/enigma/convert/MappingsConverter.java
index 2987ea08..44bc8b87 100644
--- a/src/cuchaz/enigma/convert/MappingsConverter.java
+++ b/src/cuchaz/enigma/convert/MappingsConverter.java
@@ -262,10 +262,11 @@ public class MappingsConverter {
262 Collection<T> getObfEntries(JarIndex jarIndex); 262 Collection<T> getObfEntries(JarIndex jarIndex);
263 Collection<? extends MemberMapping<T>> getMappings(ClassMapping destClassMapping); 263 Collection<? extends MemberMapping<T>> getMappings(ClassMapping destClassMapping);
264 Set<T> filterEntries(Collection<T> obfEntries, T obfSourceEntry, ClassMatches classMatches); 264 Set<T> filterEntries(Collection<T> obfEntries, T obfSourceEntry, ClassMatches classMatches);
265 void setMemberObfName(ClassMapping classMapping, MemberMapping<T> memberMapping, String newObfName);
265 } 266 }
266 267
267 public static MemberMatches<FieldEntry> computeFieldMatches(Deobfuscator destDeobfuscator, Mappings destMappings, ClassMatches classMatches) { 268 public static Doer<FieldEntry> getFieldDoer() {
268 return computeMemberMatches(destDeobfuscator, destMappings, classMatches, new Doer<FieldEntry>() { 269 return new Doer<FieldEntry>() {
269 270
270 @Override 271 @Override
271 public Collection<FieldEntry> getDroppedEntries(MappingsChecker checker) { 272 public Collection<FieldEntry> getDroppedEntries(MappingsChecker checker) {
@@ -293,11 +294,17 @@ public class MappingsConverter {
293 } 294 }
294 return out; 295 return out;
295 } 296 }
296 }); 297
298 @Override
299 public void setMemberObfName(ClassMapping classMapping, MemberMapping<FieldEntry> memberMapping, String newObfName) {
300 FieldMapping fieldMapping = (FieldMapping)memberMapping;
301 classMapping.setFieldObfName(fieldMapping.getObfName(), fieldMapping.getObfType(), newObfName);
302 }
303 };
297 } 304 }
298 305
299 public static MemberMatches<BehaviorEntry> computeBehaviorMatches(Deobfuscator destDeobfuscator, Mappings destMappings, ClassMatches classMatches) { 306 public static Doer<BehaviorEntry> getMethodDoer() {
300 return computeMemberMatches(destDeobfuscator, destMappings, classMatches, new Doer<BehaviorEntry>() { 307 return new Doer<BehaviorEntry>() {
301 308
302 @Override 309 @Override
303 public Collection<BehaviorEntry> getDroppedEntries(MappingsChecker checker) { 310 public Collection<BehaviorEntry> getDroppedEntries(MappingsChecker checker) {
@@ -329,7 +336,13 @@ public class MappingsConverter {
329 } 336 }
330 return out; 337 return out;
331 } 338 }
332 }); 339
340 @Override
341 public void setMemberObfName(ClassMapping classMapping, MemberMapping<BehaviorEntry> memberMapping, String newObfName) {
342 MethodMapping methodMapping = (MethodMapping)memberMapping;
343 classMapping.setMethodObfName(methodMapping.getObfName(), methodMapping.getObfSignature(), newObfName);
344 }
345 };
333 } 346 }
334 347
335 public static <T extends Entry> MemberMatches<T> computeMemberMatches(Deobfuscator destDeobfuscator, Mappings destMappings, ClassMatches classMatches, Doer<T> doer) { 348 public static <T extends Entry> MemberMatches<T> computeMemberMatches(Deobfuscator destDeobfuscator, Mappings destMappings, ClassMatches classMatches, Doer<T> doer) {
@@ -452,4 +465,29 @@ public class MappingsConverter {
452 } 465 }
453 }); 466 });
454 } 467 }
468
469 public static <T extends Entry> void applyMemberMatches(Mappings mappings, MemberMatches<T> memberMatches, Doer<T> doer) {
470 for (ClassMapping classMapping : mappings.classes()) {
471 applyMemberMatches(classMapping, memberMatches, doer);
472 }
473 }
474
475 private static <T extends Entry> void applyMemberMatches(ClassMapping classMapping, MemberMatches<T> memberMatches, Doer<T> doer) {
476 ClassEntry classEntry = classMapping.getObfEntry();
477
478 // apply to this class
479 // TODO: need to sort renames so they happen in the right order!!
480 for (MemberMapping<T> memberMapping : Lists.newArrayList(doer.getMappings(classMapping))) {
481 T obfSourceEntry = memberMapping.getObfEntry(classEntry);
482 T obfDestEntry = memberMatches.matches().get(obfSourceEntry);
483 if (obfDestEntry != null) {
484 doer.setMemberObfName(classMapping, memberMapping, obfDestEntry.getName());
485 }
486 }
487
488 // recurse
489 for (ClassMapping innerClassMapping : classMapping.innerClasses()) {
490 applyMemberMatches(innerClassMapping, memberMatches, doer);
491 }
492 }
455} 493}
diff --git a/src/cuchaz/enigma/mapping/ClassMapping.java b/src/cuchaz/enigma/mapping/ClassMapping.java
index 07fed32a..ac70df0d 100644
--- a/src/cuchaz/enigma/mapping/ClassMapping.java
+++ b/src/cuchaz/enigma/mapping/ClassMapping.java
@@ -243,6 +243,15 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> {
243 } 243 }
244 } 244 }
245 245
246 public void setFieldObfName(String oldObfName, Type obfType, String newObfName) {
247 assert(newObfName != null);
248 FieldMapping fieldMapping = m_fieldsByObf.remove(getFieldKey(oldObfName, obfType));
249 assert(fieldMapping != null);
250 fieldMapping.setObfName(newObfName);
251 boolean obfWasAdded = m_fieldsByObf.put(getFieldKey(newObfName, obfType), fieldMapping) == null;
252 assert(obfWasAdded);
253 }
254
246 255
247 //// METHODS //////// 256 //// METHODS ////////
248 257
@@ -319,6 +328,15 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> {
319 } 328 }
320 } 329 }
321 330
331 public void setMethodObfName(String oldObfName, Signature obfSignature, String newObfName) {
332 assert(newObfName != null);
333 MethodMapping methodMapping = m_methodsByObf.remove(getMethodKey(oldObfName, obfSignature));
334 assert(methodMapping != null);
335 methodMapping.setObfName(newObfName);
336 boolean obfWasAdded = m_methodsByObf.put(getMethodKey(newObfName, obfSignature), methodMapping) == null;
337 assert(obfWasAdded);
338 }
339
322 //// ARGUMENTS //////// 340 //// ARGUMENTS ////////
323 341
324 public void setArgumentName(String obfMethodName, Signature obfMethodSignature, int argumentIndex, String argumentName) { 342 public void setArgumentName(String obfMethodName, Signature obfMethodSignature, int argumentIndex, String argumentName) {
diff --git a/src/cuchaz/enigma/mapping/FieldMapping.java b/src/cuchaz/enigma/mapping/FieldMapping.java
index 1289351d..3aa9e698 100644
--- a/src/cuchaz/enigma/mapping/FieldMapping.java
+++ b/src/cuchaz/enigma/mapping/FieldMapping.java
@@ -36,6 +36,10 @@ public class FieldMapping implements Serializable, Comparable<FieldMapping>, Mem
36 return m_obfName; 36 return m_obfName;
37 } 37 }
38 38
39 public void setObfName(String val) {
40 m_obfName = NameValidator.validateFieldName(val);
41 }
42
39 public String getDeobfName() { 43 public String getDeobfName() {
40 return m_deobfName; 44 return m_deobfName;
41 } 45 }
diff --git a/src/cuchaz/enigma/mapping/MethodMapping.java b/src/cuchaz/enigma/mapping/MethodMapping.java
index bf6dacca..a67e352f 100644
--- a/src/cuchaz/enigma/mapping/MethodMapping.java
+++ b/src/cuchaz/enigma/mapping/MethodMapping.java
@@ -56,6 +56,10 @@ public class MethodMapping implements Serializable, Comparable<MethodMapping>, M
56 return m_obfName; 56 return m_obfName;
57 } 57 }
58 58
59 public void setObfName(String val) {
60 m_obfName = NameValidator.validateMethodName(val);
61 }
62
59 public String getDeobfName() { 63 public String getDeobfName() {
60 return m_deobfName; 64 return m_deobfName;
61 } 65 }