diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/clean/peephole/PopUnUsedLocalVariablesTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/clean/peephole/PopUnUsedLocalVariablesTransformer.java index 84127465..1637f5d8 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/clean/peephole/PopUnUsedLocalVariablesTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/clean/peephole/PopUnUsedLocalVariablesTransformer.java @@ -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 { @@ -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> frames = AsmHelper.analyzeOriginalSource(classWrapper.getClassNode(), methodNode); + if (frames == null) return; - List localVariablesInUse = new ArrayList<>(); + List 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 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()); diff --git a/testData/results/java/TestInlineLocalVariables.dec b/testData/results/java/TestInlineLocalVariables.dec index 9994264a..ec218bc0 100644 --- a/testData/results/java/TestInlineLocalVariables.dec +++ b/testData/results/java/TestInlineLocalVariables.dec @@ -33,7 +33,6 @@ public class TestInlineLocalVariables { } public static void mangle() { - double d = 1455.45; float e = 89.345F; String f = "asd"; Object someObj = new Object(); @@ -41,7 +40,7 @@ public class TestInlineLocalVariables { System.out.println(1455.45 + (double)89.345F + "asd" + someObj); try { - d = 3.4534535E7; + double var12 = 3.4534535E7; try { e = 45354.0F; @@ -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();