From 0ed6456c60f492765be812e4604af0fc5f31de2d Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 25 Mar 2016 14:21:27 -0400 Subject: [PATCH] Move virtual method lookup its own class as many things use it --- .../code/instructions/InvokeInterface.java | 4 +- .../code/instructions/InvokeVirtual.java | 4 +- .../asm/signature/util/VirtualMethods.java | 72 +++++++++++++++++++ .../deob/deobfuscators/RenameUnique.java | 3 +- .../runelite/deob/deobfuscators/Renamer.java | 67 +---------------- 5 files changed, 80 insertions(+), 70 deletions(-) create mode 100644 src/main/java/net/runelite/asm/signature/util/VirtualMethods.java diff --git a/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeInterface.java b/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeInterface.java index 5d183e5a27..b2fadd4454 100644 --- a/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeInterface.java +++ b/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeInterface.java @@ -23,11 +23,11 @@ import java.util.Arrays; import java.util.List; import net.runelite.asm.Field; import net.runelite.asm.attributes.code.instruction.types.GetFieldInstruction; -import net.runelite.deob.deobfuscators.Renamer; import net.runelite.deob.deobfuscators.rename.MappingExecutorUtil; import net.runelite.deob.deobfuscators.rename.ParallelExecutorMapping; import net.runelite.asm.execution.Execution; import net.runelite.asm.execution.Value; +import net.runelite.asm.signature.util.VirtualMethods; public class InvokeInterface extends Instruction implements InvokeInstruction { @@ -158,7 +158,7 @@ public class InvokeInterface extends Instruction implements InvokeInstruction if (m == null) return null; - return Renamer.getVirutalMethods(m); + return VirtualMethods.getVirutalMethods(m); } @Override diff --git a/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeVirtual.java b/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeVirtual.java index 65ee99f383..63aff4f237 100644 --- a/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeVirtual.java +++ b/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeVirtual.java @@ -23,11 +23,11 @@ import java.util.Arrays; import java.util.List; import net.runelite.asm.Field; import net.runelite.asm.attributes.code.instruction.types.GetFieldInstruction; -import net.runelite.deob.deobfuscators.Renamer; import net.runelite.deob.deobfuscators.rename.MappingExecutorUtil; import net.runelite.deob.deobfuscators.rename.ParallelExecutorMapping; import net.runelite.asm.execution.Execution; import net.runelite.asm.execution.Value; +import net.runelite.asm.signature.util.VirtualMethods; public class InvokeVirtual extends Instruction implements InvokeInstruction { @@ -153,7 +153,7 @@ public class InvokeVirtual extends Instruction implements InvokeInstruction if (m == null) return null; - return Renamer.getVirutalMethods(m); + return VirtualMethods.getVirutalMethods(m); } @Override diff --git a/src/main/java/net/runelite/asm/signature/util/VirtualMethods.java b/src/main/java/net/runelite/asm/signature/util/VirtualMethods.java new file mode 100644 index 0000000000..9b519e2fc6 --- /dev/null +++ b/src/main/java/net/runelite/asm/signature/util/VirtualMethods.java @@ -0,0 +1,72 @@ +package net.runelite.asm.signature.util; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import net.runelite.asm.ClassFile; +import net.runelite.asm.Method; +import net.runelite.asm.pool.NameAndType; + +public class VirtualMethods +{ + // find the base methods for a method. search goes up from there to see if two + // different methods can be invoked with the same instruction. + private static List findBaseMethods(List methods, ClassFile cf, NameAndType method) + { + if (cf == null) + return methods; + + Method m = cf.findMethod(method); + if (m != null && !m.isStatic()) + methods.add(m); + + List parentMethods = findBaseMethods(new ArrayList(), cf.getParent(), method); + + for (ClassFile inter : cf.getInterfaces().getMyInterfaces()) + findBaseMethods(parentMethods, inter, method); + + // parentMethods take precedence over our methods + return parentMethods.isEmpty() ? methods : parentMethods; + } + + private static List findBaseMethods(Method method) + { + return findBaseMethods(new ArrayList<>(), method.getMethods().getClassFile(), method.getNameAndType()); + } + + private static void findMethodUp(List methods, Set visited, ClassFile cf, NameAndType method) + { + if (cf == null || visited.contains(cf)) + return; + + visited.add(cf); // can do diamond inheritance with interfaces + + Method m = cf.findMethod(method); + if (m != null && !m.isStatic()) + methods.add(m); + + for (ClassFile child : cf.getChildren()) + findMethodUp(methods, visited, child, method); + } + + public static List getVirutalMethods(Method method) + { + List list = new ArrayList<>(); + + if (method.isStatic()) + { + list.add(method); + return list; + } + + List bases = findBaseMethods(method); // base methods method overrides + assert !bases.isEmpty(); // must contain at least a method + + // now search up from bases, appending to list. + for (Method m : bases) + findMethodUp(list, new HashSet<>(), m.getMethods().getClassFile(), m.getNameAndType()); + + return list; + } +} diff --git a/src/main/java/net/runelite/deob/deobfuscators/RenameUnique.java b/src/main/java/net/runelite/deob/deobfuscators/RenameUnique.java index d934f16130..9fa37d865e 100644 --- a/src/main/java/net/runelite/deob/deobfuscators/RenameUnique.java +++ b/src/main/java/net/runelite/deob/deobfuscators/RenameUnique.java @@ -7,6 +7,7 @@ import net.runelite.asm.ClassGroup; import net.runelite.deob.Deobfuscator; import net.runelite.asm.Field; import net.runelite.asm.Method; +import net.runelite.asm.signature.util.VirtualMethods; import net.runelite.deob.util.NameMappings; public class RenameUnique implements Deobfuscator @@ -50,7 +51,7 @@ public class RenameUnique implements Deobfuscator if (method.getName().length() > 2) continue; - List virtualMethods = Renamer.getVirutalMethods(method); + List virtualMethods = VirtualMethods.getVirutalMethods(method); assert !virtualMethods.isEmpty(); String name; diff --git a/src/main/java/net/runelite/deob/deobfuscators/Renamer.java b/src/main/java/net/runelite/deob/deobfuscators/Renamer.java index 11905f1662..d4a44a6b83 100644 --- a/src/main/java/net/runelite/deob/deobfuscators/Renamer.java +++ b/src/main/java/net/runelite/deob/deobfuscators/Renamer.java @@ -1,9 +1,6 @@ package net.runelite.deob.deobfuscators; -import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Set; import net.runelite.asm.ClassFile; import net.runelite.asm.ClassGroup; import net.runelite.deob.Deobfuscator; @@ -12,10 +9,10 @@ import net.runelite.asm.Interfaces; import net.runelite.asm.Method; import net.runelite.asm.attributes.Code; import net.runelite.asm.attributes.code.Exceptions; -import net.runelite.asm.pool.NameAndType; import net.runelite.asm.pool.UTF8; import net.runelite.asm.signature.Signature; import net.runelite.asm.signature.Type; +import net.runelite.asm.signature.util.VirtualMethods; import net.runelite.deob.util.NameMappings; public class Renamer implements Deobfuscator @@ -92,66 +89,6 @@ public class Renamer implements Deobfuscator cf.setName(name); } - // find the base methods for a method. search goes up from there to see if two - // different methods can be invoked with the same instruction. - private static List findBaseMethods(List methods, ClassFile cf, NameAndType method) - { - if (cf == null) - return methods; - - Method m = cf.findMethod(method); - if (m != null && !m.isStatic()) - methods.add(m); - - List parentMethods = findBaseMethods(new ArrayList(), cf.getParent(), method); - - for (ClassFile inter : cf.getInterfaces().getMyInterfaces()) - findBaseMethods(parentMethods, inter, method); - - // parentMethods take precedence over our methods - return parentMethods.isEmpty() ? methods : parentMethods; - } - - private static List findBaseMethods(Method method) - { - return findBaseMethods(new ArrayList<>(), method.getMethods().getClassFile(), method.getNameAndType()); - } - - private static void findMethodUp(List methods, Set visited, ClassFile cf, NameAndType method) - { - if (cf == null || visited.contains(cf)) - return; - - visited.add(cf); // can do diamond inheritance with interfaces - - Method m = cf.findMethod(method); - if (m != null && !m.isStatic()) - methods.add(m); - - for (ClassFile child : cf.getChildren()) - findMethodUp(methods, visited, child, method); - } - - public static List getVirutalMethods(Method method) - { - List list = new ArrayList<>(); - - if (method.isStatic()) - { - list.add(method); - return list; - } - - List bases = findBaseMethods(method); // base methods method overrides - assert !bases.isEmpty(); // must contain at least a method - - // now search up from bases, appending to list. - for (Method m : bases) - findMethodUp(list, new HashSet<>(), m.getMethods().getClassFile(), m.getNameAndType()); - - return list; - } - private void regeneratePool(ClassGroup group) { for (ClassFile cf : group.getClasses()) @@ -194,7 +131,7 @@ public class Renamer implements Deobfuscator if (newName == null) continue; - List virtualMethods = getVirutalMethods(method); + List virtualMethods = VirtualMethods.getVirutalMethods(method); assert !virtualMethods.isEmpty(); for (Method m : virtualMethods)