Change mapping logic to make more sense, which seems to work better
This commit is contained in:
@@ -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<Method> methods2;
|
||||
private Map<Method, ParallelExecutorMapping> mappings = new HashMap<>();
|
||||
|
||||
public ExecutionMapper(Method method1, Collection<Method> 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;
|
||||
}
|
||||
}
|
||||
@@ -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<Method> methods = msm.getMap().get(m);
|
||||
|
||||
for (Method other : methods)
|
||||
{
|
||||
HashMap<Object, Object> 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<Method> methods = smsm.getMap().get(m);
|
||||
|
||||
for (Method other : methods)
|
||||
{
|
||||
HashMap<Object, Object> 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<Object, Object> all, List<ParallelExecutorMapping> 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<Object, Object> 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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -17,12 +17,11 @@ public class ParallelExecutorMapping
|
||||
{
|
||||
private ClassGroup group, group2;
|
||||
private Multimap<Object, Mapping> map = HashMultimap.create();
|
||||
//private Map<Object, Object> map = new HashMap<>();
|
||||
//private List<Object> order = new ArrayList<>();
|
||||
public Method m1, m2;
|
||||
public boolean crashed;
|
||||
public List<PacketHandler> packetHandler1 = new ArrayList<>();
|
||||
public List<PacketHandler> 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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user