use of net.runelite.asm.attributes.code.instructions.If0 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.instructions.If0 in project runelite by runelite.
the class PacketWriteDeobfuscator method isEnd.
private boolean isEnd(InstructionContext ctx) {
// conditions where packet write ends:
// any invoke that isn't to the packet buffer
// any variable assignment
// any field assignment
// any conditional jump
// any return
Instruction i = ctx.getInstruction();
if (i instanceof InvokeInstruction) {
InvokeInstruction ii = (InvokeInstruction) i;
Method method = ii.getMethod();
if (!method.getClazz().equals(rw.getSecretBuffer().getPoolClass()) && !method.getClazz().equals(rw.getBuffer().getPoolClass())) {
return true;
}
}
if (i instanceof LVTInstruction) {
LVTInstruction lvt = (LVTInstruction) i;
if (lvt.store()) {
return true;
}
}
if (i instanceof SetFieldInstruction) {
return true;
}
if (i instanceof If || i instanceof If0) {
return true;
}
if (i instanceof ReturnInstruction) {
return true;
}
return false;
}
use of net.runelite.asm.attributes.code.instructions.If0 in project runelite by runelite.
the class ConstantParameter method findDeadParameters.
private void findDeadParameters(InstructionContext ins) {
List<ConstantMethodParameter> parameters = this.findParametersForMethod(ins.getFrame().getMethod());
for (ConstantMethodParameter parameter : parameters) {
int lvtIndex = parameter.lvtIndex;
if (parameter.invalid) {
continue;
}
if (ins.getInstruction() instanceof LVTInstruction) {
LVTInstruction lvt = (LVTInstruction) ins.getInstruction();
if (lvt.getVariableIndex() != lvtIndex) {
continue;
}
if (lvt.store() || ins.getInstruction().getType() == InstructionType.IINC) {
parameter.invalid = true;
// value changes at some point, parameter is used
continue;
}
// check what pops the parameter is a comparison
assert ins.getPushes().size() == 1;
StackContext sctx = ins.getPushes().get(0);
if (sctx.getPopped().size() != 1 || !(sctx.getPopped().get(0).getInstruction() instanceof ComparisonInstruction)) {
parameter.invalid = true;
continue;
}
}
if (!(ins.getInstruction() instanceof ComparisonInstruction)) {
continue;
}
// assume that this will always be variable index #paramIndex comp with a constant.
ComparisonInstruction comp = (ComparisonInstruction) ins.getInstruction();
StackContext one, two = null;
if (comp instanceof If0) {
one = ins.getPops().get(0);
} else if (comp instanceof If) {
one = ins.getPops().get(0);
two = ins.getPops().get(1);
} else {
throw new RuntimeException("Unknown comp ins");
}
// find if one is a lvt ins
LVTInstruction lvt = null;
StackContext other = null;
if (one.getPushed().getInstruction() instanceof LVTInstruction) {
lvt = (LVTInstruction) one.getPushed().getInstruction();
other = two;
} else if (two != null && two.getPushed().getInstruction() instanceof LVTInstruction) {
lvt = (LVTInstruction) two.getPushed().getInstruction();
other = one;
}
assert lvt == null || !lvt.store();
if (lvt == null || lvt.getVariableIndex() != lvtIndex) {
continue;
}
Number otherValue = null;
if (// two is null for if0
two != null) {
if (!(other.getPushed().getInstruction() instanceof PushConstantInstruction)) {
parameter.invalid = true;
continue;
}
PushConstantInstruction pc = (PushConstantInstruction) other.getPushed().getInstruction();
otherValue = (Number) pc.getConstant();
}
for (Number value : parameter.values) {
// the result of the comparison doesn't matter, only that it always goes the same direction for every invocation
boolean result = doLogicalComparison(value, comp, otherValue);
// not that all ifs for a specific parameter always take the same path
if (parameter.result != null && parameter.result != result) {
parameter.invalid = true;
} else {
parameter.operations.add(ins.getInstruction());
parameter.result = result;
}
}
}
}
Aggregations