Skip to content

Commit

Permalink
Small improvements in variable inlining
Browse files Browse the repository at this point in the history
  • Loading branch information
EpicPlayerA10 committed Aug 26, 2024
1 parent 73a3606 commit 804ae2c
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,16 @@

import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.VarInsnNode;
import org.objectweb.asm.tree.analysis.Frame;
import org.objectweb.asm.tree.analysis.OriginalSourceValue;
import uwu.narumi.deobfuscator.api.asm.ClassWrapper;
import uwu.narumi.deobfuscator.api.context.Context;
import uwu.narumi.deobfuscator.api.helper.AsmHelper;
import uwu.narumi.deobfuscator.api.transformer.Transformer;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

public class PopUnUsedLocalVariablesTransformer extends Transformer {
Expand All @@ -16,20 +20,31 @@ public class PopUnUsedLocalVariablesTransformer extends Transformer {
@Override
protected boolean transform(ClassWrapper scope, Context context) throws Exception {
context.classes(scope).forEach(classWrapper -> classWrapper.methods().forEach(methodNode -> {
Map<AbstractInsnNode, Frame<OriginalSourceValue>> frames = AsmHelper.analyzeOriginalSource(classWrapper.getClassNode(), methodNode);
if (frames == null) return;

List<Integer> localVariablesInUse = new ArrayList<>();
List<VarInsnNode> varStoresInUse = new ArrayList<>();

// Find all local variables in use
for (AbstractInsnNode insn : methodNode.instructions.toArray()) {
if (insn instanceof VarInsnNode varInsnNode && insn.isVarLoad()) {
localVariablesInUse.add(varInsnNode.var);
Frame<OriginalSourceValue> frame = frames.get(insn);
if (frame == null) return;

OriginalSourceValue localVariableSourceValue = frame.getLocal(varInsnNode.var);
for (AbstractInsnNode sourceInsn : localVariableSourceValue.insns) {
// Save var stores in use
if (sourceInsn.isVarStore()) {
varStoresInUse.add((VarInsnNode) sourceInsn);
}
}
}
}

// Remove all local variables that are not in use
for (AbstractInsnNode insn : methodNode.instructions.toArray()) {
if (insn instanceof VarInsnNode varInsnNode && insn.isVarStore()) {
if (!localVariablesInUse.contains(varInsnNode.var)) {
if (!varStoresInUse.contains(varInsnNode)) {
// Pop the value from the stack
methodNode.instructions.set(insn, insn.toPop());

Expand Down
7 changes: 3 additions & 4 deletions testData/results/java/TestInlineLocalVariables.dec
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,14 @@ public class TestInlineLocalVariables {
}

public static void mangle() {
double d = 1455.45;
float e = 89.345F;
String f = "asd";
Object someObj = new Object();
System.out.println("" + 321 + true + 657657L);
System.out.println(1455.45 + (double)89.345F + "asd" + someObj);

try {
d = 3.4534535E7;
double var12 = 3.4534535E7;

try {
e = 45354.0F;
Expand All @@ -51,9 +50,9 @@ public class TestInlineLocalVariables {
} catch (Exception var10) {
}

System.out.println(d + (double)e + f + someObj);
System.out.println(var12 + (double)e + f + someObj);
} catch (Exception var11) {
d = 6.5654356234E7;
double d = 6.5654356234E7;
e = 4.1454144E8F;
f = "hjk";
someObj = new Object();
Expand Down

0 comments on commit 804ae2c

Please sign in to comment.