From 6e79aece20a12aac9f33ee4883c5d124df6b46d2 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 11 Mar 2016 17:34:09 -0500 Subject: [PATCH] Some injecting classes now works --- .../java/net/runelite/deob/ClassFile.java | 5 ++ .../net/runelite/deob/injection/Inject.java | 12 +++ .../deob/injection/InjectReplace.java | 73 ++++++++++--------- .../runelite/deob/injection/InjectTest.java | 1 - 4 files changed, 55 insertions(+), 36 deletions(-) diff --git a/src/main/java/net/runelite/deob/ClassFile.java b/src/main/java/net/runelite/deob/ClassFile.java index 7aed013180..f2d5a49cf1 100644 --- a/src/main/java/net/runelite/deob/ClassFile.java +++ b/src/main/java/net/runelite/deob/ClassFile.java @@ -295,4 +295,9 @@ public class ClassFile { return (this.access_flags & ACC_FINAL) != 0; } + + public void clearFinal() + { + this.access_flags &= ~ACC_FINAL; + } } diff --git a/src/main/java/net/runelite/deob/injection/Inject.java b/src/main/java/net/runelite/deob/injection/Inject.java index 116285363d..96ebc564b8 100644 --- a/src/main/java/net/runelite/deob/injection/Inject.java +++ b/src/main/java/net/runelite/deob/injection/Inject.java @@ -1,5 +1,6 @@ package net.runelite.deob.injection; +import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; @@ -117,6 +118,17 @@ public class Inject java.lang.Class implementingClass = injectInterface(cf, other); if (implementingClass == null) continue; + + InjectReplace ij = new InjectReplace(cf, other); + try + { + ij.run(); + } + catch (ClassNotFoundException | IOException ex) + { + ex.printStackTrace(); + assert false; + } for (Field f : cf.getFields().getFields()) { diff --git a/src/main/java/net/runelite/deob/injection/InjectReplace.java b/src/main/java/net/runelite/deob/injection/InjectReplace.java index 37c9fbbb00..fd308932ed 100644 --- a/src/main/java/net/runelite/deob/injection/InjectReplace.java +++ b/src/main/java/net/runelite/deob/injection/InjectReplace.java @@ -74,12 +74,13 @@ public class InjectReplace // set parent classToInject.setParentClass(vanilla.getPoolClass()); - assert !vanilla.isFinal(); + vanilla.clearFinal(); // can't be final anymore now that we inherit from it injectConstructors(classToInject); overideMethods(classToInject); + // find all classes which inherit from 'vanilla'. replace with classToInject replaceSuperclass(classToInject); replaceNew(classToInject); @@ -228,11 +229,12 @@ public class InjectReplace private void replaceSuperclass(ClassFile classToInject) { - // find all classes which inherit from 'vanilla'. replace with classToInject - for (ClassFile cf : vanilla.getGroup().getClasses()) if (cf.getParentClass().equals(vanilla.getPoolClass())) { + if (cf == classToInject) // of course this inherits from it. + continue; + cf.setParentClass(classToInject.getPoolClass()); // adjust constructors @@ -275,46 +277,47 @@ public class InjectReplace // new vanilla -> new classToInject for (ClassFile cf : vanilla.getGroup().getClasses()) - if (cf.getParentClass().equals(vanilla.getPoolClass())) + for (Method m : cf.getMethods().getMethods()) { - for (Method m : cf.getMethods().getMethods()) + Code code = m.getCode(); + + if (code == null) + continue; + + Instructions ins = code.getInstructions(); + + boolean seen = false, isConstructor = m.getName().equals(""); + + for (Instruction i : ins.getInstructions()) { - Code code = m.getCode(); - Instructions ins = code.getInstructions(); - - boolean seen = false, isConstructor = m.getName().equals(""); - - for (Instruction i : ins.getInstructions()) + if (i instanceof New) { - if (i instanceof New) - { - New n = (New) i; - if (!n.getNewClass().equals(vanilla.getPoolClass())) - continue; + New n = (New) i; + if (!n.getNewClass().equals(vanilla.getPoolClass())) + continue; - n.setNewClass(classToInject.getPoolClass()); - } - else if (i instanceof InvokeSpecial) + n.setNewClass(classToInject.getPoolClass()); + } + else if (i instanceof InvokeSpecial) + { + if (isConstructor) { - if (isConstructor) + if (!seen) { - if (!seen) - { - seen = true; - continue; // superclass invoke in constructor of class which inherits classToInject - } + seen = true; + continue; // superclass invoke in constructor of class which inherits classToInject } - - InvokeSpecial is = (InvokeSpecial) i; - net.runelite.deob.pool.Method method = (net.runelite.deob.pool.Method) is.getMethod(); - - is.setMethod( - new net.runelite.deob.pool.Method( - classToInject.getPoolClass(), - method.getNameAndType() - ) - ); } + + InvokeSpecial is = (InvokeSpecial) i; + net.runelite.deob.pool.Method method = (net.runelite.deob.pool.Method) is.getMethod(); + + is.setMethod( + new net.runelite.deob.pool.Method( + classToInject.getPoolClass(), + method.getNameAndType() + ) + ); } } } diff --git a/src/test/java/net/runelite/deob/injection/InjectTest.java b/src/test/java/net/runelite/deob/injection/InjectTest.java index 3ffdee8d5f..3b00e6d271 100644 --- a/src/test/java/net/runelite/deob/injection/InjectTest.java +++ b/src/test/java/net/runelite/deob/injection/InjectTest.java @@ -3,7 +3,6 @@ package net.runelite.deob.injection; import java.io.File; import java.io.IOException; import net.runelite.deob.ClassGroup; -import net.runelite.deob.runeloader.MappingImporter; import net.runelite.deob.util.JarUtil; import org.junit.After; import org.junit.Before;