more or less promising

This commit is contained in:
Adam
2015-12-04 23:30:45 -05:00
parent 5cbd36a25c
commit b9b2ef70f2
6 changed files with 92 additions and 111 deletions

View File

@@ -195,46 +195,46 @@ public class Rename2
return fields; return fields;
} }
private void mapOneFrame(ClassGroup group, Execution e) // private void mapOneFrame(ClassGroup group, Execution e)
{ // {
for (ClassFile cf : group.getClasses()) // for (ClassFile cf : group.getClasses())
{ // {
for (Method m : cf.getMethods().getMethods()) // for (Method m : cf.getMethods().getMethods())
{ // {
if (m.isStatic()) // if (m.isStatic())
continue; // continue;
//
List<Frame> frames = e.processedFrames.stream().filter(f -> f.getMethod() == m).collect(Collectors.toList()); // List<Frame> frames = e.processedFrames.stream().filter(f -> f.getMethod() == m).collect(Collectors.toList());
//
if (frames.size() != 1) // if (frames.size() != 1)
continue; // continue;
//
int count = 0; // int count = 0;
for (InstructionContext i : frames.get(0).getInstructions()) // for (InstructionContext i : frames.get(0).getInstructions())
{ // {
if (i.getInstruction() instanceof SetFieldInstruction) // if (i.getInstruction() instanceof SetFieldInstruction)
{ // {
SetFieldInstruction sfi = (SetFieldInstruction) i.getInstruction(); // SetFieldInstruction sfi = (SetFieldInstruction) i.getInstruction();
//
Field f = sfi.getMyField(); // Field f = sfi.getMyField();
if (f == null) // if (f == null)
continue; // continue;
//
Vertex methodVertex = e.getGraph().getVertexFor(m), // Vertex methodVertex = e.getGraph().getVertexFor(m),
fieldVertex = e.getGraph().getVertexFor(f); // fieldVertex = e.getGraph().getVertexFor(f);
//
Edge edge = new FieldEdge(i.getInstruction(), methodVertex, fieldVertex, EdgeType.SETFIELD, count); // Edge edge = new FieldEdge(i.getInstruction(), methodVertex, fieldVertex, EdgeType.SETFIELD, count);
e.getGraph().addEdge(edge); // e.getGraph().addEdge(edge);
//
edge = new FieldEdge(i.getInstruction(), fieldVertex, methodVertex, EdgeType.SETFIELD_FROM, count); // edge = new FieldEdge(i.getInstruction(), fieldVertex, methodVertex, EdgeType.SETFIELD_FROM, count);
e.getGraph().addEdge(edge); // e.getGraph().addEdge(edge);
//
++count; // ++count;
} // }
} // }
} // }
} // }
} // }
private void solve() private void solve()
{ {

View File

@@ -1,16 +1,19 @@
package net.runelite.deob.deobfuscators.rename.graph; package net.runelite.deob.deobfuscators.rename.graph;
import java.util.Arrays;
import java.util.Objects; import java.util.Objects;
import net.runelite.deob.attributes.code.Instruction; import net.runelite.deob.attributes.code.instruction.types.DupInstruction;
import net.runelite.deob.execution.InstructionContext;
import net.runelite.deob.execution.StackContext;
public class Edge public class Edge
{ {
private final Instruction ins; // craetor private final InstructionContext ins;
private final Vertex from, to; private final Vertex from, to;
private final EdgeType type; private final EdgeType type;
private int weight; private int weight;
public Edge(Instruction ins, Vertex from, Vertex to, EdgeType type) public Edge(InstructionContext ins, Vertex from, Vertex to, EdgeType type)
{ {
this.ins = ins; this.ins = ins;
this.from = from; this.from = from;
@@ -20,7 +23,7 @@ public class Edge
assert from.getGraph() == to.getGraph(); assert from.getGraph() == to.getGraph();
} }
public Instruction getIns() public InstructionContext getIns()
{ {
return ins; return ins;
} }
@@ -102,9 +105,40 @@ public class Edge
if (this.type != other.type) if (this.type != other.type)
return false; return false;
if (this.type == EdgeType.SETFIELD)
{
if (!compareSetField(other.getIns()))
return false;
}
// if (this.weight != other.weight) // if (this.weight != other.weight)
// return false; // return false;
return true; return true;
} }
private InstructionContext handleDup(InstructionContext i, StackContext sctx)
{
DupInstruction d = (DupInstruction) i.getInstruction();
return d.getOriginal(sctx).getPushed();
}
private boolean compareSetField(InstructionContext other)
{
InstructionContext thisp = ins.getPops().get(0).getPushed(),
otherp = other.getPops().get(0).getPushed();
if (thisp.getInstruction() instanceof DupInstruction)
{
thisp = handleDup(thisp, ins.getPops().get(0));
}
if (otherp.getInstruction() instanceof DupInstruction)
{
otherp = handleDup(otherp, other.getPops().get(0));
}
Class[] c1 = thisp.getInstruction().getClass().getInterfaces(),
c2 = otherp.getInstruction().getClass().getInterfaces();
return Arrays.equals(c1, c2);
}
} }

