use of net.runelite.asm.attributes.code.instruction.types.InvokeInstruction in project runelite by runelite.
the class PacketWriteDeobfuscator method visit.
public void visit(InstructionContext ctx) {
if (isEnd(ctx)) {
end();
return;
}
if (ctx.getInstruction().getType() != INVOKEVIRTUAL) {
return;
}
InvokeInstruction ii = (InvokeInstruction) ctx.getInstruction();
if (ii.getMethods().contains(rw.getWriteOpcode())) {
end();
PacketWrite write = start();
write.putOpcode = ctx;
return;
}
PacketWrite write = cur;
if (write == null) {
return;
}
if (!ii.getMethod().getClazz().getName().equals(rw.getWriteOpcode().getClassFile().getSuperName())) {
return;
}
write.writes.add(ctx);
}
use of net.runelite.asm.attributes.code.instruction.types.InvokeInstruction in project runelite by runelite.
the class GetPathTransformer method transform.
private void transform(Method m) {
int count = 0;
if (m.getCode() == null) {
return;
}
for (Instruction i : m.getCode().getInstructions().getInstructions()) {
if (i instanceof InvokeInstruction) {
InvokeInstruction ii = (InvokeInstruction) i;
if (ii.getMethod().getName().equals("getPath")) {
if (++count == 2) {
removeInvoke(i);
done = true;
break;
}
}
}
}
}
use of net.runelite.asm.attributes.code.instruction.types.InvokeInstruction in project runelite by runelite.
the class MappingExecutorUtil method resolve.
public static InstructionContext resolve(InstructionContext ctx, // pushed from ctx
StackContext from) {
if (ctx.getInstruction() instanceof SetFieldInstruction) {
StackContext s = ctx.getPops().get(0);
return resolve(s.getPushed(), s);
}
if (ctx.getInstruction() instanceof ConversionInstruction) {
// assume it pops one and pushes one
StackContext s = ctx.getPops().get(0);
return resolve(s.getPushed(), s);
}
if (ctx.getInstruction() instanceof DupInstruction) {
DupInstruction d = (DupInstruction) ctx.getInstruction();
StackContext s = d.getOriginal(from);
return resolve(s.getPushed(), s);
}
if (ctx.getInstruction() instanceof ArrayLoad) {
// might be multidimensional array
// the array
StackContext s = ctx.getPops().get(1);
return resolve(s.getPushed(), s);
}
if (ctx.getInstruction() instanceof LVTInstruction) {
LVTInstruction lvt = (LVTInstruction) ctx.getInstruction();
Variables variables = ctx.getVariables();
if (lvt.store()) {
// is this right?
StackContext s = ctx.getPops().get(0);
return resolve(s.getPushed(), s);
} else {
// variable being loaded
VariableContext vctx = variables.get(lvt.getVariableIndex());
assert vctx != null;
InstructionContext storedCtx = vctx.getInstructionWhichStored();
if (storedCtx == null)
// initial parameter
return ctx;
if (vctx.isIsParameter()) {
// this storedCtx is the invoke instruction which called this method.
assert storedCtx.getInstruction() instanceof InvokeInstruction;
// In PME non static functions are never stepped into/aren't inline obfuscated
assert storedCtx.getInstruction() instanceof InvokeStatic;
// Figure out parameter index from variable index.
// signature of current method
Signature sig = ctx.getFrame().getMethod().getDescriptor();
int paramIndex = 0;
for (int lvtIndex = 0; /* static */
paramIndex < sig.size(); lvtIndex += sig.getTypeOfArg(paramIndex++).getSize()) if (lvtIndex == lvt.getVariableIndex())
break;
assert paramIndex < sig.size();
// Get stack context that was popped by the invoke
// pops[0] is the first thing popped, which is the last parameter.
StackContext sctx = storedCtx.getPops().get(sig.size() - 1 - paramIndex);
return resolve(sctx.getPushed(), sctx);
}
return resolve(storedCtx, null);
}
}
if (ctx.getInstruction() instanceof InvokeStatic) {
if (from.returnSource != null) {
return resolve(from.returnSource.getPushed(), from.returnSource);
}
}
return ctx;
}
use of net.runelite.asm.attributes.code.instruction.types.InvokeInstruction in project runelite by runelite.
the class ModArith method getInsInExpr.
private static List<InstructionContext> getInsInExpr(InstructionContext ctx, Set<Instruction> set, boolean imul) {
List<InstructionContext> l = new ArrayList<>();
if (ctx == null || set.contains(ctx.getInstruction())) {
return l;
}
set.add(ctx.getInstruction());
if (imul) {
if (!(ctx.getInstruction() instanceof IMul) & !(ctx.getInstruction() instanceof LMul)) {
l.add(ctx);
return l;
}
} else {
// invoke and array store pops are unrelated to each other
if (ctx.getInstruction() instanceof InvokeInstruction || ctx.getInstruction() instanceof ArrayStoreInstruction || ctx.getInstruction() instanceof ArrayLoad || ctx.getInstruction() instanceof If || ctx.getInstruction() instanceof If0 || ctx.getInstruction() instanceof LCmp || ctx.getInstruction() instanceof DivisionInstruction || ctx.getInstruction() instanceof IShR) {
return l;
}
l.add(ctx);
}
for (StackContext s : ctx.getPops()) {
l.addAll(getInsInExpr(s.getPushed(), set, imul));
}
for (StackContext s : ctx.getPushes()) {
for (InstructionContext i : s.getPopped()) {
l.addAll(getInsInExpr(i, set, imul));
}
}
return l;
}
use of net.runelite.asm.attributes.code.instruction.types.InvokeInstruction in project runelite by runelite.
the class UnusedMethods method run.
private void run(Method method) {
Code code = method.getCode();
if (code == null) {
return;
}
for (Instruction i : code.getInstructions().getInstructions()) {
if (!(i instanceof InvokeInstruction)) {
continue;
}
InvokeInstruction ii = (InvokeInstruction) i;
methods.addAll(ii.getMethods());
}
}
Aggregations