From 8c38a8cc6b7a41cfb366c77722403e06dc4d964a Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 16 Apr 2016 17:51:49 -0400 Subject: [PATCH] Change mapping logic to make more sense, which seems to work better --- .../mapping/ExecutionMapper.java | 40 ++++++++++++ .../deob/deobfuscators/rename/Mapper.java | 60 +++++------------- .../rename/MappingExecutorUtil.java | 5 +- .../rename/ParallelExecutorMapping.java | 13 +--- .../rename/AnnotationMapperTest.java | 2 +- .../deob/deobfuscators/rename/MapperTest.java | 62 ++++++++++++++++++- 6 files changed, 121 insertions(+), 61 deletions(-) create mode 100644 src/main/java/net/runelite/deob/deobfuscators/mapping/ExecutionMapper.java diff --git a/src/main/java/net/runelite/deob/deobfuscators/mapping/ExecutionMapper.java b/src/main/java/net/runelite/deob/deobfuscators/mapping/ExecutionMapper.java new file mode 100644 index 0000000000..8a00424daf --- /dev/null +++ b/src/main/java/net/runelite/deob/deobfuscators/mapping/ExecutionMapper.java @@ -0,0 +1,40 @@ +package net.runelite.deob.deobfuscators.mapping; + +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import net.runelite.asm.Method; +import net.runelite.deob.deobfuscators.rename.MappingExecutorUtil; +import net.runelite.deob.deobfuscators.rename.ParallelExecutorMapping; + +public class ExecutionMapper +{ + // method1 maps to one of methods2, find out based on mappings + + private Method method1; + private Collection methods2; + private Map mappings = new HashMap<>(); + + public ExecutionMapper(Method method1, Collection methods2) + { + this.method1 = method1; + this.methods2 = methods2; + } + + public ParallelExecutorMapping run() + { + ParallelExecutorMapping highest = null; + + for (Method m : methods2) + { + ParallelExecutorMapping mapping = MappingExecutorUtil.map(method1, m); + mappings.put(m, mapping); + + if (highest == null || mapping.same > highest.same) + highest = mapping; + } + + return highest; + } +} diff --git a/src/main/java/net/runelite/deob/deobfuscators/rename/Mapper.java b/src/main/java/net/runelite/deob/deobfuscators/rename/Mapper.java index dc9ba7f0c6..5da3c36e54 100644 --- a/src/main/java/net/runelite/deob/deobfuscators/rename/Mapper.java +++ b/src/main/java/net/runelite/deob/deobfuscators/rename/Mapper.java @@ -14,6 +14,7 @@ import net.runelite.asm.attributes.Annotations; import net.runelite.asm.attributes.code.Instruction; import net.runelite.asm.execution.ParallellMappingExecutor; import net.runelite.asm.signature.Type; +import net.runelite.deob.deobfuscators.mapping.ExecutionMapper; public class Mapper { @@ -55,11 +56,12 @@ public class Mapper { Collection methods = msm.getMap().get(m); - for (Method other : methods) - { - HashMap all = new HashMap(); - map(all, pmes, m, other); - } + ExecutionMapper em = new ExecutionMapper(m, methods); + + ParallelExecutorMapping mapping = em.run(); + mapping.map(mapping.m1, mapping.m2); + + pmes.add(mapping); } ParallelExecutorMapping finalm = new ParallelExecutorMapping(one, two); @@ -79,12 +81,13 @@ public class Mapper for (Method m : smsm.getMap().keySet()) { Collection methods = smsm.getMap().get(m); - - for (Method other : methods) - { - HashMap all = new HashMap(); - map(all, pmes, m, other); - } + + ExecutionMapper em = new ExecutionMapper(m, methods); + + ParallelExecutorMapping mapping = em.run(); + mapping.map(mapping.m1, mapping.m2); + + pmes.add(mapping); } ParallelExecutorMapping finalm = new ParallelExecutorMapping(one, two); @@ -94,41 +97,6 @@ public class Mapper return finalm; } - private void map(Map all, List result, Method m1, Method m2) - { - if (all.containsKey(m1)) - return; - all.put(m1, m2); - - assert (m1.getCode() == null) == (m2.getCode() == null); - - if (m1.getCode() == null) - return; - - ParallelExecutorMapping mappings = MappingExecutorUtil.map(m1, m2); - - if (mappings.getMap().isEmpty() && mappings.crashed) - return; - - mappings.map(m1, m2); - result.add(mappings); - - for (Map.Entry e : mappings.getMap().entrySet()) - { - if (e.getKey() instanceof Method) - { - Method n1 = (Method) e.getKey(), - n2 = (Method) e.getValue(); - - map(all, result, n1, n2); - } - else - { - all.put(e.getKey(), e.getValue()); - } - } - } - private ParallelExecutorMapping mapPackets(ParallelExecutorMapping pem, ClassGroup group1, ClassGroup group2) { Method packetMethod = this.findPacketMethod(); diff --git a/src/main/java/net/runelite/deob/deobfuscators/rename/MappingExecutorUtil.java b/src/main/java/net/runelite/deob/deobfuscators/rename/MappingExecutorUtil.java index f872640a5f..cd2ed2edba 100644 --- a/src/main/java/net/runelite/deob/deobfuscators/rename/MappingExecutorUtil.java +++ b/src/main/java/net/runelite/deob/deobfuscators/rename/MappingExecutorUtil.java @@ -54,7 +54,7 @@ public class MappingExecutorUtil parallel.mappings = mappings; - outer: + int same = 0; while (parallel.step()) { // get what each frame is paused/exited on @@ -83,9 +83,12 @@ public class MappingExecutorUtil continue; } + ++same; mi1.map(mappings, p1, p2); e.paused = e2.paused = false; } + + mappings.same = same; return mappings; } diff --git a/src/main/java/net/runelite/deob/deobfuscators/rename/ParallelExecutorMapping.java b/src/main/java/net/runelite/deob/deobfuscators/rename/ParallelExecutorMapping.java index e8dee04ede..6740348c6c 100644 --- a/src/main/java/net/runelite/deob/deobfuscators/rename/ParallelExecutorMapping.java +++ b/src/main/java/net/runelite/deob/deobfuscators/rename/ParallelExecutorMapping.java @@ -17,12 +17,11 @@ public class ParallelExecutorMapping { private ClassGroup group, group2; private Multimap map = HashMultimap.create(); - //private Map map = new HashMap<>(); - //private List order = new ArrayList<>(); public Method m1, m2; public boolean crashed; public List packetHandler1 = new ArrayList<>(); public List packetHandler2 = new ArrayList<>(); + public int same; public ParallelExecutorMapping(ClassGroup group, ClassGroup group2) { @@ -71,18 +70,8 @@ public class ParallelExecutorMapping } } -// public void mergeButNotOverride(ParallelExecutorMapping other) -// { -// assert this != other; -// for (Object o : other.map.keySet()) -// if (map.containsKey(o) == false) -// map.put(o, other.map.get(o)); -// } - public void map(Object one, Object two) { - //mapClass(one, two); - Mapping m = getMapping(one, two); belongs(one, group); diff --git a/src/test/java/net/runelite/deob/deobfuscators/rename/AnnotationMapperTest.java b/src/test/java/net/runelite/deob/deobfuscators/rename/AnnotationMapperTest.java index fc22f8d8e7..3a811fc919 100644 --- a/src/test/java/net/runelite/deob/deobfuscators/rename/AnnotationMapperTest.java +++ b/src/test/java/net/runelite/deob/deobfuscators/rename/AnnotationMapperTest.java @@ -9,7 +9,7 @@ import org.junit.Test; public class AnnotationMapperTest { private static final String JAR1 = "C:\\Users\\Adam\\.m2\\repository\\net\\runelite\\rs\\rs-client\\1.0-SNAPSHOT\\rs-client-1.0-SNAPSHOT.jar", - JAR2 = "d:/rs/07/gamepack_v20_deobfuscated.jar", + JAR2 = "d:/rs/07/gamepack_v21_deobfuscated.jar", OUT = "d:/rs/07/adamout.jar"; @Test diff --git a/src/test/java/net/runelite/deob/deobfuscators/rename/MapperTest.java b/src/test/java/net/runelite/deob/deobfuscators/rename/MapperTest.java index 68373645b5..8530ef688a 100644 --- a/src/test/java/net/runelite/deob/deobfuscators/rename/MapperTest.java +++ b/src/test/java/net/runelite/deob/deobfuscators/rename/MapperTest.java @@ -2,7 +2,13 @@ package net.runelite.deob.deobfuscators.rename; import java.io.File; import java.io.IOException; +import net.runelite.asm.ClassFile; import net.runelite.asm.ClassGroup; +import net.runelite.asm.Field; +import net.runelite.asm.Method; +import net.runelite.asm.attributes.Annotations; +import net.runelite.asm.attributes.annotation.Annotation; +import net.runelite.asm.signature.Type; import static net.runelite.deob.deobfuscators.rename.MapStaticTest.print; import static net.runelite.deob.deobfuscators.rename.MapStaticTest.summary; import net.runelite.deob.util.JarUtil; @@ -12,10 +18,12 @@ import org.junit.Test; public class MapperTest { private static final String JAR1 = "C:\\Users\\Adam\\.m2\\repository\\net\\runelite\\rs\\rs-client\\1.0-SNAPSHOT\\rs-client-1.0-SNAPSHOT.jar", - JAR2 = "d:/rs/07/gamepack_v19_deobfuscated.jar"; + JAR2 = "d:/rs/07/gamepack_v21_deobfuscated.jar"; // private static final String JAR1 = MapStaticTest.class.getResource("/adamin1.jar").getFile(), // JAR2 = MapStaticTest.class.getResource("/adamin2.jar").getFile(); + private static final Type EXPORT = new Type("Lnet/runelite/mapping/Export;"); + @Test public void testRun() throws IOException { @@ -25,6 +33,8 @@ public class MapperTest Mapper mapper = new Mapper(group1, group2); mapper.run(); ParallelExecutorMapping mapping = mapper.getMapping(); + + checkMappings(group1, group2, mapping); summary(mapping, group1); @@ -34,4 +44,54 @@ public class MapperTest System.out.println("GROUP 1 " + sg1); System.out.println("GROUP 2 " + sg2); } + + private void checkMappings(ClassGroup group1, ClassGroup group2, ParallelExecutorMapping mapping) + { + for (ClassFile cf : group1.getClasses()) + { + for (Field f : cf.getFields().getFields()) + { + String export = getExport(f.getAttributes().getAnnotations()); + if (export == null) + continue; + + Field other = (Field) mapping.get(f); + if (other != null) + { + // System.out.println("Mapped field " + f + " -> " + other); + continue; + } + + System.out.println("UNMAPPED FIELD " + export + ": " + f + " -> null"); + } + + for (Method m : cf.getMethods().getMethods()) + { + String export = getExport(m.getAttributes().getAnnotations()); + if (export == null) + continue; + + Method other = (Method) mapping.get(m); + if (other != null) + { + // System.out.println("Mapped method " + m + " -> " + other); + continue; + } + + System.out.println("UNMAPPED METHOD " + export + ": " + m + " -> null"); + } + } + } + + private String getExport(Annotations an) + { + if (an == null) + return null; + + Annotation a = an.find(EXPORT); + if (a == null) + return null; + + return a.getElement().getString(); + } }