project: Mixing stuff and what not
This commit is contained in:
@@ -8,6 +8,8 @@
|
||||
package com.openosrs.injector;
|
||||
|
||||
import com.openosrs.injector.injection.InjectData;
|
||||
import static com.openosrs.injector.rsapi.RSApi.API_BASE;
|
||||
import static com.openosrs.injector.rsapi.RSApi.RL_API_BASE;
|
||||
import com.openosrs.injector.rsapi.RSApiClass;
|
||||
import com.openosrs.injector.rsapi.RSApiMethod;
|
||||
import java.util.List;
|
||||
@@ -42,8 +44,6 @@ import net.runelite.asm.signature.Signature;
|
||||
import net.runelite.deob.DeobAnnotations;
|
||||
import net.runelite.deob.deobfuscators.arithmetic.DMath;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import static com.openosrs.injector.rsapi.RSApi.API_BASE;
|
||||
import static com.openosrs.injector.rsapi.RSApi.RL_API_BASE;
|
||||
|
||||
public interface InjectUtil
|
||||
{
|
||||
@@ -552,4 +552,27 @@ public interface InjectUtil
|
||||
{
|
||||
injectObfuscatedGetter(DMath.modInverse(getter), instrs, into);
|
||||
}
|
||||
|
||||
private static List<Type> findArgs(final String str, final List<Type> ret, final int from, final int to)
|
||||
{
|
||||
if (from >= to)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
int i = from;
|
||||
while (str.charAt(i) == '[')
|
||||
{
|
||||
++i;
|
||||
}
|
||||
|
||||
if (str.charAt(i) == 'L')
|
||||
{
|
||||
i = str.indexOf(';', i);
|
||||
}
|
||||
|
||||
ret.add(new Type(str.substring(from, ++i)));
|
||||
|
||||
return findArgs(str, ret, i, to);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,8 @@ import com.openosrs.injector.injectors.raw.GraphicsObject;
|
||||
import com.openosrs.injector.injectors.raw.Occluder;
|
||||
import com.openosrs.injector.injectors.raw.RasterizerAlpha;
|
||||
import com.openosrs.injector.injectors.raw.RenderDraw;
|
||||
import com.openosrs.injector.injectors.raw.CopyRuneLiteClasses;
|
||||
import com.openosrs.injector.injectors.raw.RuneLiteIterableHashTable;
|
||||
import com.openosrs.injector.injectors.raw.RuneliteObject;
|
||||
import com.openosrs.injector.injectors.raw.ScriptVM;
|
||||
import com.openosrs.injector.rsapi.RSApi;
|
||||
@@ -111,6 +113,12 @@ public class Injector extends InjectData implements InjectTaskHandler
|
||||
|
||||
inject(new CreateAnnotations(this));
|
||||
|
||||
inject(new GraphicsObject(this));
|
||||
|
||||
inject(new CopyRuneLiteClasses(this));
|
||||
|
||||
inject(new RuneLiteIterableHashTable(this));
|
||||
|
||||
inject(new RuneliteObject(this));
|
||||
|
||||
inject(new InterfaceInjector(this));
|
||||
@@ -142,8 +150,6 @@ public class Injector extends InjectData implements InjectTaskHandler
|
||||
|
||||
inject(new AddPlayerToMenu(this));
|
||||
|
||||
inject(new GraphicsObject(this));
|
||||
|
||||
validate(new InjectorValidator(this));
|
||||
|
||||
transform(new SourceChanger(this));
|
||||
|
||||
@@ -0,0 +1,272 @@
|
||||
/*
|
||||
* Copyright (c) 2021, Owain van Brakel <https://github.com/Owain94>
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is licensed under GPL3, see the complete license in
|
||||
* the LICENSE file in the root directory of this submodule.
|
||||
*/
|
||||
package com.openosrs.injector.injectors.raw;
|
||||
|
||||
import com.openosrs.injector.InjectUtil;
|
||||
import com.openosrs.injector.injection.InjectData;
|
||||
import com.openosrs.injector.injectors.AbstractInjector;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import net.runelite.asm.ClassFile;
|
||||
import net.runelite.asm.Field;
|
||||
import net.runelite.asm.Method;
|
||||
import net.runelite.asm.Type;
|
||||
import net.runelite.asm.attributes.Code;
|
||||
import net.runelite.asm.attributes.code.Instruction;
|
||||
import net.runelite.asm.attributes.code.Instructions;
|
||||
import net.runelite.asm.attributes.code.instructions.GetField;
|
||||
import net.runelite.asm.attributes.code.instructions.GetStatic;
|
||||
import net.runelite.asm.attributes.code.instructions.InvokeSpecial;
|
||||
import net.runelite.asm.attributes.code.instructions.InvokeStatic;
|
||||
import net.runelite.asm.attributes.code.instructions.InvokeVirtual;
|
||||
import net.runelite.asm.attributes.code.instructions.New;
|
||||
import net.runelite.asm.attributes.code.instructions.PutField;
|
||||
import net.runelite.asm.attributes.code.instructions.PutStatic;
|
||||
import net.runelite.asm.pool.Class;
|
||||
import net.runelite.asm.signature.Signature;
|
||||
import org.objectweb.asm.Opcodes;
|
||||
|
||||
public class CopyRuneLiteClasses extends AbstractInjector
|
||||
{
|
||||
private static final List<String> RUNELITE_OBJECTS = List.of(
|
||||
"RuneLiteObject",
|
||||
"RuneLiteIterableHashTable"
|
||||
);
|
||||
|
||||
public CopyRuneLiteClasses(InjectData inject)
|
||||
{
|
||||
super(inject);
|
||||
}
|
||||
|
||||
public void inject()
|
||||
{
|
||||
for (String className : RUNELITE_OBJECTS)
|
||||
{
|
||||
ClassFile runeliteObjectVanilla = inject.vanilla.findClass(className);
|
||||
|
||||
final ClassFile runeLiteObjectDeob = inject.getDeobfuscated()
|
||||
.findClass(className);
|
||||
|
||||
if (runeliteObjectVanilla == null)
|
||||
{
|
||||
runeliteObjectVanilla = new ClassFile(inject.vanilla);
|
||||
runeliteObjectVanilla.setVersion(Opcodes.V1_8);
|
||||
runeliteObjectVanilla.setName(className);
|
||||
runeliteObjectVanilla.setAccess(runeLiteObjectDeob.getAccess());
|
||||
|
||||
if (runeLiteObjectDeob.getParentClass() != null)
|
||||
{
|
||||
ClassFile deobClass = inject.getDeobfuscated().findClass(runeLiteObjectDeob.getParentClass().getName());
|
||||
|
||||
if (deobClass != null)
|
||||
{
|
||||
runeliteObjectVanilla.setParentClass(inject.toVanilla(deobClass).getPoolClass());
|
||||
}
|
||||
else
|
||||
{
|
||||
runeliteObjectVanilla.setParentClass(runeLiteObjectDeob.getParentClass());
|
||||
}
|
||||
}
|
||||
|
||||
inject.toVanilla.put(runeLiteObjectDeob, runeliteObjectVanilla);
|
||||
|
||||
for (Class interfaze : runeLiteObjectDeob.getInterfaces())
|
||||
{
|
||||
runeliteObjectVanilla.getInterfaces().addInterface(interfaze);
|
||||
}
|
||||
|
||||
for (Field field : runeLiteObjectDeob.getFields())
|
||||
{
|
||||
field.setType(InjectUtil.deobToVanilla(inject, field.getType()));
|
||||
runeliteObjectVanilla.addField(field);
|
||||
}
|
||||
|
||||
for (Method method : runeLiteObjectDeob.getMethods())
|
||||
{
|
||||
method.setDescriptor(getObfuscatedSignature(method.getDescriptor()));
|
||||
|
||||
Code code = method.getCode();
|
||||
|
||||
if (code != null)
|
||||
{
|
||||
Instructions ins = code.getInstructions();
|
||||
for (ListIterator<Instruction> iterator = ins.listIterator(); iterator.hasNext(); )
|
||||
{
|
||||
Instruction i = iterator.next();
|
||||
|
||||
if (i instanceof PutField)
|
||||
{
|
||||
net.runelite.asm.pool.Field field = ((PutField) i).getField();
|
||||
Field vanilla = findField(field);
|
||||
|
||||
if (vanilla != null)
|
||||
{
|
||||
iterator.set(new PutField(ins, vanilla));
|
||||
}
|
||||
else
|
||||
{
|
||||
field.setType(getObfuscatedSignature(field.getType()));
|
||||
iterator.set(new PutField(ins, field));
|
||||
}
|
||||
}
|
||||
else if (i instanceof GetField)
|
||||
{
|
||||
net.runelite.asm.pool.Field field = ((GetField) i).getField();
|
||||
Field vanilla = findField(field);
|
||||
|
||||
if (vanilla != null)
|
||||
{
|
||||
iterator.set(new GetField(ins, vanilla));
|
||||
}
|
||||
else
|
||||
{
|
||||
field.setType(getObfuscatedSignature(field.getType()));
|
||||
iterator.set(new GetField(ins, field));
|
||||
}
|
||||
}
|
||||
else if (i instanceof PutStatic)
|
||||
{
|
||||
net.runelite.asm.pool.Field field = ((PutStatic) i).getField();
|
||||
Field vanilla = findField(field);
|
||||
|
||||
if (vanilla != null)
|
||||
{
|
||||
iterator.set(new PutStatic(ins, vanilla));
|
||||
}
|
||||
else
|
||||
{
|
||||
field.setType(getObfuscatedSignature(field.getType()));
|
||||
iterator.set(new PutStatic(ins, field));
|
||||
}
|
||||
}
|
||||
else if (i instanceof GetStatic)
|
||||
{
|
||||
net.runelite.asm.pool.Field field = ((GetStatic) i).getField();
|
||||
Field vanilla = findField(field);
|
||||
|
||||
if (vanilla != null)
|
||||
{
|
||||
iterator.set(new GetStatic(ins, vanilla));
|
||||
}
|
||||
else
|
||||
{
|
||||
field.setType(getObfuscatedSignature(field.getType()));
|
||||
iterator.set(new GetStatic(ins, field));
|
||||
}
|
||||
}
|
||||
else if (i instanceof InvokeSpecial)
|
||||
{
|
||||
net.runelite.asm.pool.Method meth = ((InvokeSpecial) i).getMethod();
|
||||
Method vanilla = findMethod(meth, true);
|
||||
|
||||
if (vanilla != null)
|
||||
{
|
||||
iterator.set(new InvokeSpecial(ins, vanilla));
|
||||
}
|
||||
else
|
||||
{
|
||||
meth.setType(getObfuscatedSignature(meth.getType()));
|
||||
iterator.set(new InvokeSpecial(ins, meth));
|
||||
}
|
||||
}
|
||||
else if (i instanceof InvokeStatic)
|
||||
{
|
||||
net.runelite.asm.pool.Method meth = ((InvokeStatic) i).getMethod();
|
||||
Method vanilla = findMethod(meth, false);
|
||||
|
||||
if (vanilla != null)
|
||||
{
|
||||
iterator.set(new InvokeStatic(ins, vanilla));
|
||||
}
|
||||
else
|
||||
{
|
||||
meth.setType(getObfuscatedSignature(meth.getType()));
|
||||
iterator.set(new InvokeStatic(ins, meth));
|
||||
}
|
||||
}
|
||||
else if (i instanceof InvokeVirtual)
|
||||
{
|
||||
net.runelite.asm.pool.Method meth = ((InvokeVirtual) i).getMethod();
|
||||
Method vanilla = findMethod(meth, true);
|
||||
|
||||
if (vanilla != null)
|
||||
{
|
||||
iterator.set(new InvokeVirtual(ins, vanilla));
|
||||
}
|
||||
else
|
||||
{
|
||||
meth.setType(getObfuscatedSignature(meth.getType()));
|
||||
iterator.set(new InvokeVirtual(ins, meth));
|
||||
}
|
||||
}
|
||||
else if (i instanceof New)
|
||||
{
|
||||
|
||||
Class clazz = ((New) i).getNewClass();
|
||||
ClassFile deobClass = inject.getDeobfuscated().findClass(clazz.getName());
|
||||
|
||||
if (deobClass != null)
|
||||
{
|
||||
iterator.set(new New(ins, inject.toVanilla(deobClass)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
runeliteObjectVanilla.addMethod(method);
|
||||
}
|
||||
|
||||
inject.vanilla.addClass(runeliteObjectVanilla);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Signature getObfuscatedSignature(Signature signature)
|
||||
{
|
||||
Signature.Builder builder = new Signature.Builder();
|
||||
|
||||
for (int j = 0; j < signature.size(); ++j)
|
||||
{
|
||||
Type type = signature.getTypeOfArg(j);
|
||||
builder.addArgument(InjectUtil.deobToVanilla(inject, type));
|
||||
}
|
||||
|
||||
builder.setReturnType(InjectUtil.deobToVanilla(inject, signature.getReturnValue()));
|
||||
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
private Type getObfuscatedSignature(Type type)
|
||||
{
|
||||
return InjectUtil.deobToVanilla(inject, type);
|
||||
}
|
||||
|
||||
private Method findMethod(net.runelite.asm.pool.Method meth, boolean notStatic)
|
||||
{
|
||||
try
|
||||
{
|
||||
return InjectUtil.findMethod(inject, meth.getName(), meth.getClazz().getName(), meth.getType()::equals, notStatic, false);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private Field findField(net.runelite.asm.pool.Field field)
|
||||
{
|
||||
try
|
||||
{
|
||||
return InjectUtil.findField(inject, field.getName(), field.getClazz().getName());
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Copyright (c) 2021, Owain van Brakel <https://github.com/Owain94>
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is licensed under GPL3, see the complete license in
|
||||
* the LICENSE file in the root directory of this submodule.
|
||||
*/
|
||||
package com.openosrs.injector.injectors.raw;
|
||||
|
||||
import com.openosrs.injector.injection.InjectData;
|
||||
import com.openosrs.injector.injectors.AbstractInjector;
|
||||
import java.util.List;
|
||||
import net.runelite.asm.ClassFile;
|
||||
import net.runelite.asm.Method;
|
||||
import net.runelite.asm.attributes.Code;
|
||||
import net.runelite.asm.attributes.code.Instruction;
|
||||
import net.runelite.asm.attributes.code.InstructionType;
|
||||
import net.runelite.asm.attributes.code.Instructions;
|
||||
import net.runelite.asm.attributes.code.instructions.ALoad;
|
||||
import net.runelite.asm.attributes.code.instructions.Dup;
|
||||
import net.runelite.asm.attributes.code.instructions.InvokeSpecial;
|
||||
import net.runelite.asm.attributes.code.instructions.New;
|
||||
import net.runelite.asm.attributes.code.instructions.Return;
|
||||
import net.runelite.asm.signature.Signature;
|
||||
|
||||
public class RuneLiteIterableHashTable extends AbstractInjector
|
||||
{
|
||||
private static final String RUNELITE_ITERABLE_HASHTABLE = "RuneLiteIterableHashTable";
|
||||
|
||||
public RuneLiteIterableHashTable(InjectData inject)
|
||||
{
|
||||
super(inject);
|
||||
}
|
||||
|
||||
public void inject()
|
||||
{
|
||||
ClassFile runeliteIterableHashTableVanilla = inject.vanilla.findClass(RUNELITE_ITERABLE_HASHTABLE);
|
||||
|
||||
final ClassFile nodeHashTableVanilla = inject.toVanilla(
|
||||
inject.getDeobfuscated()
|
||||
.findClass("NodeHashTable")
|
||||
);
|
||||
|
||||
Method copy = new Method(nodeHashTableVanilla, "iterator", new Signature("()Ljava/util/Iterator;"));
|
||||
copy.setPublic();
|
||||
|
||||
final Code code = new Code(copy);
|
||||
code.setMaxStack(3);
|
||||
copy.setCode(code);
|
||||
nodeHashTableVanilla.addMethod(copy);
|
||||
|
||||
final Instructions instructions = code.getInstructions();
|
||||
final List<Instruction> ins = instructions.getInstructions();
|
||||
|
||||
ins.add(new New(instructions, runeliteIterableHashTableVanilla.getPoolClass()));
|
||||
ins.add(new Dup(instructions));
|
||||
ins.add(new ALoad(instructions, 0));
|
||||
ins.add(new InvokeSpecial(instructions, new net.runelite.asm.pool.Method(runeliteIterableHashTableVanilla.getPoolClass(), "<init>", new Signature("(L" + nodeHashTableVanilla.getName() + ";)V"))));
|
||||
ins.add(new Return(instructions, InstructionType.ARETURN));
|
||||
}
|
||||
}
|
||||
@@ -16,14 +16,11 @@ import net.runelite.asm.attributes.Code;
|
||||
import net.runelite.asm.attributes.code.Instruction;
|
||||
import net.runelite.asm.attributes.code.InstructionType;
|
||||
import net.runelite.asm.attributes.code.Instructions;
|
||||
import net.runelite.asm.attributes.code.instructions.ALoad;
|
||||
import net.runelite.asm.attributes.code.instructions.Dup;
|
||||
import net.runelite.asm.attributes.code.instructions.InvokeSpecial;
|
||||
import net.runelite.asm.attributes.code.instructions.New;
|
||||
import net.runelite.asm.attributes.code.instructions.Return;
|
||||
import net.runelite.asm.attributes.code.instructions.VReturn;
|
||||
import net.runelite.asm.signature.Signature;
|
||||
import org.objectweb.asm.Opcodes;
|
||||
|
||||
public class RuneliteObject extends AbstractInjector
|
||||
{
|
||||
@@ -38,66 +35,25 @@ public class RuneliteObject extends AbstractInjector
|
||||
{
|
||||
ClassFile runeliteObjectVanilla = inject.vanilla.findClass(RUNELITE_OBJECT);
|
||||
|
||||
final ClassFile graphicsObjectVanilla = inject.toVanilla(
|
||||
inject.getDeobfuscated()
|
||||
.findClass("GraphicsObject")
|
||||
);
|
||||
|
||||
graphicsObjectVanilla.clearFinal();
|
||||
|
||||
final ClassFile clientVanilla = inject.toVanilla(
|
||||
inject.getDeobfuscated()
|
||||
.findClass("Client")
|
||||
);
|
||||
|
||||
final ClassFile runeLiteObjectDeob = inject.getDeobfuscated()
|
||||
.findClass(RUNELITE_OBJECT);
|
||||
Method copy = new Method(clientVanilla, "createRuneLiteObject", new Signature("()Lnet/runelite/api/RuneLiteObject;"));
|
||||
copy.setPublic();
|
||||
|
||||
if (runeliteObjectVanilla == null)
|
||||
{
|
||||
runeliteObjectVanilla = new ClassFile(inject.vanilla);
|
||||
runeliteObjectVanilla.setName(RUNELITE_OBJECT);
|
||||
runeliteObjectVanilla.setParentClass(graphicsObjectVanilla.getPoolClass());
|
||||
runeliteObjectVanilla.setAccess(Opcodes.ACC_PUBLIC);
|
||||
runeliteObjectVanilla.setVersion(Opcodes.V1_8);
|
||||
inject.vanilla.addClass(runeliteObjectVanilla);
|
||||
final Code code = new Code(copy);
|
||||
code.setMaxStack(2);
|
||||
copy.setCode(code);
|
||||
clientVanilla.addMethod(copy);
|
||||
|
||||
inject.toVanilla.put(runeLiteObjectDeob, runeliteObjectVanilla);
|
||||
}
|
||||
final Instructions instructions = code.getInstructions();
|
||||
final List<Instruction> ins = instructions.getInstructions();
|
||||
|
||||
{
|
||||
Method initRuneliteObject = new Method(runeliteObjectVanilla, "<init>", new Signature("()V"));
|
||||
initRuneliteObject.setPublic();
|
||||
|
||||
final Code code = new Code(initRuneliteObject);
|
||||
code.setMaxStack(1);
|
||||
initRuneliteObject.setCode(code);
|
||||
runeliteObjectVanilla.addMethod(initRuneliteObject);
|
||||
|
||||
final Instructions instructions = code.getInstructions();
|
||||
final List<Instruction> ins = instructions.getInstructions();
|
||||
|
||||
ins.add(new ALoad(instructions, 0));
|
||||
ins.add(new InvokeSpecial(instructions, new net.runelite.asm.pool.Method(graphicsObjectVanilla.getPoolClass(), "<init>", new Signature("()V"))));
|
||||
ins.add(new VReturn(instructions));
|
||||
}
|
||||
|
||||
{
|
||||
Method copy = new Method(clientVanilla, "createRuneLiteObject", new Signature("()Lnet/runelite/api/RuneLiteObject;"));
|
||||
copy.setPublic();
|
||||
|
||||
final Code code = new Code(copy);
|
||||
code.setMaxStack(2);
|
||||
copy.setCode(code);
|
||||
clientVanilla.addMethod(copy);
|
||||
|
||||
final Instructions instructions = code.getInstructions();
|
||||
final List<Instruction> ins = instructions.getInstructions();
|
||||
|
||||
ins.add(new New(instructions, runeliteObjectVanilla.getPoolClass()));
|
||||
ins.add(new Dup(instructions));
|
||||
ins.add(new InvokeSpecial(instructions, new net.runelite.asm.pool.Method(runeliteObjectVanilla.getPoolClass(), "<init>", new Signature("()V"))));
|
||||
ins.add(new Return(instructions, InstructionType.ARETURN));
|
||||
}
|
||||
ins.add(new New(instructions, runeliteObjectVanilla.getPoolClass()));
|
||||
ins.add(new Dup(instructions));
|
||||
ins.add(new InvokeSpecial(instructions, new net.runelite.asm.pool.Method(runeliteObjectVanilla.getPoolClass(), "<init>", new Signature("()V"))));
|
||||
ins.add(new Return(instructions, InstructionType.ARETURN));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user