From 933648c11dad5c2a2a09ca7be32bf32407b68608 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 20 Nov 2015 13:38:08 -0500 Subject: [PATCH] Save mappings/enc on disk --- src/main/java/net/runelite/deob/Deob.java | 2 +- .../deob/deobfuscators/RenameUnique.java | 13 +++++++++++ .../deobfuscators/arithmetic/Encryption.java | 20 +++++++++++++++- .../deobfuscators/arithmetic/ModArith.java | 23 ++++++++++++++----- .../deob/deobfuscators/arithmetic/Pair.java | 7 ++++-- .../runelite/deob/gson/ClassSerializer.java | 20 ++++++++++++++++ .../runelite/deob/gson/FieldSerializer.java | 22 ++++++++++++++++++ .../net/runelite/deob/gson/GsonFactory.java | 18 +++++++++++++++ .../runelite/deob/gson/MethodSerializer.java | 23 +++++++++++++++++++ .../net/runelite/deob/util/NameMappings.java | 17 ++++++++++++++ 10 files changed, 155 insertions(+), 10 deletions(-) create mode 100644 src/main/java/net/runelite/deob/gson/ClassSerializer.java create mode 100644 src/main/java/net/runelite/deob/gson/FieldSerializer.java create mode 100644 src/main/java/net/runelite/deob/gson/GsonFactory.java create mode 100644 src/main/java/net/runelite/deob/gson/MethodSerializer.java diff --git a/src/main/java/net/runelite/deob/Deob.java b/src/main/java/net/runelite/deob/Deob.java index eb90b91d54..f0d738dbc2 100644 --- a/src/main/java/net/runelite/deob/Deob.java +++ b/src/main/java/net/runelite/deob/Deob.java @@ -78,7 +78,7 @@ public class Deob int last = -1, cur; while ((cur = mod.runOnce()) > 0) - { + { new MultiplicationDeobfuscator().run(group); new MultiplyOneDeobfuscator().run(group); diff --git a/src/main/java/net/runelite/deob/deobfuscators/RenameUnique.java b/src/main/java/net/runelite/deob/deobfuscators/RenameUnique.java index 163e3820ee..e32d41c314 100644 --- a/src/main/java/net/runelite/deob/deobfuscators/RenameUnique.java +++ b/src/main/java/net/runelite/deob/deobfuscators/RenameUnique.java @@ -1,6 +1,10 @@ package net.runelite.deob.deobfuscators; +import java.io.File; +import java.io.IOException; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; import net.runelite.deob.ClassFile; import net.runelite.deob.ClassGroup; @@ -76,6 +80,15 @@ public class RenameUnique implements Deobfuscator this.generatFieldNames(mappings, group); this.generateMethodNames(mappings, group); + try + { + mappings.save(new File("d:/rs/07/uniquemappings.json")); + } + catch (IOException ex) + { + Logger.getLogger(RenameUnique.class.getName()).log(Level.SEVERE, null, ex); + } + renamer = new Renamer(mappings); renamer.run(group); } diff --git a/src/main/java/net/runelite/deob/deobfuscators/arithmetic/Encryption.java b/src/main/java/net/runelite/deob/deobfuscators/arithmetic/Encryption.java index e92d758448..dbd8bed369 100644 --- a/src/main/java/net/runelite/deob/deobfuscators/arithmetic/Encryption.java +++ b/src/main/java/net/runelite/deob/deobfuscators/arithmetic/Encryption.java @@ -1,8 +1,13 @@ package net.runelite.deob.deobfuscators.arithmetic; +import com.google.gson.Gson; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; import java.util.HashMap; import java.util.Map; -import net.runelite.deob.Field; +import net.runelite.deob.gson.GsonFactory; +import net.runelite.deob.pool.Field; public class Encryption { @@ -10,6 +15,8 @@ public class Encryption public void addPair(Pair pair) { + assert pair.field != null; + Pair existing = fields.get(pair.field); if (existing != null) { @@ -25,4 +32,15 @@ public class Encryption { return fields.get(field); } + + public void save(File file) throws IOException + { + Gson g = GsonFactory.gson; + String str = g.toJson(fields); + + try (FileWriter fw = new FileWriter(file)) + { + fw.write(str); + } + } } diff --git a/src/main/java/net/runelite/deob/deobfuscators/arithmetic/ModArith.java b/src/main/java/net/runelite/deob/deobfuscators/arithmetic/ModArith.java index a028d6f9ce..8d15a44d62 100644 --- a/src/main/java/net/runelite/deob/deobfuscators/arithmetic/ModArith.java +++ b/src/main/java/net/runelite/deob/deobfuscators/arithmetic/ModArith.java @@ -1,11 +1,15 @@ package net.runelite.deob.deobfuscators.arithmetic; +import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; import java.util.stream.Collectors; import net.runelite.deob.ClassFile; import net.runelite.deob.ClassGroup; @@ -445,7 +449,7 @@ public class ModArith implements Deobfuscator { System.out.println("GOOD " + field.getName() + " " + s1 + " * " + s2 + " = " + smallest + " " + g + " " + g2); Pair p = new Pair(); - p.field = field; + p.field = field.getPoolField(); if (g != inverse) { p.getter = s1; @@ -582,7 +586,7 @@ public class ModArith implements Deobfuscator if (f == null) continue; - Pair p = encr.getField(f); + Pair p = encr.getField(f.getPoolField()); if (p == null) continue; @@ -610,7 +614,7 @@ public class ModArith implements Deobfuscator if (f == null) continue; - Pair p = encr.getField(f); + Pair p = encr.getField(f.getPoolField()); if (p == null) continue; @@ -653,9 +657,7 @@ public class ModArith implements Deobfuscator int i = 0; for (Pair pair : pairs) { - Field field = pair.field; - - System.out.println("Processing " + field.getName() + " getter " + pair.getter + " setter " + pair.setter); + System.out.println("Processing " + pair.field.getNameAndType().getName() + " getter " + pair.getter + " setter " + pair.setter); Encryption encr = new Encryption(); encr.addPair(pair); @@ -668,6 +670,15 @@ public class ModArith implements Deobfuscator System.out.println(pairs); + try + { + encryption.save(new File("d:/rs/07/encryption.json")); + } + catch (IOException ex) + { + Logger.getLogger(ModArith.class.getName()).log(Level.SEVERE, null, ex); + } + return i; } diff --git a/src/main/java/net/runelite/deob/deobfuscators/arithmetic/Pair.java b/src/main/java/net/runelite/deob/deobfuscators/arithmetic/Pair.java index efcee01071..97ed804d7b 100644 --- a/src/main/java/net/runelite/deob/deobfuscators/arithmetic/Pair.java +++ b/src/main/java/net/runelite/deob/deobfuscators/arithmetic/Pair.java @@ -1,6 +1,6 @@ package net.runelite.deob.deobfuscators.arithmetic; -import net.runelite.deob.Field; +import net.runelite.deob.pool.Field; public class Pair { @@ -14,10 +14,13 @@ public class Pair public Pair(Pair one, Pair two) { assert one.getType() == two.getType(); - assert one.field == two.field; + assert one.field != null; + assert two.field != null; + assert one.field.equals(two.field); getter = DMath.multiply(one.getter, two.getter); setter = DMath.multiply(one.setter, two.setter); + field = one.field; } public Class getType() diff --git a/src/main/java/net/runelite/deob/gson/ClassSerializer.java b/src/main/java/net/runelite/deob/gson/ClassSerializer.java new file mode 100644 index 0000000000..9d379c2c62 --- /dev/null +++ b/src/main/java/net/runelite/deob/gson/ClassSerializer.java @@ -0,0 +1,20 @@ +package net.runelite.deob.gson; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import java.lang.reflect.Type; +import net.runelite.deob.pool.Class; + +public class ClassSerializer implements JsonSerializer +{ + @Override + public JsonElement serialize(Class src, Type typeOfSrc, JsonSerializationContext context) + { + JsonObject object = new JsonObject(); + object.addProperty("name", src.getName()); + return object; + } + +} diff --git a/src/main/java/net/runelite/deob/gson/FieldSerializer.java b/src/main/java/net/runelite/deob/gson/FieldSerializer.java new file mode 100644 index 0000000000..117af2c2ca --- /dev/null +++ b/src/main/java/net/runelite/deob/gson/FieldSerializer.java @@ -0,0 +1,22 @@ +package net.runelite.deob.gson; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import java.lang.reflect.Type; +import net.runelite.deob.pool.Field; + +public class FieldSerializer implements JsonSerializer +{ + @Override + public JsonElement serialize(Field src, Type typeOfSrc, JsonSerializationContext context) + { + JsonObject object = new JsonObject(); + object.addProperty("class", src.getClassEntry().getName()); + object.addProperty("name", src.getNameAndType().getName()); + object.add("type", context.serialize(src.getNameAndType().getDescriptorType())); + return object; + } + +} diff --git a/src/main/java/net/runelite/deob/gson/GsonFactory.java b/src/main/java/net/runelite/deob/gson/GsonFactory.java new file mode 100644 index 0000000000..3d658f585d --- /dev/null +++ b/src/main/java/net/runelite/deob/gson/GsonFactory.java @@ -0,0 +1,18 @@ +package net.runelite.deob.gson; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import net.runelite.deob.pool.Field; +import net.runelite.deob.pool.Method; +import net.runelite.deob.pool.Class; + +public class GsonFactory +{ + public static final Gson gson = new GsonBuilder() + .registerTypeAdapter(Field.class, new FieldSerializer()) + .registerTypeAdapter(Method.class, new MethodSerializer()) + .registerTypeAdapter(Class.class, new ClassSerializer()) + .enableComplexMapKeySerialization() + .setPrettyPrinting() + .create(); +} diff --git a/src/main/java/net/runelite/deob/gson/MethodSerializer.java b/src/main/java/net/runelite/deob/gson/MethodSerializer.java new file mode 100644 index 0000000000..2ce6a547a5 --- /dev/null +++ b/src/main/java/net/runelite/deob/gson/MethodSerializer.java @@ -0,0 +1,23 @@ +package net.runelite.deob.gson; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import java.lang.reflect.Type; +import net.runelite.deob.pool.Method; + + +public class MethodSerializer implements JsonSerializer +{ + @Override + public JsonElement serialize(Method src, Type typeOfSrc, JsonSerializationContext context) + { + JsonObject object = new JsonObject(); + object.addProperty("class", src.getClassEntry().getName()); + object.addProperty("name", src.getNameAndType().getName()); + object.add("type", context.serialize(src.getNameAndType().getDescriptor())); + return object; + } + +} diff --git a/src/main/java/net/runelite/deob/util/NameMappings.java b/src/main/java/net/runelite/deob/util/NameMappings.java index 74a5713df6..acbe690a80 100644 --- a/src/main/java/net/runelite/deob/util/NameMappings.java +++ b/src/main/java/net/runelite/deob/util/NameMappings.java @@ -1,7 +1,13 @@ package net.runelite.deob.util; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; import java.util.HashMap; import java.util.Map; +import net.runelite.deob.gson.GsonFactory; import net.runelite.deob.pool.Class; import net.runelite.deob.pool.Field; import net.runelite.deob.pool.Method; @@ -34,4 +40,15 @@ public class NameMappings { return map; } + + public void save(File file) throws IOException + { + Gson g = GsonFactory.gson; + String str = g.toJson(map); + + try (FileWriter fw = new FileWriter(file)) + { + fw.write(str); + } + } }