Fixed number deobfuscator

This commit is contained in:
SuspiciousActivity authored and GitHub committed 2020-11-27 01:01:30 +01:00
1 parent b5e4847be5
commit ac247a89ca
2 files changed
+41 -8

No files matched your search

+23 -7
View File
@@ -24,6 +24,7 @@ import org.objectweb.asm.tree.FieldNode;
import org.objectweb.asm.tree.FrameNode; import org.objectweb.asm.tree.FrameNode;
import org.objectweb.asm.tree.IincInsnNode; import org.objectweb.asm.tree.IincInsnNode;
import org.objectweb.asm.tree.InnerClassNode; import org.objectweb.asm.tree.InnerClassNode;
import org.objectweb.asm.tree.InsnList;
import org.objectweb.asm.tree.InsnNode; import org.objectweb.asm.tree.InsnNode;
import org.objectweb.asm.tree.IntInsnNode; import org.objectweb.asm.tree.IntInsnNode;
import org.objectweb.asm.tree.InvokeDynamicInsnNode; import org.objectweb.asm.tree.InvokeDynamicInsnNode;
@@ -419,9 +420,18 @@ public class Disassembler {
HashMap<Label, Integer> labels = new HashMap<Label, Integer>(); HashMap<Label, Integer> labels = new HashMap<Label, Integer>();
String localVarTable; String localVarTable;
String tryCatchTable; String tryCatchTable;
for (AbstractInsnNode n : mn.instructions.toArray()) {
InsnList insnList = mn.instructions;
boolean deobfNumbers = Main.INSTANCE.mntmNumbers.isSelected();
ArrayList<Label> labelsReversed = deobfNumbers ? new ArrayList<>() : null;
for (AbstractInsnNode n = insnList.getFirst(); n != null; n = n.getNext()) {
if (n instanceof LabelNode) { if (n instanceof LabelNode) {
labels.put(((LabelNode) n).getLabel(), labels.size() + 1); int id = labels.size() + 1;
if (deobfNumbers)
labelsReversed.add(((LabelNode) n).getLabel());
labels.put(((LabelNode) n).getLabel(), id);
} }
} }
if (mn.localVariables != null && !mn.localVariables.isEmpty()) { if (mn.localVariables != null && !mn.localVariables.isEmpty()) {
@@ -450,14 +460,20 @@ public class Disassembler {
} else } else
tryCatchTable = ""; tryCatchTable = "";
if (Main.INSTANCE.mntmNumbers.isSelected()) { if (deobfNumbers) {
StackBasedCalculator calc = new StackBasedCalculator(mn.instructions); StackBasedCalculator calc = new StackBasedCalculator(insnList);
calc.run(); calc.run();
insnList = calc.get();
int i = 0;
for (AbstractInsnNode n = insnList.getFirst(); n != null; n = n.getNext()) {
if (n instanceof LabelNode) {
((LabelNode) n).setLabel(labelsReversed.get(i++));
}
}
} }
AbstractInsnNode[] insns = mn.instructions.toArray(); StringContext ctx = new StringContext(insnList.size());
StringContext ctx = new StringContext(insns.length); for (AbstractInsnNode n = insnList.getFirst(); n != null; n = n.getNext()) {
for (AbstractInsnNode n : insns) {
ctx.next(disassembleInstruction(n, labels, hs)); ctx.next(disassembleInstruction(n, labels, hs));
} }
return new String[] { ctx.finish(), localVarTable, tryCatchTable }; return new String[] { ctx.finish(), localVarTable, tryCatchTable };
+18 -1
View File
@@ -1,6 +1,7 @@
package me.ByteEdit.edit; package me.ByteEdit.edit;
import java.util.EmptyStackException; import java.util.EmptyStackException;
import java.util.HashMap;
import java.util.Stack; import java.util.Stack;
import org.objectweb.asm.Opcodes; import org.objectweb.asm.Opcodes;
@@ -8,6 +9,7 @@ import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.InsnList; import org.objectweb.asm.tree.InsnList;
import org.objectweb.asm.tree.InsnNode; import org.objectweb.asm.tree.InsnNode;
import org.objectweb.asm.tree.IntInsnNode; import org.objectweb.asm.tree.IntInsnNode;
import org.objectweb.asm.tree.LabelNode;
import org.objectweb.asm.tree.LdcInsnNode; import org.objectweb.asm.tree.LdcInsnNode;
public class StackBasedCalculator implements Opcodes, Runnable { public class StackBasedCalculator implements Opcodes, Runnable {
@@ -19,7 +21,22 @@ public class StackBasedCalculator implements Opcodes, Runnable {
private boolean isAtEnd = false; private boolean isAtEnd = false;
public StackBasedCalculator(InsnList insns) { public StackBasedCalculator(InsnList insns) {
this.insns = insns; this.insns = new InsnList();
HashMap<LabelNode, LabelNode> labelMap = new HashMap<>();
for (AbstractInsnNode node = insns.getFirst(); node != null; node = node.getNext()) {
if (node.getType() == 8) {
labelMap.put((LabelNode) node, new LabelNode());
}
}
for (AbstractInsnNode node = insns.getFirst(); node != null; node = node.getNext()) {
this.insns.add(node.clone(labelMap));
}
}
public InsnList get() {
return insns;
} }
@Override @Override