From bd63eeb684084fe277e18db23579c64bb4c80010 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 20 Nov 2015 16:26:04 -0500 Subject: [PATCH] Annotate original classes/fields/methods with their obfuscated name --- .../java/net/runelite/deob/ClassFile.java | 5 +++ .../runelite/deob/attributes/Annotations.java | 5 +++ .../attributes/annotation/Annotation.java | 10 ++++++ .../deob/attributes/annotation/Element.java | 10 ++++++ .../runelite/deob/deobfuscators/Renamer.java | 31 +++++++++++++++++++ 5 files changed, 61 insertions(+) diff --git a/src/main/java/net/runelite/deob/ClassFile.java b/src/main/java/net/runelite/deob/ClassFile.java index ed35fea9f2..efb09ee0b9 100644 --- a/src/main/java/net/runelite/deob/ClassFile.java +++ b/src/main/java/net/runelite/deob/ClassFile.java @@ -122,6 +122,11 @@ public class ClassFile return methods; } + public Attributes getAttributes() + { + return attributes; + } + public String getName() { return name.getName(); diff --git a/src/main/java/net/runelite/deob/attributes/Annotations.java b/src/main/java/net/runelite/deob/attributes/Annotations.java index 9447f2ad10..c95e70fa63 100644 --- a/src/main/java/net/runelite/deob/attributes/Annotations.java +++ b/src/main/java/net/runelite/deob/attributes/Annotations.java @@ -21,6 +21,11 @@ public class Annotations extends Attribute return annotations; } + public void addAnnotation(Annotation annotation) + { + annotations.add(annotation); + } + @Override public void loadAttribute(DataInputStream is) throws IOException { diff --git a/src/main/java/net/runelite/deob/attributes/annotation/Annotation.java b/src/main/java/net/runelite/deob/attributes/annotation/Annotation.java index ee747ff671..dbd6ccb949 100644 --- a/src/main/java/net/runelite/deob/attributes/annotation/Annotation.java +++ b/src/main/java/net/runelite/deob/attributes/annotation/Annotation.java @@ -25,6 +25,11 @@ public class Annotation return annotations; } + public void setType(Type type) + { + this.type = type; + } + public Type getType() { return type; @@ -35,6 +40,11 @@ public class Annotation return elements; } + public void addElement(Element element) + { + elements.add(element); + } + public void load(DataInputStream is) throws IOException { ConstantPool pool = annotations.getAttributes().getClassFile().getPool(); diff --git a/src/main/java/net/runelite/deob/attributes/annotation/Element.java b/src/main/java/net/runelite/deob/attributes/annotation/Element.java index 839130a521..a05bf34f69 100644 --- a/src/main/java/net/runelite/deob/attributes/annotation/Element.java +++ b/src/main/java/net/runelite/deob/attributes/annotation/Element.java @@ -27,10 +27,20 @@ public class Element return type; } + public void setType(Type type) + { + this.type = type; + } + public String getValue() { return value; } + + public void setValue(String value) + { + this.value = value; + } public void load(DataInputStream is) throws IOException { diff --git a/src/main/java/net/runelite/deob/deobfuscators/Renamer.java b/src/main/java/net/runelite/deob/deobfuscators/Renamer.java index 1fa6d48b73..14c60ec514 100644 --- a/src/main/java/net/runelite/deob/deobfuscators/Renamer.java +++ b/src/main/java/net/runelite/deob/deobfuscators/Renamer.java @@ -10,7 +10,12 @@ import net.runelite.deob.Deobfuscator; import net.runelite.deob.Field; import net.runelite.deob.Interfaces; import net.runelite.deob.Method; +import net.runelite.deob.attributes.Annotations; +import net.runelite.deob.attributes.AttributeType; +import net.runelite.deob.attributes.Attributes; import net.runelite.deob.attributes.Code; +import net.runelite.deob.attributes.annotation.Annotation; +import net.runelite.deob.attributes.annotation.Element; import net.runelite.deob.attributes.code.Exceptions; import net.runelite.deob.pool.NameAndType; import net.runelite.deob.signature.Signature; @@ -85,6 +90,7 @@ public class Renamer implements Deobfuscator field.setType(new Type("L" + name + ";", field.getType().getArrayDims())); } + createOriginalNameAnnotation(cf.getAttributes(), cf.getName()); cf.setName(name); } @@ -160,6 +166,27 @@ public class Renamer implements Deobfuscator c.getInstructions().regeneratePool(); } } + + private static final Type OBFUSCATED_NAME_TYPE = new Type("Lnet/runelite/mapping/ObfuscatedName"); + + private void createOriginalNameAnnotation(Attributes attr, String name) + { + Annotations an = (Annotations) attr.findType(AttributeType.RUNTIMEVISIBLEANNOTATIONS); + if (an == null) + { + an = new Annotations(attr); + attr.addAttribute(an); + } + + Annotation annotation = new Annotation(an); + annotation.setType(OBFUSCATED_NAME_TYPE); + an.addAnnotation(annotation); + + Element element = new Element(annotation); + element.setType(new Type("value")); + element.setValue(name); + annotation.addElement(element); + } @Override public void run(ClassGroup group) @@ -177,6 +204,7 @@ public class Renamer implements Deobfuscator if (newName == null) continue; + createOriginalNameAnnotation(field.getAttributes(), field.getName()); field.setName(newName); ++fields; } @@ -193,7 +221,10 @@ public class Renamer implements Deobfuscator assert !virtualMethods.isEmpty(); for (Method m : virtualMethods) + { + createOriginalNameAnnotation(m.getAttributes(), m.getName()); m.setName(newName); + } methods += virtualMethods.size(); }