various fixes to graph building. I think there is a problem with how the execution runs, where it is not exploring all paths, because I have v13 class133.method2817 -> v14 class133 method2828 and there is no edge on the rhs for method4060->method4081. I think it is from two branches jumping to a place which jumps to the same place after, with invoke instructions on both sides.

This commit is contained in:
Adam
2015-11-11 14:49:12 -05:00
parent 4ae0c954cd
commit be1b8f1e98
5 changed files with 15 additions and 20 deletions

View File

@@ -37,7 +37,7 @@ public class Deob
{ {
public static void main(String[] args) throws IOException public static void main(String[] args) throws IOException
{ {
//merge(); if(true) return; merge(); if(true) return;
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();

View File

@@ -3,6 +3,7 @@ package net.runelite.deob.deobfuscators.rename;
import edu.ucla.sspace.graph.Graph; import edu.ucla.sspace.graph.Graph;
import edu.ucla.sspace.graph.isomorphism.IsomorphismTester; import edu.ucla.sspace.graph.isomorphism.IsomorphismTester;
import edu.ucla.sspace.graph.isomorphism.TypedVF2IsomorphismTester; import edu.ucla.sspace.graph.isomorphism.TypedVF2IsomorphismTester;
import edu.ucla.sspace.graph.isomorphism.VF2IsomorphismTester;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
@@ -34,7 +35,7 @@ public class Rename
{ {
Graph g1 = f1.getMethodCtx().getGraph(), g2 = f2.getMethodCtx().getGraph(); Graph g1 = f1.getMethodCtx().getGraph(), g2 = f2.getMethodCtx().getGraph();
IsomorphismTester isoTest = new TypedVF2IsomorphismTester(); IsomorphismTester isoTest = new /*Typed*/VF2IsomorphismTester();
if (!isoTest.areIsomorphic(g1, g2)) if (!isoTest.areIsomorphic(g1, g2))
{ {
System.out.println("Not isomorphic " + g1.size() + " " + g2.size()); System.out.println("Not isomorphic " + g1.size() + " " + g2.size());
@@ -152,7 +153,7 @@ public class Rename
Method m = (Method) next.get(); Method m = (Method) next.get();
Method m2 = (Method) objMap.get(m); Method m2 = (Method) objMap.get(m);
System.out.println("Scanning " + m.getName() + " -> " + m2.getName()); System.out.println("Scanning " + m.getMethods().getClassFile().getName() + "." + m.getName() + " -> " + m2.getMethods().getClassFile().getName() + "." + m2.getName());
process(m, m2); process(m, m2);
processed.add(m); processed.add(m);
} }

View File

@@ -138,7 +138,7 @@ public class Execution
if (c != null) if (c != null)
return c; return c;
c = new MethodContext(m); c = new MethodContext();
methodContexts.put(m, c); methodContexts.put(m, c);
return c; return c;
} }

View File

@@ -30,6 +30,7 @@ public class Frame
private Variables variables; private Variables variables;
private List<InstructionContext> instructions = new ArrayList<>(); // instructions executed in this frame private List<InstructionContext> instructions = new ArrayList<>(); // instructions executed in this frame
private MethodContext ctx; private MethodContext ctx;
protected int prevVertex = -1;
public Frame(Execution execution, Method method) public Frame(Execution execution, Method method)
{ {
@@ -99,6 +100,7 @@ public class Frame
this.stack = new Stack(other.stack); this.stack = new Stack(other.stack);
this.variables = new Variables(other.variables); this.variables = new Variables(other.variables);
this.ctx = other.ctx; this.ctx = other.ctx;
this.prevVertex = other.prevVertex;
} }
public Frame dup() public Frame dup()
@@ -194,7 +196,7 @@ public class Frame
if (!executing) if (!executing)
break; break;
ctx.buildGraph(oldCur); ctx.buildGraph(this, oldCur);
if (oldCur == cur) if (oldCur == cur)
{ {

View File

@@ -16,19 +16,11 @@ import org.apache.commons.collections4.map.MultiValueMap;
public class MethodContext public class MethodContext
{ {
private Method method;
private MultiValueMap<InstructionContext, Instruction> visited = new MultiValueMap<>(); private MultiValueMap<InstructionContext, Instruction> visited = new MultiValueMap<>();
private IdGen ids = new IdGen(); private IdGen ids = new IdGen();
private Map<Integer, Instruction> idMap = new HashMap<>(); private Map<Integer, Instruction> idMap = new HashMap<>();
private Map<Instruction, Integer> insMap = new HashMap<>(); private Map<Instruction, Integer> insMap = new HashMap<>();
private Graph graph = new SparseDirectedGraph(); private Graph graph = new SparseDirectedGraph();
private int prevVertex = -1;
public MethodContext(Method method)
{
this.method = method;
}
public Map<Integer, Instruction> getIdMap() public Map<Integer, Instruction> getIdMap()
{ {
@@ -57,7 +49,7 @@ public class MethodContext
int id = ids.get(); int id = ids.get();
graph.add(id); //graph.add(id);
this.idMap.put(id, i); this.idMap.put(id, i);
this.insMap.put(i, id); this.insMap.put(i, id);
@@ -65,7 +57,7 @@ public class MethodContext
return id; return id;
} }
protected void buildGraph(Instruction i) protected void buildGraph(Frame frame, Instruction i)
{ {
if (i instanceof InvokeInstruction) if (i instanceof InvokeInstruction)
{ {
@@ -87,12 +79,12 @@ public class MethodContext
return; return;
} }
if (prevVertex == -1) if (frame.prevVertex == -1)
{ {
int id = getIdFor(i); int id = getIdFor(i);
//int id = ids.get(); //int id = ids.get();
//graph.add(id); //graph.add(id);
prevVertex = id; frame.prevVertex = id;
//this.idMap.put(id, i); //this.idMap.put(id, i);
return; return;
} }
@@ -102,12 +94,12 @@ public class MethodContext
//graph.add(id); //graph.add(id);
//idMap.put(id, i); //idMap.put(id, i);
if (id == prevVertex) if (id == frame.prevVertex)
return; return;
DirectedEdge edge = new SimpleDirectedEdge(prevVertex, id); DirectedEdge edge = new SimpleDirectedEdge(frame.prevVertex, id);
graph.add(edge); graph.add(edge);
prevVertex = id; frame.prevVertex = id;
} }
} }