Add FieldOrderTransformer

bzip2
Graham 5 years ago
parent b37feb0535
commit 82d359ad4d
  1. 4
      deob/src/main/java/dev/openrs2/deob/Deobfuscator.java
  2. 52
      deob/src/main/java/dev/openrs2/deob/transform/FieldOrderTransformer.java

@ -15,6 +15,7 @@ import dev.openrs2.deob.transform.CanvasTransformer;
import dev.openrs2.deob.transform.ClassForNameTransformer; import dev.openrs2.deob.transform.ClassForNameTransformer;
import dev.openrs2.deob.transform.CounterTransformer; import dev.openrs2.deob.transform.CounterTransformer;
import dev.openrs2.deob.transform.ExceptionTracingTransformer; import dev.openrs2.deob.transform.ExceptionTracingTransformer;
import dev.openrs2.deob.transform.FieldOrderTransformer;
import dev.openrs2.deob.transform.OpaquePredicateTransformer; import dev.openrs2.deob.transform.OpaquePredicateTransformer;
import dev.openrs2.deob.transform.OriginalNameTransformer; import dev.openrs2.deob.transform.OriginalNameTransformer;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -27,7 +28,8 @@ public final class Deobfuscator {
new OpaquePredicateTransformer(), new OpaquePredicateTransformer(),
new ExceptionTracingTransformer(), new ExceptionTracingTransformer(),
new CounterTransformer(), new CounterTransformer(),
new CanvasTransformer() new CanvasTransformer(),
new FieldOrderTransformer()
); );
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {

@ -0,0 +1,52 @@
package dev.openrs2.deob.transform;
import java.util.HashMap;
import dev.openrs2.asm.MemberDesc;
import dev.openrs2.asm.Transformer;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.FieldInsnNode;
public final class FieldOrderTransformer extends Transformer {
private static final String CONSTRUCTOR = "<init>";
private static final String STATIC_CONSTRUCTOR = "<clinit>";
private static void sortFields(ClassNode clazz, String ctorName, int opcode) {
clazz.methods.stream()
.filter(m -> m.name.equals(ctorName))
.findFirst()
.ifPresent(ctor -> {
var fields = new HashMap<MemberDesc, Integer>();
var index = 0;
for (var insn = ctor.instructions.getFirst(); insn != null; insn = insn.getNext()) {
if (insn.getOpcode() != opcode) {
continue;
}
var putfield = (FieldInsnNode) insn;
if (!putfield.owner.equals(clazz.name)) {
continue;
}
var desc = new MemberDesc(putfield.name, putfield.desc);
if (!fields.containsKey(desc)) {
fields.put(desc, index++);
}
}
clazz.fields.sort((a, b) -> {
var indexA = fields.getOrDefault(new MemberDesc(a.name, a.desc), -1);
var indexB = fields.getOrDefault(new MemberDesc(b.name, b.desc), -1);
return Integer.compare(indexA, indexB);
});
});
}
@Override
public void transformClass(ClassNode clazz) {
sortFields(clazz, CONSTRUCTOR, Opcodes.PUTFIELD);
sortFields(clazz, STATIC_CONSTRUCTOR, Opcodes.PUTSTATIC);
}
}
Loading…
Cancel
Save