From c55c2f7399702caa22abc6d84e4ad02886b1d75c Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 26 Nov 2015 11:07:35 -0600 Subject: [PATCH] Solved methods 952, solved fields 1028, unsolved methods 106, unsolved fields 1267 --- .../deob/deobfuscators/rename/Rename2.java | 61 ++++++++++++------- .../deobfuscators/rename/graph/EdgeType.java | 4 +- .../deobfuscators/rename/graph/Graph.java | 9 +++ .../deobfuscators/rename/graph/Vertex.java | 34 ++++++++--- .../runelite/deob/execution/Execution.java | 6 +- 5 files changed, 78 insertions(+), 36 deletions(-) diff --git a/src/main/java/net/runelite/deob/deobfuscators/rename/Rename2.java b/src/main/java/net/runelite/deob/deobfuscators/rename/Rename2.java index 1a35464621..4bf46a549c 100644 --- a/src/main/java/net/runelite/deob/deobfuscators/rename/Rename2.java +++ b/src/main/java/net/runelite/deob/deobfuscators/rename/Rename2.java @@ -158,6 +158,13 @@ public class Rename2 assert s.getGraph() != other.getGraph(); + boolean b =false; + if (s.toString().equals("Vertex{object=B[] class118.field1980}") + && other.toString().equals("Vertex{object=B[] class118.field1986}")) + { + b=true; + } + for (Edge e : s.getEdges()) { assert e.getFrom() == s; @@ -166,12 +173,11 @@ public class Rename2 continue; // skip solved edges Vertex v = e.getTo(); // end of edge in g1 - - boolean b = false; - if (s.toString().equals("Vertex{object=class0.()V}") && - v.toString().equals("Vertex{object=class207.()V}")) + + boolean b2 = false; + if (b && v.toString().equals("Vertex{object=class118.method2566()B}")) { - b = true; + b2 = true; } List l = new ArrayList<>(); @@ -180,15 +186,24 @@ public class Rename2 if (e2.getTo().getOther() != null) continue; // skip solved edges + if (b2) + { + Method m = (Method) e2.getTo().getObject(); + if (m.getName().equals("method2489")) + { + b2 = true; + } + } + if (!e.getTo().couldBeEqual(e2.getTo())) { - System.out.println(e.getTo() + " != " + e2.getTo()); + // System.out.println(e.getTo() + " != " + e2.getTo()); continue; } if (!e.couldBeEqual(e2)) { - System.out.println(e + " != " + e2); + // System.out.println(e + " != " + e2); continue; } @@ -239,21 +254,21 @@ public class Rename2 ClassFile cf1 = one.findClass("client"), cf2 = two.findClass("client"); mapDeobfuscatedMethods(cf1, cf2); -// List fl1 = getClientFields(one, eone); -// List fl2 = getClientFields(two, etwo); -// -// for (int i = 0; i < Math.min(fl1.size(), fl2.size()); ++i) -// { -// Field f1 = fl1.get(i), f2 = fl2.get(i); -// -// Vertex v1 = g1.getVertexFor(f1); -// Vertex v2 = g2.getVertexFor(f2); -// -// v1.is(v2); -// v2.is(v1); -// -// System.out.println(fname(f1) + " is " + fname(f2)); -// } + List fl1 = getClientFields(one, eone); + List fl2 = getClientFields(two, etwo); + + for (int i = 0; i < Math.min(fl1.size(), fl2.size()); ++i) + { + Field f1 = fl1.get(i), f2 = fl2.get(i); + + Vertex v1 = g1.getVertexFor(f1); + Vertex v2 = g2.getVertexFor(f2); + + v1.is(v2); + v2.is(v1); + + System.out.println(fname(f1) + " is " + fname(f2)); + } System.out.println("g1 verticies " + g1.getVerticies().size() + " reachable " + g1.reachableVerticiesFromSolvedVerticies().size()); Set reachable = g1.reachableVerticiesFromSolvedVerticies(); @@ -314,7 +329,7 @@ public class Rename2 // // show(mappings); - System.out.println("Solved methods "+ g1.solved(VertexType.METHOD) + ", solved fields " + g1.solved(VertexType.FIELD) + ", total " + g1.getVerticies().size()); + System.out.println("Solved methods "+ g1.solved(VertexType.METHOD) + ", solved fields " + g1.solved(VertexType.FIELD) + ", unsolved methods " +g1.unsolved(VertexType.METHOD) + ", unsolved fields " + g1.unsolved(VertexType.FIELD)); //rename(mappings, two); diff --git a/src/main/java/net/runelite/deob/deobfuscators/rename/graph/EdgeType.java b/src/main/java/net/runelite/deob/deobfuscators/rename/graph/EdgeType.java index c31043ee79..9651842c6c 100644 --- a/src/main/java/net/runelite/deob/deobfuscators/rename/graph/EdgeType.java +++ b/src/main/java/net/runelite/deob/deobfuscators/rename/graph/EdgeType.java @@ -6,5 +6,7 @@ public enum EdgeType GETFIELD, SETFIELD, - INVOKED_FROM; + INVOKED_FROM, + GETFIELD_FROM, + SETFIELD_FROM; } diff --git a/src/main/java/net/runelite/deob/deobfuscators/rename/graph/Graph.java b/src/main/java/net/runelite/deob/deobfuscators/rename/graph/Graph.java index 38ae410a8c..872eb8839c 100644 --- a/src/main/java/net/runelite/deob/deobfuscators/rename/graph/Graph.java +++ b/src/main/java/net/runelite/deob/deobfuscators/rename/graph/Graph.java @@ -93,6 +93,15 @@ public class Graph return solved; } + public int unsolved(VertexType type) + { + int solved = 0; + for (Vertex v : verticies) + if (v.getOther() == null && type == v.getType()) + ++solved; + return solved; + } + private void recurse(Vertex v, Set verticies) { if (verticies.contains(v)) diff --git a/src/main/java/net/runelite/deob/deobfuscators/rename/graph/Vertex.java b/src/main/java/net/runelite/deob/deobfuscators/rename/graph/Vertex.java index 77b4d26a17..2f981f0722 100644 --- a/src/main/java/net/runelite/deob/deobfuscators/rename/graph/Vertex.java +++ b/src/main/java/net/runelite/deob/deobfuscators/rename/graph/Vertex.java @@ -122,9 +122,14 @@ public class Vertex public void merge(Collection maybe) { boolean b = false; - if (this.toString().equals("Vertex{object=class207.()V}")) + if (this.object instanceof Method) { - b = true; + Method m = (Method) object; + + if (m.getName().equals("method2566")) + { + b = true; + } } if (mightBe == null) @@ -133,7 +138,7 @@ public class Vertex { int old = mightBe.size(); mightBe = CollectionUtils.intersection(mightBe, maybe); - if (old == 1 && mightBe.isEmpty()) + if (b && old == 1 && mightBe.isEmpty()) { int i = 6; } @@ -152,11 +157,11 @@ public class Vertex if (mightBe != null && mightBe.size() > 1) { - System.out.println("Can't decide for " + this); + // System.out.println("Can't decide for " + this); - for(Vertex v : mightBe) - System.out.println(v); - int i = 5; + // for(Vertex v : mightBe) + // System.out.println(v); + // int i = 5; } if (mightBe.isEmpty()) { @@ -166,6 +171,7 @@ public class Vertex if (mightBe != null && mightBe.size() == 1) { Vertex v = mightBe.stream().findAny().get(); + //if (v.getOther() == null || v.getOther() == this) { is(v); @@ -173,6 +179,12 @@ public class Vertex mightBe = null; System.out.println(this + " is " + is); } + + if (object instanceof Method) + { + //Method m = (Method) object; + //if (m.getName().equals + } } } @@ -180,9 +192,11 @@ public class Vertex { if (is != null) { - assert graph != other.graph; - assert is.graph == other.graph; - Rename2.collide(object, is.object, other.object); + assert is.is == this; + is.is = null; + is = null; + + //Rename2.collide(object, is.object, other.object); } assert is == null; assert other.graph != graph; diff --git a/src/main/java/net/runelite/deob/execution/Execution.java b/src/main/java/net/runelite/deob/execution/Execution.java index 767349e05a..35eff6776d 100644 --- a/src/main/java/net/runelite/deob/execution/Execution.java +++ b/src/main/java/net/runelite/deob/execution/Execution.java @@ -184,7 +184,7 @@ public class Execution for (Field f : cf.getFields().getFields()) { - // graph.addVertex(f, VertexType.FIELD); + graph.addVertex(f, VertexType.FIELD); } } } @@ -221,7 +221,9 @@ public class Execution return; EdgeType type = fi instanceof GetFieldInstruction ? EdgeType.GETFIELD : EdgeType.SETFIELD; - //graph.addEdge(frame.nonStatic, fi.getMyField(), type); + graph.addEdge(frame.nonStatic, fi.getMyField(), type); + EdgeType typeRev = fi instanceof GetFieldInstruction ? EdgeType.GETFIELD_FROM : EdgeType.SETFIELD_FROM; + graph.addEdge(fi.getMyField(), frame.nonStatic, typeRev); } }