Annotate original classes/fields/methods with their obfuscated name

This commit is contained in:
Adam
2015-11-20 16:26:04 -05:00
parent dac030002a
commit bd63eeb684
5 changed files with 61 additions and 0 deletions

View File

@@ -122,6 +122,11 @@ public class ClassFile
return methods;
}
public Attributes getAttributes()
{
return attributes;
}
public String getName()
{
return name.getName();

View File

@@ -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
{

View File

@@ -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();

View File

@@ -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
{

View File

@@ -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();
}