From dc2120999c137aa4763ea2358b8df83f4098d280 Mon Sep 17 00:00:00 2001 From: jeff Date: Wed, 11 Mar 2015 11:44:24 -0400 Subject: working on writing mappings based on all the matches --- src/cuchaz/enigma/ConvertMain.java | 50 ++++++++++++++++++------ src/cuchaz/enigma/convert/MappingsConverter.java | 50 +++++++++++++++++++++--- src/cuchaz/enigma/mapping/ClassMapping.java | 18 +++++++++ src/cuchaz/enigma/mapping/FieldMapping.java | 4 ++ 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 { // match methods/constructors //computeMethodMatches(methodMatchesFile, destJar, outMappingsFile, classMatchesFile); - editMethodMatches(sourceJar, destJar, outMappingsFile, mappings, classMatchesFile, methodMatchesFile); + //editMethodMatches(sourceJar, destJar, outMappingsFile, mappings, classMatchesFile, methodMatchesFile); - /* TODO - // write out the converted mappings - FileWriter writer = new FileWriter(outMappingsFile); - new MappingsWriter().write(writer, mappings); - writer.close(); - System.out.println("Wrote converted mappings to:\n\t" + outMappingsFile.getAbsolutePath()); - */ + // write final converted mappings + writeFinalMappings(outMappingsFile, sourceJar, destJar, mappings, classMatchesFile, fieldMatchesFile, methodMatchesFile); } private static void computeClassMatches(File classMatchesFile, JarFile sourceJar, JarFile destJar, Mappings mappings) @@ -93,7 +88,7 @@ public class ConvertMain { Deobfuscators deobfuscators = new Deobfuscators(sourceJar, destJar); deobfuscators.source.setMappings(mappings); - Mappings newMappings = MappingsConverter.newMappings(classMatches, mappings, deobfuscators.source, deobfuscators.source); + Mappings newMappings = MappingsConverter.newMappings(classMatches, mappings, deobfuscators.source, deobfuscators.dest); try (FileWriter out = new FileWriter(outMappingsFile)) { new MappingsWriter().write(out, newMappings); @@ -114,7 +109,12 @@ public class ConvertMain { System.out.println("Writing matches..."); // get the matched and unmatched mappings - MemberMatches fieldMatches = MappingsConverter.computeFieldMatches(destDeobfuscator, destMappings, classMatches); + MemberMatches fieldMatches = MappingsConverter.computeMemberMatches( + destDeobfuscator, + destMappings, + classMatches, + MappingsConverter.getFieldDoer() + ); MatchesWriter.writeMembers(fieldMatches, memberMatchesFile); System.out.println("Wrote:\n\t" + memberMatchesFile.getAbsolutePath()); @@ -160,7 +160,12 @@ public class ConvertMain { System.out.println("Writing method matches..."); // get the matched and unmatched mappings - MemberMatches methodMatches = MappingsConverter.computeBehaviorMatches(destDeobfuscator, destMappings, classMatches); + MemberMatches methodMatches = MappingsConverter.computeMemberMatches( + destDeobfuscator, + destMappings, + classMatches, + MappingsConverter.getMethodDoer() + ); MatchesWriter.writeMembers(methodMatches, methodMatchesFile); System.out.println("Wrote:\n\t" + methodMatchesFile.getAbsolutePath()); @@ -192,6 +197,29 @@ public class ConvertMain { } }); } + + private static void writeFinalMappings(File outMappingsFile, JarFile sourceJar, JarFile destJar, Mappings mappings, File classMatchesFile, File fieldMatchesFile, File methodMatchesFile) + throws IOException { + + System.out.println("Reading matches..."); + ClassMatches classMatches = MatchesReader.readClasses(classMatchesFile); + MemberMatches fieldMatches = MatchesReader.readMembers(fieldMatchesFile); + MemberMatches methodMatches = MatchesReader.readMembers(methodMatchesFile); + + Deobfuscators deobfuscators = new Deobfuscators(sourceJar, destJar); + deobfuscators.source.setMappings(mappings); + + // apply matches + Mappings newMappings = MappingsConverter.newMappings(classMatches, mappings, deobfuscators.source, deobfuscators.dest); + MappingsConverter.applyMemberMatches(newMappings, fieldMatches, MappingsConverter.getFieldDoer()); + MappingsConverter.applyMemberMatches(newMappings, methodMatches, MappingsConverter.getMethodDoer()); + + // write out the converted mappings + try (FileWriter out = new FileWriter(outMappingsFile)) { + new MappingsWriter().write(out, newMappings); + } + System.out.println("Wrote converted mappings to:\n\t" + outMappingsFile.getAbsolutePath()); + } private static class Deobfuscators { 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 { Collection getObfEntries(JarIndex jarIndex); Collection> getMappings(ClassMapping destClassMapping); Set filterEntries(Collection obfEntries, T obfSourceEntry, ClassMatches classMatches); + void setMemberObfName(ClassMapping classMapping, MemberMapping memberMapping, String newObfName); } - public static MemberMatches computeFieldMatches(Deobfuscator destDeobfuscator, Mappings destMappings, ClassMatches classMatches) { - return computeMemberMatches(destDeobfuscator, destMappings, classMatches, new Doer() { + public static Doer getFieldDoer() { + return new Doer() { @Override public Collection getDroppedEntries(MappingsChecker checker) { @@ -293,11 +294,17 @@ public class MappingsConverter { } return out; } - }); + + @Override + public void setMemberObfName(ClassMapping classMapping, MemberMapping memberMapping, String newObfName) { + FieldMapping fieldMapping = (FieldMapping)memberMapping; + classMapping.setFieldObfName(fieldMapping.getObfName(), fieldMapping.getObfType(), newObfName); + } + }; } - public static MemberMatches computeBehaviorMatches(Deobfuscator destDeobfuscator, Mappings destMappings, ClassMatches classMatches) { - return computeMemberMatches(destDeobfuscator, destMappings, classMatches, new Doer() { + public static Doer getMethodDoer() { + return new Doer() { @Override public Collection getDroppedEntries(MappingsChecker checker) { @@ -329,7 +336,13 @@ public class MappingsConverter { } return out; } - }); + + @Override + public void setMemberObfName(ClassMapping classMapping, MemberMapping memberMapping, String newObfName) { + MethodMapping methodMapping = (MethodMapping)memberMapping; + classMapping.setMethodObfName(methodMapping.getObfName(), methodMapping.getObfSignature(), newObfName); + } + }; } public static MemberMatches computeMemberMatches(Deobfuscator destDeobfuscator, Mappings destMappings, ClassMatches classMatches, Doer doer) { @@ -452,4 +465,29 @@ public class MappingsConverter { } }); } + + public static void applyMemberMatches(Mappings mappings, MemberMatches memberMatches, Doer doer) { + for (ClassMapping classMapping : mappings.classes()) { + applyMemberMatches(classMapping, memberMatches, doer); + } + } + + private static void applyMemberMatches(ClassMapping classMapping, MemberMatches memberMatches, Doer doer) { + ClassEntry classEntry = classMapping.getObfEntry(); + + // apply to this class + // TODO: need to sort renames so they happen in the right order!! + for (MemberMapping memberMapping : Lists.newArrayList(doer.getMappings(classMapping))) { + T obfSourceEntry = memberMapping.getObfEntry(classEntry); + T obfDestEntry = memberMatches.matches().get(obfSourceEntry); + if (obfDestEntry != null) { + doer.setMemberObfName(classMapping, memberMapping, obfDestEntry.getName()); + } + } + + // recurse + for (ClassMapping innerClassMapping : classMapping.innerClasses()) { + applyMemberMatches(innerClassMapping, memberMatches, doer); + } + } } 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 { } } + public void setFieldObfName(String oldObfName, Type obfType, String newObfName) { + assert(newObfName != null); + FieldMapping fieldMapping = m_fieldsByObf.remove(getFieldKey(oldObfName, obfType)); + assert(fieldMapping != null); + fieldMapping.setObfName(newObfName); + boolean obfWasAdded = m_fieldsByObf.put(getFieldKey(newObfName, obfType), fieldMapping) == null; + assert(obfWasAdded); + } + //// METHODS //////// @@ -319,6 +328,15 @@ public class ClassMapping implements Serializable, Comparable { } } + public void setMethodObfName(String oldObfName, Signature obfSignature, String newObfName) { + assert(newObfName != null); + MethodMapping methodMapping = m_methodsByObf.remove(getMethodKey(oldObfName, obfSignature)); + assert(methodMapping != null); + methodMapping.setObfName(newObfName); + boolean obfWasAdded = m_methodsByObf.put(getMethodKey(newObfName, obfSignature), methodMapping) == null; + assert(obfWasAdded); + } + //// ARGUMENTS //////// 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, Mem return m_obfName; } + public void setObfName(String val) { + m_obfName = NameValidator.validateFieldName(val); + } + public String getDeobfName() { return m_deobfName; } 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, M return m_obfName; } + public void setObfName(String val) { + m_obfName = NameValidator.validateMethodName(val); + } + public String getDeobfName() { return m_deobfName; } -- cgit v1.2.3