View File

@@ -1,12 +1,13 @@
package net.runelite.deob.deobfuscators.rename.graph; package net.runelite.deob.deobfuscators.rename.graph;
import net.runelite.deob.attributes.code.Instruction; import net.runelite.deob.attributes.code.Instruction;
import net.runelite.deob.execution.InstructionContext;
public class FieldEdge extends Edge public class FieldEdge extends Edge
{ {
private int id; private int id;
public FieldEdge(Instruction ins, Vertex from, Vertex to, EdgeType type, int id) public FieldEdge(InstructionContext ins, Vertex from, Vertex to, EdgeType type, int id)
{ {
super(ins, from, to, type); super(ins, from, to, type);
this.id = id; this.id = id;

View File

@@ -2,13 +2,13 @@ package net.runelite.deob.deobfuscators.rename.graph;
import java.util.Objects; import java.util.Objects;
import net.runelite.deob.Method; import net.runelite.deob.Method;
import net.runelite.deob.attributes.code.Instruction; import net.runelite.deob.execution.InstructionContext;
public class MethodEdge extends Edge public class MethodEdge extends Edge
{ {
private final Method method; private final Method method;
public MethodEdge(Instruction i, Vertex from, Vertex to, EdgeType type, Method method) public MethodEdge(InstructionContext i, Vertex from, Vertex to, EdgeType type, Method method)
{ {
super(i, from, to, type); super(i, from, to, type);
this.method = method; this.method = method;

View File

@@ -36,7 +36,7 @@ public class Vertex
private Collection<Vertex> mightBe; private Collection<Vertex> mightBe;
private Vertex is; private Vertex is;
private Set<Instruction> edgeFrom = new HashSet<>(); //private Set<Instruction> edgeFrom = new HashSet<>();
public Vertex(Graph graph, Object object) public Vertex(Graph graph, Object object)
{ {
@@ -110,11 +110,11 @@ public class Vertex
Edge c = edges.get(edge); Edge c = edges.get(edge);
if (c != null) if (c != null)
{ {
if (edge.getIns() instanceof SetFieldInstruction && !edgeFrom.contains(edge.getIns())) // if (edge.getIns() instanceof SetFieldInstruction && !edgeFrom.contains(edge.getIns()))
{ // {
edgeFrom.add(edge.getIns()); // edgeFrom.add(edge.getIns());
c.increase(); // c.increase();
} // }
return; return;
} }

View File

@@ -217,8 +217,8 @@ public class Execution
for (Method m : methods) for (Method m : methods)
{ {
graph.addEdge(new Edge(i, graph.getVertexFor(frame.nonStatic), graph.getVertexFor(m), EdgeType.INVOKE)); graph.addEdge(new Edge(ctx, graph.getVertexFor(frame.nonStatic), graph.getVertexFor(m), EdgeType.INVOKE));
graph.addEdge(new Edge(i, graph.getVertexFor(m), graph.getVertexFor(frame.nonStatic), EdgeType.INVOKED_FROM)); graph.addEdge(new Edge(ctx, graph.getVertexFor(m), graph.getVertexFor(frame.nonStatic), EdgeType.INVOKED_FROM));
} }
} }
else if (i instanceof FieldInstruction) else if (i instanceof FieldInstruction)
@@ -228,64 +228,10 @@ public class Execution
if (fi.getMyField() == null) if (fi.getMyField() == null)
return; return;
//int id = frame.getMethodCtx().fcount++;
EdgeType type = fi instanceof GetFieldInstruction ? EdgeType.GETFIELD : EdgeType.SETFIELD; EdgeType type = fi instanceof GetFieldInstruction ? EdgeType.GETFIELD : EdgeType.SETFIELD;
graph.addEdge(new Edge(i, graph.getVertexFor(frame.nonStatic), graph.getVertexFor(fi.getMyField()), type)); graph.addEdge(new Edge(ctx, graph.getVertexFor(frame.nonStatic), graph.getVertexFor(fi.getMyField()), type));
EdgeType typeRev = fi instanceof GetFieldInstruction ? EdgeType.GETFIELD_FROM : EdgeType.SETFIELD_FROM; EdgeType typeRev = fi instanceof GetFieldInstruction ? EdgeType.GETFIELD_FROM : EdgeType.SETFIELD_FROM;
graph.addEdge(new Edge(i, graph.getVertexFor(fi.getMyField()), graph.getVertexFor(frame.nonStatic), typeRev)); graph.addEdge(new Edge(ctx, graph.getVertexFor(fi.getMyField()), graph.getVertexFor(frame.nonStatic), typeRev));
if (fi instanceof SetFieldInstruction && frame.lastField != null)
{
//graph.addEdge(new MethodEdge(i, graph.getVertexFor(fi.getMyField()), graph.getVertexFor(frame.lastField), EdgeType.PREV_FIELD, frame.nonStatic));
//graph.addEdge(new MethodEdge(i, graph.getVertexFor(frame.lastField), graph.getVertexFor(fi.getMyField()), EdgeType.PREV_FIELD_FROM, frame.nonStatic));
}
// if (fi instanceof SetFieldInstruction)
// {
// StackContext sctx = ctx.getPops().get(0);
// if (sctx.getPushed().getInstruction() instanceof GetFieldInstruction)
// {
// GetFieldInstruction gfi = (GetFieldInstruction) sctx.getPushed().getInstruction();
//
// if (gfi.getMyField() != null)
// {
// // XXX dup edges
// graph.addEdge(new MethodEdge(i, graph.getVertexFor(fi.getMyField()), graph.getVertexFor(gfi.getMyField()), EdgeType.FIELD_ASSIGNMENT_FIELD, frame.nonStatic));
// graph.addEdge(new MethodEdge(i, graph.getVertexFor(gfi.getMyField()), graph.getVertexFor(fi.getMyField()), EdgeType.FIELD_ASSIGNMENT_FIELD_FROM, frame.nonStatic));
// }
// }
// }
// // associated fields
// for (InstructionContext ic : getInsInExpr(ctx, new HashSet<>()))
// {
// Instruction i2 = (Instruction) ic.getInstruction();
//
// if (i2 instanceof FieldInstruction)
// {
// FieldInstruction fi2 = (FieldInstruction) i2;
//
// if (fi2.getMyField() == null)
// continue;
//
// // these are within the context of a method
// graph.addEdge(new MethodEdge(i2, graph.getVertexFor(fi.getMyField()), graph.getVertexFor(fi2.getMyField()), EdgeType.FIELD_ASSOCIATION, frame.nonStatic));
// graph.addEdge(new MethodEdge(i2, graph.getVertexFor(fi2.getMyField()), graph.getVertexFor(fi.getMyField()), EdgeType.FIELD_ASSOCIATION_FROM, frame.nonStatic));
// }
// else if (i2 instanceof InvokeInstruction)
// {
// InvokeInstruction ii2 = (InvokeInstruction) i2;
//
// if (ii2 instanceof InvokeStatic)
// continue;
//
// for (Method m : ii2.getMethods())
// {
// graph.addEdge(new MethodEdge(i2, graph.getVertexFor(fi.getMyField()), graph.getVertexFor(m), EdgeType.METHOD_ASSOCIATION, frame.nonStatic));
// graph.addEdge(new MethodEdge(i2, graph.getVertexFor(m), graph.getVertexFor(fi.getMyField()), EdgeType.METHOD_ASSOCIATION_FROM, frame.nonStatic));
// }
// }
// }
} }
} }