diff options
| author | 2015-03-11 11:44:24 -0400 | |
|---|---|---|
| committer | 2015-03-11 11:44:24 -0400 | |
| commit | dc2120999c137aa4763ea2358b8df83f4098d280 (patch) | |
| tree | adf96d87f675e76ab3beebadac9c35c1e04b5517 /src | |
| parent | generalized field matching (diff) | |
| download | enigma-dc2120999c137aa4763ea2358b8df83f4098d280.tar.gz enigma-dc2120999c137aa4763ea2358b8df83f4098d280.tar.xz enigma-dc2120999c137aa4763ea2358b8df83f4098d280.zip | |
working on writing mappings based on all the matches
Diffstat (limited to 'src')
| -rw-r--r-- | src/cuchaz/enigma/ConvertMain.java | 50 | ||||
| -rw-r--r-- | src/cuchaz/enigma/convert/MappingsConverter.java | 50 | ||||
| -rw-r--r-- | src/cuchaz/enigma/mapping/ClassMapping.java | 18 | ||||
| -rw-r--r-- | src/cuchaz/enigma/mapping/FieldMapping.java | 4 | ||||
| -rw-r--r-- | src/cuchaz/enigma/mapping/MethodMapping.java | 4 |
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 | } |