mirror of
https://github.com/SuspiciousActivity/ByteEdit.git
synced 2026-08-13 17:56:17 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d1710ea6a5 | ||
|
|
ad55d6793c |
No files matched your search
@@ -674,118 +674,41 @@ public class Assembler {
|
|||||||
labels.put(ln, labelNr);
|
labels.put(ln, labelNr);
|
||||||
return new LineNumberNode(Integer.parseInt(s.split(" ")[0]), ln);
|
return new LineNumberNode(Integer.parseInt(s.split(" ")[0]), ln);
|
||||||
} else if (s.startsWith("// frame ")) {
|
} else if (s.startsWith("// frame ")) {
|
||||||
String str1 = s.substring(7);
|
String str1 = s.substring(9);
|
||||||
String str = str1.substring(str1.indexOf(' ', 3) + 1);
|
String[] split = str1.split(" ", 2);
|
||||||
Object[] local;
|
|
||||||
Object[] stack;
|
|
||||||
ArrayList<Object> arr = new ArrayList<>();
|
|
||||||
if (str.startsWith("l:null")) {
|
|
||||||
local = new Object[0];
|
|
||||||
} else {
|
|
||||||
String l = str.substring(3, str.indexOf("s:") - 2);
|
|
||||||
if (l.isEmpty()) {
|
|
||||||
local = new Object[0];
|
|
||||||
} else {
|
|
||||||
for (String asd : l.split(", ")) {
|
|
||||||
if (!asd.startsWith("(")) {
|
|
||||||
int frameType = ClassUtil.getFrameTypeByName(asd);
|
|
||||||
if (frameType != -1)
|
|
||||||
arr.add(new Integer(frameType));
|
|
||||||
else
|
|
||||||
arr.add(UnicodeUtils.unescape(hsr, asd.substring(1, asd.length() - 1)));
|
|
||||||
} else {
|
|
||||||
if (asd.startsWith("(label) ")) {
|
|
||||||
int labelNr = Integer.parseInt(asd.split(" ")[1]);
|
|
||||||
boolean found = false;
|
|
||||||
for (Map.Entry<LabelNode, Integer> entry : labels.entrySet()) {
|
|
||||||
if (entry.getValue() == labelNr) {
|
|
||||||
arr.add(entry.getKey());
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found) {
|
|
||||||
LabelNode ln = new LabelNode(new Label());
|
|
||||||
labels.put(ln, labelNr);
|
|
||||||
arr.add(ln);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
arr.add(ClassUtil.getCastedValue(asd.split(" ")[1], asd.split("\\) ")[0].substring(1)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
local = new Object[arr.size()];
|
|
||||||
int c = 0;
|
|
||||||
for (Object o : arr) {
|
|
||||||
local[c] = o;
|
|
||||||
c++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
arr.clear();
|
|
||||||
if (str.endsWith("s:null")) {
|
|
||||||
stack = new Object[0];
|
|
||||||
} else {
|
|
||||||
String st = str.substring(str.indexOf("s:") + 3, str.length() - 1);
|
|
||||||
if (st.isEmpty()) {
|
|
||||||
stack = new Object[0];
|
|
||||||
} else {
|
|
||||||
for (String asd : st.split(", ")) {
|
|
||||||
if (!asd.startsWith("(")) {
|
|
||||||
int frameType = ClassUtil.getFrameTypeByName(asd);
|
|
||||||
if (frameType != -1)
|
|
||||||
arr.add(new Integer(frameType));
|
|
||||||
else
|
|
||||||
arr.add(UnicodeUtils.unescape(hsr, asd.substring(1, asd.length() - 1)));
|
|
||||||
} else {
|
|
||||||
if (asd.startsWith("(label) ")) {
|
|
||||||
int labelNr = Integer.parseInt(asd.split(" ")[1]);
|
|
||||||
boolean found = false;
|
|
||||||
for (Map.Entry<LabelNode, Integer> entry : labels.entrySet()) {
|
|
||||||
if (entry.getValue() == labelNr) {
|
|
||||||
arr.add(entry.getKey());
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found) {
|
|
||||||
LabelNode ln = new LabelNode(new Label());
|
|
||||||
labels.put(ln, labelNr);
|
|
||||||
arr.add(ln);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
arr.add(ClassUtil.getCastedValue(asd.split(" ")[1], asd.split("\\) ")[0].substring(1)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stack = new Object[arr.size()];
|
|
||||||
int c = 0;
|
|
||||||
for (Object o : arr) {
|
|
||||||
stack[c] = o;
|
|
||||||
c++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int type = 0;
|
int type = 0;
|
||||||
switch (str1.substring(str1.indexOf(' ', 1) + 1, str1.indexOf(' ', 3))) {
|
Object[] local = null;
|
||||||
case "NEW":
|
Object[] stack = null;
|
||||||
type = Opcodes.F_NEW;
|
int localLen = 0;
|
||||||
break;
|
int stackLen = 0;
|
||||||
case "FULL":
|
switch (split[0].toUpperCase()) {
|
||||||
type = Opcodes.F_FULL;
|
|
||||||
break;
|
|
||||||
case "APPEND":
|
|
||||||
type = Opcodes.F_APPEND;
|
|
||||||
break;
|
|
||||||
case "CHOP":
|
|
||||||
type = Opcodes.F_CHOP;
|
|
||||||
break;
|
|
||||||
case "SAME":
|
case "SAME":
|
||||||
type = Opcodes.F_SAME;
|
type = Opcodes.F_SAME;
|
||||||
break;
|
break;
|
||||||
case "SAME1":
|
case "SAME1":
|
||||||
type = Opcodes.F_SAME1;
|
type = Opcodes.F_SAME1;
|
||||||
|
stack = parseFrameList(hsr, split[1], labels);
|
||||||
|
stackLen = stack.length;
|
||||||
|
break;
|
||||||
|
case "CHOP":
|
||||||
|
type = Opcodes.F_CHOP;
|
||||||
|
localLen = Integer.parseInt(split[1]);
|
||||||
|
break;
|
||||||
|
case "APPEND":
|
||||||
|
type = Opcodes.F_APPEND;
|
||||||
|
local = parseFrameList(hsr, split[1], labels);
|
||||||
|
localLen = local.length;
|
||||||
|
break;
|
||||||
|
case "FULL":
|
||||||
|
type = Opcodes.F_FULL;
|
||||||
|
split = split[1].split("\\] \\[", 2);
|
||||||
|
local = parseFrameList(hsr, split[0] + "]", labels);
|
||||||
|
localLen = local.length;
|
||||||
|
stack = parseFrameList(hsr, "[" + split[1], labels);
|
||||||
|
stackLen = stack.length;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return new FrameNode(type, local.length, local, stack.length, stack);
|
return new FrameNode(type, localLen, local, stackLen, stack);
|
||||||
} else {
|
} else {
|
||||||
String[] split = s.split(" ");
|
String[] split = s.split(" ");
|
||||||
String command = split[0];
|
String command = split[0];
|
||||||
@@ -823,10 +746,10 @@ public class Assembler {
|
|||||||
case "dconst_1":
|
case "dconst_1":
|
||||||
return new InsnNode(15);
|
return new InsnNode(15);
|
||||||
case "bipush": {
|
case "bipush": {
|
||||||
return new IntInsnNode(16, Integer.parseInt(split[1]));
|
return new IntInsnNode(16, (byte) Integer.parseInt(split[1]));
|
||||||
}
|
}
|
||||||
case "sipush": {
|
case "sipush": {
|
||||||
return new IntInsnNode(17, Integer.parseInt(split[1]));
|
return new IntInsnNode(17, (short) Integer.parseInt(split[1]));
|
||||||
}
|
}
|
||||||
case "ldc": {
|
case "ldc": {
|
||||||
String str = consolidateStrings(split, 1);
|
String str = consolidateStrings(split, 1);
|
||||||
@@ -1633,4 +1556,48 @@ public class Assembler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Object[] parseFrameList(HugeStringsRev hsr, String str, HashMap<LabelNode, Integer> labels) {
|
||||||
|
ArrayList<Object> list = new ArrayList<>();
|
||||||
|
String l = str.substring(1, str.length() - 1);
|
||||||
|
if (l.isEmpty()) {
|
||||||
|
return new Object[0];
|
||||||
|
} else {
|
||||||
|
for (String asd : l.split(", ")) {
|
||||||
|
if (!asd.startsWith("(")) {
|
||||||
|
int frameType = ClassUtil.getFrameTypeByName(asd);
|
||||||
|
if (frameType != -1)
|
||||||
|
list.add(new Integer(frameType));
|
||||||
|
else
|
||||||
|
list.add(UnicodeUtils.unescape(hsr, asd.substring(1, asd.length() - 1)));
|
||||||
|
} else {
|
||||||
|
if (asd.startsWith("(label) ")) {
|
||||||
|
int labelNr = Integer.parseInt(asd.split(" ")[1]);
|
||||||
|
boolean found = false;
|
||||||
|
for (Map.Entry<LabelNode, Integer> entry : labels.entrySet()) {
|
||||||
|
if (entry.getValue() == labelNr) {
|
||||||
|
list.add(entry.getKey());
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
LabelNode ln = new LabelNode(new Label());
|
||||||
|
labels.put(ln, labelNr);
|
||||||
|
list.add(ln);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
list.add(ClassUtil.getCastedValue(asd.split(" ")[1], asd.split("\\) ")[0].substring(1)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Object[] arr = new Object[list.size()];
|
||||||
|
int c = 0;
|
||||||
|
for (Object o : list) {
|
||||||
|
arr[c] = o;
|
||||||
|
c++;
|
||||||
|
}
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,22 @@
|
|||||||
package me.ByteEdit.edit;
|
package me.ByteEdit.edit;
|
||||||
|
|
||||||
|
import static org.objectweb.asm.tree.AbstractInsnNode.FIELD_INSN;
|
||||||
|
import static org.objectweb.asm.tree.AbstractInsnNode.FRAME;
|
||||||
|
import static org.objectweb.asm.tree.AbstractInsnNode.IINC_INSN;
|
||||||
|
import static org.objectweb.asm.tree.AbstractInsnNode.INSN;
|
||||||
|
import static org.objectweb.asm.tree.AbstractInsnNode.INT_INSN;
|
||||||
|
import static org.objectweb.asm.tree.AbstractInsnNode.INVOKE_DYNAMIC_INSN;
|
||||||
|
import static org.objectweb.asm.tree.AbstractInsnNode.JUMP_INSN;
|
||||||
|
import static org.objectweb.asm.tree.AbstractInsnNode.LABEL;
|
||||||
|
import static org.objectweb.asm.tree.AbstractInsnNode.LDC_INSN;
|
||||||
|
import static org.objectweb.asm.tree.AbstractInsnNode.LINE;
|
||||||
|
import static org.objectweb.asm.tree.AbstractInsnNode.LOOKUPSWITCH_INSN;
|
||||||
|
import static org.objectweb.asm.tree.AbstractInsnNode.METHOD_INSN;
|
||||||
|
import static org.objectweb.asm.tree.AbstractInsnNode.MULTIANEWARRAY_INSN;
|
||||||
|
import static org.objectweb.asm.tree.AbstractInsnNode.TABLESWITCH_INSN;
|
||||||
|
import static org.objectweb.asm.tree.AbstractInsnNode.TYPE_INSN;
|
||||||
|
import static org.objectweb.asm.tree.AbstractInsnNode.VAR_INSN;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@@ -25,7 +42,6 @@ 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.InsnList;
|
||||||
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;
|
||||||
import org.objectweb.asm.tree.JumpInsnNode;
|
import org.objectweb.asm.tree.JumpInsnNode;
|
||||||
@@ -479,102 +495,42 @@ public class Disassembler {
|
|||||||
return new String[] { ctx.finish(), localVarTable, tryCatchTable };
|
return new String[] { ctx.finish(), localVarTable, tryCatchTable };
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final HashMap<Class, InstructionInterface> iiMap = new HashMap<>();
|
public static String disassembleInstruction(AbstractInsnNode n, HashMap<Label, Integer> labels, HugeStrings hs) {
|
||||||
|
switch (n.getType()) {
|
||||||
static {
|
case INSN: {
|
||||||
iiMap.put(FieldInsnNode.class, (n, labels, hs) -> {
|
return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + "\n";
|
||||||
|
}
|
||||||
|
case INT_INSN: {
|
||||||
|
IntInsnNode node = (IntInsnNode) n;
|
||||||
|
if (n.getOpcode() == Opcodes.NEWARRAY) {
|
||||||
|
return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " "
|
||||||
|
+ ClassUtil.getArrayTypeByID(node.operand) + "\n";
|
||||||
|
} else {
|
||||||
|
return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " " + node.operand + "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case VAR_INSN: {
|
||||||
|
VarInsnNode node = (VarInsnNode) n;
|
||||||
|
return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " " + node.var + "\n";
|
||||||
|
}
|
||||||
|
case TYPE_INSN: {
|
||||||
|
TypeInsnNode node = (TypeInsnNode) n;
|
||||||
|
return "\t\t" + OpcodesReverse.reverseOpcode(node.getOpcode()) + " "
|
||||||
|
+ UnicodeUtils.escapeWithSpaces(hs, node.desc) + "\n";
|
||||||
|
}
|
||||||
|
case FIELD_INSN: {
|
||||||
FieldInsnNode node = (FieldInsnNode) n;
|
FieldInsnNode node = (FieldInsnNode) n;
|
||||||
return "\t\t" + OpcodesReverse.reverseOpcode(node.getOpcode()) + " "
|
return "\t\t" + OpcodesReverse.reverseOpcode(node.getOpcode()) + " "
|
||||||
+ UnicodeUtils.escapeWithSpaces(hs, node.desc) + " " + UnicodeUtils.escapeWithSpaces(hs, node.owner)
|
+ UnicodeUtils.escapeWithSpaces(hs, node.desc) + " " + UnicodeUtils.escapeWithSpaces(hs, node.owner)
|
||||||
+ "/" + UnicodeUtils.escapeWithSpaces(hs, node.name).replace("/", "\\u002F") + "\n";
|
+ "/" + UnicodeUtils.escapeWithSpaces(hs, node.name).replace("/", "\\u002F") + "\n";
|
||||||
});
|
|
||||||
iiMap.put(LabelNode.class, (n, labels, hs) -> {
|
|
||||||
LabelNode node = (LabelNode) n;
|
|
||||||
return "\t\t// label " + labels.get(node.getLabel()) + "\n";
|
|
||||||
});
|
|
||||||
iiMap.put(FrameNode.class, (n, labels, hs) -> {
|
|
||||||
FrameNode node = (FrameNode) n;
|
|
||||||
String type = "";
|
|
||||||
switch (node.type) {
|
|
||||||
case Opcodes.F_NEW:
|
|
||||||
type = "NEW";
|
|
||||||
break;
|
|
||||||
case Opcodes.F_FULL:
|
|
||||||
type = "FULL";
|
|
||||||
break;
|
|
||||||
case Opcodes.F_APPEND:
|
|
||||||
type = "APPEND";
|
|
||||||
break;
|
|
||||||
case Opcodes.F_CHOP:
|
|
||||||
type = "CHOP";
|
|
||||||
break;
|
|
||||||
case Opcodes.F_SAME:
|
|
||||||
type = "SAME";
|
|
||||||
break;
|
|
||||||
case Opcodes.F_SAME1:
|
|
||||||
type = "SAME1";
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
String s = "\t\t// frame " + type + " l:";
|
case METHOD_INSN: {
|
||||||
ArrayList<String> arr = new ArrayList<>();
|
MethodInsnNode node = (MethodInsnNode) n;
|
||||||
if (node.local != null) {
|
return "\t\t" + OpcodesReverse.reverseOpcode(node.getOpcode()) + " "
|
||||||
for (Object o : node.local) {
|
+ UnicodeUtils.escapeWithSpaces(hs, node.desc) + " " + UnicodeUtils.escapeWithSpaces(hs, node.owner)
|
||||||
if (o == null) {
|
+ "/" + UnicodeUtils.escapeWithSpaces(hs, node.name).replace("/", "\\u002F") + "\n";
|
||||||
arr.add(null);
|
|
||||||
} else {
|
|
||||||
if (o instanceof String) {
|
|
||||||
arr.add("\"" + UnicodeUtils.escapeWithSpaces(hs, (String) o) + "\"");
|
|
||||||
} else if (o instanceof LabelNode) {
|
|
||||||
arr.add("(label) " + labels.get(((LabelNode) o).getLabel()));
|
|
||||||
} else if (o instanceof Integer) {
|
|
||||||
String frameType = ClassUtil.getFrameTypeByID(((Integer) o).intValue());
|
|
||||||
if (frameType != null)
|
|
||||||
arr.add(frameType);
|
|
||||||
else
|
|
||||||
arr.add("(" + o.getClass().getName().replace(".", "/") + ") " + o);
|
|
||||||
} else {
|
|
||||||
arr.add("(" + o.getClass().getName().replace(".", "/") + ") " + o);
|
|
||||||
}
|
}
|
||||||
}
|
case INVOKE_DYNAMIC_INSN: {
|
||||||
}
|
|
||||||
s += arr.toString();
|
|
||||||
} else {
|
|
||||||
s += "null";
|
|
||||||
}
|
|
||||||
arr.clear();
|
|
||||||
s += " s:";
|
|
||||||
if (node.stack != null) {
|
|
||||||
for (Object o : node.stack) {
|
|
||||||
if (o == null) {
|
|
||||||
arr.add(null);
|
|
||||||
} else {
|
|
||||||
if (o instanceof String) {
|
|
||||||
arr.add("\"" + UnicodeUtils.escapeWithSpaces(hs, (String) o) + "\"");
|
|
||||||
} else if (o instanceof LabelNode) {
|
|
||||||
arr.add("(label) " + labels.get(((LabelNode) o).getLabel()));
|
|
||||||
} else if (o instanceof Integer) {
|
|
||||||
String frameType = ClassUtil.getFrameTypeByID(((Integer) o).intValue());
|
|
||||||
if (frameType != null)
|
|
||||||
arr.add(frameType);
|
|
||||||
else
|
|
||||||
arr.add("(" + o.getClass().getName().replace(".", "/") + ") " + o);
|
|
||||||
} else {
|
|
||||||
arr.add("(" + o.getClass().getName().replace(".", "/") + ") " + o);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s += arr.toString();
|
|
||||||
} else {
|
|
||||||
s += "null";
|
|
||||||
}
|
|
||||||
s += "\n";
|
|
||||||
return s;
|
|
||||||
});
|
|
||||||
iiMap.put(LineNumberNode.class, (n, labels, hs) -> {
|
|
||||||
LineNumberNode node = (LineNumberNode) n;
|
|
||||||
return "\t\t// line " + node.line + " " + labels.get(node.start.getLabel()) + "\n";
|
|
||||||
});
|
|
||||||
iiMap.put(InvokeDynamicInsnNode.class, (n, labels, hs) -> {
|
|
||||||
InvokeDynamicInsnNode node = (InvokeDynamicInsnNode) n;
|
InvokeDynamicInsnNode node = (InvokeDynamicInsnNode) n;
|
||||||
String s = "\t\t" + OpcodesReverse.reverseOpcode(node.getOpcode()) + " [\n\t\t\tname: "
|
String s = "\t\t" + OpcodesReverse.reverseOpcode(node.getOpcode()) + " [\n\t\t\tname: "
|
||||||
+ UnicodeUtils.escapeWithSpaces(hs, node.name).replace("/", "\\u002F") + "\n\t\t\tdesc: "
|
+ UnicodeUtils.escapeWithSpaces(hs, node.name).replace("/", "\\u002F") + "\n\t\t\tdesc: "
|
||||||
@@ -610,24 +566,17 @@ public class Disassembler {
|
|||||||
}
|
}
|
||||||
s += "\t\t\t]\n\t\t]\n";
|
s += "\t\t\t]\n\t\t]\n";
|
||||||
return s;
|
return s;
|
||||||
});
|
}
|
||||||
iiMap.put(MethodInsnNode.class, (n, labels, hs) -> {
|
case JUMP_INSN: {
|
||||||
MethodInsnNode node = (MethodInsnNode) n;
|
JumpInsnNode node = (JumpInsnNode) n;
|
||||||
return "\t\t" + OpcodesReverse.reverseOpcode(node.getOpcode()) + " "
|
return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " " + labels.get(node.label.getLabel())
|
||||||
+ UnicodeUtils.escapeWithSpaces(hs, node.desc) + " " + UnicodeUtils.escapeWithSpaces(hs, node.owner)
|
+ "\n";
|
||||||
+ "/" + UnicodeUtils.escapeWithSpaces(hs, node.name).replace("/", "\\u002F") + "\n";
|
}
|
||||||
});
|
case LABEL: {
|
||||||
iiMap.put(TypeInsnNode.class, (n, labels, hs) -> {
|
LabelNode node = (LabelNode) n;
|
||||||
TypeInsnNode node = (TypeInsnNode) n;
|
return "\t\t// label " + labels.get(node.getLabel()) + "\n";
|
||||||
return "\t\t" + OpcodesReverse.reverseOpcode(node.getOpcode()) + " "
|
}
|
||||||
+ UnicodeUtils.escapeWithSpaces(hs, node.desc) + "\n";
|
case LDC_INSN: {
|
||||||
});
|
|
||||||
iiMap.put(MultiANewArrayInsnNode.class, (n, labels, hs) -> {
|
|
||||||
MultiANewArrayInsnNode node = (MultiANewArrayInsnNode) n;
|
|
||||||
return "\t\t" + OpcodesReverse.reverseOpcode(node.getOpcode()) + " "
|
|
||||||
+ UnicodeUtils.escapeWithSpaces(hs, node.desc) + " " + node.dims + "\n";
|
|
||||||
});
|
|
||||||
iiMap.put(LdcInsnNode.class, (n, labels, hs) -> {
|
|
||||||
LdcInsnNode node = (LdcInsnNode) n;
|
LdcInsnNode node = (LdcInsnNode) n;
|
||||||
if (node.cst instanceof Type) {
|
if (node.cst instanceof Type) {
|
||||||
Type type = (Type) node.cst;
|
Type type = (Type) node.cst;
|
||||||
@@ -650,30 +599,12 @@ public class Disassembler {
|
|||||||
}
|
}
|
||||||
return "\t\t" + OpcodesReverse.reverseOpcode(node.getOpcode()) + " " + decomp + "\n";
|
return "\t\t" + OpcodesReverse.reverseOpcode(node.getOpcode()) + " " + decomp + "\n";
|
||||||
}
|
}
|
||||||
});
|
|
||||||
iiMap.put(VarInsnNode.class, (n, labels, hs) -> {
|
|
||||||
VarInsnNode node = (VarInsnNode) n;
|
|
||||||
return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " " + node.var + "\n";
|
|
||||||
});
|
|
||||||
iiMap.put(InsnNode.class, (n, labels, hs) -> {
|
|
||||||
InsnNode node = (InsnNode) n;
|
|
||||||
return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + "\n";
|
|
||||||
});
|
|
||||||
iiMap.put(IntInsnNode.class, (n, labels, hs) -> {
|
|
||||||
IntInsnNode node = (IntInsnNode) n;
|
|
||||||
if (n.getOpcode() == Opcodes.NEWARRAY) {
|
|
||||||
return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " "
|
|
||||||
+ ClassUtil.getArrayTypeByID(node.operand) + "\n";
|
|
||||||
} else {
|
|
||||||
return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " " + node.operand + "\n";
|
|
||||||
}
|
}
|
||||||
});
|
case IINC_INSN: {
|
||||||
iiMap.put(JumpInsnNode.class, (n, labels, hs) -> {
|
IincInsnNode node = (IincInsnNode) n;
|
||||||
JumpInsnNode node = (JumpInsnNode) n;
|
return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " " + node.var + " " + node.incr + "\n";
|
||||||
return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " " + labels.get(node.label.getLabel())
|
}
|
||||||
+ "\n";
|
case TABLESWITCH_INSN: {
|
||||||
});
|
|
||||||
iiMap.put(TableSwitchInsnNode.class, (n, labels, hs) -> {
|
|
||||||
TableSwitchInsnNode node = (TableSwitchInsnNode) n;
|
TableSwitchInsnNode node = (TableSwitchInsnNode) n;
|
||||||
String s = "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " [\n\t\t\tmin: " + node.min
|
String s = "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " [\n\t\t\tmin: " + node.min
|
||||||
+ "\n\t\t\tmax: " + node.max + "\n\t\t\tdefault: " + labels.get(node.dflt.getLabel())
|
+ "\n\t\t\tmax: " + node.max + "\n\t\t\tdefault: " + labels.get(node.dflt.getLabel())
|
||||||
@@ -683,8 +614,8 @@ public class Disassembler {
|
|||||||
}
|
}
|
||||||
s += "\t\t\t]\n\t\t]\n";
|
s += "\t\t\t]\n\t\t]\n";
|
||||||
return s;
|
return s;
|
||||||
});
|
}
|
||||||
iiMap.put(LookupSwitchInsnNode.class, (n, labels, hs) -> {
|
case LOOKUPSWITCH_INSN: {
|
||||||
LookupSwitchInsnNode node = (LookupSwitchInsnNode) n;
|
LookupSwitchInsnNode node = (LookupSwitchInsnNode) n;
|
||||||
String s = "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " [\n\t\t\tdefault: "
|
String s = "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " [\n\t\t\tdefault: "
|
||||||
+ labels.get(node.dflt.getLabel()) + "\n\t\t\tkeys: [\n";
|
+ labels.get(node.dflt.getLabel()) + "\n\t\t\tkeys: [\n";
|
||||||
@@ -697,24 +628,70 @@ public class Disassembler {
|
|||||||
}
|
}
|
||||||
s += "\t\t\t]\n\t\t]\n";
|
s += "\t\t\t]\n\t\t]\n";
|
||||||
return s;
|
return s;
|
||||||
});
|
|
||||||
iiMap.put(IincInsnNode.class, (n, labels, hs) -> {
|
|
||||||
IincInsnNode node = (IincInsnNode) n;
|
|
||||||
return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " " + node.var + " " + node.incr + "\n";
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
case MULTIANEWARRAY_INSN: {
|
||||||
static interface InstructionInterface {
|
MultiANewArrayInsnNode node = (MultiANewArrayInsnNode) n;
|
||||||
String apply(AbstractInsnNode n, HashMap<Label, Integer> labels, HugeStrings hs);
|
return "\t\t" + OpcodesReverse.reverseOpcode(node.getOpcode()) + " "
|
||||||
|
+ UnicodeUtils.escapeWithSpaces(hs, node.desc) + " " + node.dims + "\n";
|
||||||
}
|
}
|
||||||
|
case FRAME: {
|
||||||
public static String disassembleInstruction(AbstractInsnNode n, HashMap<Label, Integer> labels, HugeStrings hs) {
|
FrameNode node = (FrameNode) n;
|
||||||
InstructionInterface ii = iiMap.get(n.getClass());
|
String out = "";
|
||||||
if (ii != null)
|
switch (node.type) {
|
||||||
return ii.apply(n, labels, hs);
|
case Opcodes.F_SAME:
|
||||||
else
|
out = "SAME";
|
||||||
|
break;
|
||||||
|
case Opcodes.F_SAME1:
|
||||||
|
out = "SAME1 " + getFrameArray(hs, node.stack, labels);
|
||||||
|
break;
|
||||||
|
case Opcodes.F_CHOP:
|
||||||
|
out = "CHOP " + Integer.toString(node.local.size());
|
||||||
|
break;
|
||||||
|
case Opcodes.F_APPEND:
|
||||||
|
out = "APPEND " + getFrameArray(hs, node.local, labels);
|
||||||
|
break;
|
||||||
|
case Opcodes.F_FULL:
|
||||||
|
out = "FULL " + getFrameArray(hs, node.local, labels) + " " + getFrameArray(hs, node.stack, labels);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return "\t\t// frame " + out + "\n";
|
||||||
|
}
|
||||||
|
case LINE: {
|
||||||
|
LineNumberNode node = (LineNumberNode) n;
|
||||||
|
return "\t\t// line " + node.line + " " + labels.get(node.start.getLabel()) + "\n";
|
||||||
|
}
|
||||||
|
default: {
|
||||||
return "\t\tNOT HANDLED! " + OpcodesReverse.reverseOpcode(n.getOpcode()) + " "
|
return "\t\tNOT HANDLED! " + OpcodesReverse.reverseOpcode(n.getOpcode()) + " "
|
||||||
+ n.getClass().getSimpleName() + "\n";
|
+ n.getClass().getSimpleName() + "\n";
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getFrameArray(HugeStrings hs, List<Object> list, HashMap<Label, Integer> labels) {
|
||||||
|
ArrayList<String> arr = new ArrayList<>();
|
||||||
|
if (list != null) {
|
||||||
|
for (Object o : list) {
|
||||||
|
if (o == null) {
|
||||||
|
arr.add(null);
|
||||||
|
} else {
|
||||||
|
if (o instanceof String) {
|
||||||
|
arr.add("\"" + UnicodeUtils.escapeWithSpaces(hs, (String) o) + "\"");
|
||||||
|
} else if (o instanceof LabelNode) {
|
||||||
|
arr.add("(label) " + labels.get(((LabelNode) o).getLabel()));
|
||||||
|
} else if (o instanceof Integer) {
|
||||||
|
String frameType = ClassUtil.getFrameTypeByID(((Integer) o).intValue());
|
||||||
|
if (frameType != null)
|
||||||
|
arr.add(frameType);
|
||||||
|
else
|
||||||
|
arr.add("(" + o.getClass().getName().replace(".", "/") + ") " + o);
|
||||||
|
} else {
|
||||||
|
arr.add("(" + o.getClass().getName().replace(".", "/") + ") " + o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return arr.toString();
|
||||||
|
}
|
||||||
|
return "null";
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -25,7 +25,7 @@ public class StackBasedCalculator implements Opcodes, Runnable {
|
|||||||
|
|
||||||
HashMap<LabelNode, LabelNode> labelMap = new HashMap<>();
|
HashMap<LabelNode, LabelNode> labelMap = new HashMap<>();
|
||||||
for (AbstractInsnNode node = insns.getFirst(); node != null; node = node.getNext()) {
|
for (AbstractInsnNode node = insns.getFirst(); node != null; node = node.getNext()) {
|
||||||
if (node.getType() == 8) {
|
if (node.getType() == AbstractInsnNode.LABEL) {
|
||||||
labelMap.put((LabelNode) node, new LabelNode());
|
labelMap.put((LabelNode) node, new LabelNode());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -675,14 +675,10 @@ public class StackBasedCalculator implements Opcodes, Runnable {
|
|||||||
insns.insertBefore(insns.get(idx), new InsnNode(ICONST_5));
|
insns.insertBefore(insns.get(idx), new InsnNode(ICONST_5));
|
||||||
else if (val == -1)
|
else if (val == -1)
|
||||||
insns.insertBefore(insns.get(idx), new InsnNode(ICONST_M1));
|
insns.insertBefore(insns.get(idx), new InsnNode(ICONST_M1));
|
||||||
else
|
else if (val == (byte) val)
|
||||||
insns.insertBefore(insns.get(idx), new LdcInsnNode(val));
|
insns.insertBefore(insns.get(idx), new IntInsnNode(BIPUSH, (byte) val));
|
||||||
} else if (n instanceof Long) {
|
else if (val == (short) val)
|
||||||
long val = n.longValue();
|
insns.insertBefore(insns.get(idx), new IntInsnNode(SIPUSH, (short) val));
|
||||||
if (val == 0l)
|
|
||||||
insns.insertBefore(insns.get(idx), new InsnNode(LCONST_0));
|
|
||||||
else if (val == 1l)
|
|
||||||
insns.insertBefore(insns.get(idx), new InsnNode(LCONST_1));
|
|
||||||
else
|
else
|
||||||
insns.insertBefore(insns.get(idx), new LdcInsnNode(val));
|
insns.insertBefore(insns.get(idx), new LdcInsnNode(val));
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -231,7 +231,17 @@ public class Main extends JFrame {
|
|||||||
"// #Max: l:0 s:0\n\t// #TryCatch:\n\t// #LocalVars:\n\tpublic static method ()V {\n\t\treturn\n\t}",
|
"// #Max: l:0 s:0\n\t// #TryCatch:\n\t// #LocalVars:\n\tpublic static method ()V {\n\t\treturn\n\t}",
|
||||||
null, "<html><b><u>method</u></b><br>Creates an example method</html>"));
|
null, "<html><b><u>method</u></b><br>Creates an example method</html>"));
|
||||||
provider.addCompletion(new ShorthandCompletion(provider, "frame", "frame FULL l:[] s:[]", null,
|
provider.addCompletion(new ShorthandCompletion(provider, "frame", "frame FULL l:[] s:[]", null,
|
||||||
"<html><b><u>frame</u></b><br>Creates a stack map frame</html>"));
|
"<html><b><u>frame</u></b><br>Creates a stack map frame<br><br><b>Possible frames:</b><br><ul><li><code>SAME: same locals, empty stack</code></li><li><code>SAME1: same locals, stack has 1 entry</code></li><li><code>CHOP: same locals - k, empty stack</code></li><li><code>APPEND: same locals + k, empty stack</code></li><li><code>FULL: define locals, define stack</code></li></ul></html>"));
|
||||||
|
provider.addCompletion(new BasicCompletion(provider, "SAME", null,
|
||||||
|
"<html><b><u>Frames:</u></b><br><code>SAME</code><br><br><u>Locals:</u> same as previous<br><u>Stack:</u> empty</html>"));
|
||||||
|
provider.addCompletion(new BasicCompletion(provider, "SAME1", null,
|
||||||
|
"<html><b><u>Frames:</u></b><br><code>SAME1 [(type)]</code><br><br><u>Locals:</u> same as previous<br><u>Stack:</u> 1 entry</html>"));
|
||||||
|
provider.addCompletion(new BasicCompletion(provider, "CHOP", null,
|
||||||
|
"<html><b><u>Frames:</u></b><br><code>CHOP (int:k)</code><br><br><u>Locals:</u> removes the top <i>k</i> elements<br><u>Stack:</u> empty</html>"));
|
||||||
|
provider.addCompletion(new BasicCompletion(provider, "APPEND", null,
|
||||||
|
"<html><b><u>Frames:</u></b><br><code>APPEND [(type), (type), ...]</code><br><br><u>Locals:</u> adds the elements to the top<br><u>Stack:</u> empty</html>"));
|
||||||
|
provider.addCompletion(new BasicCompletion(provider, "FULL", null,
|
||||||
|
"<html><b><u>Frames:</u></b><br><code>FULL [(type), (type), ...] [(type), (type), ...]</code><br><i>first locals, then stack</i><br><br><u>Locals:</u> sets the elements<br><u>Stack:</u> sets the elements</html>"));
|
||||||
return provider;
|
return provider;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -680,7 +690,7 @@ public class Main extends JFrame {
|
|||||||
len += asm.length();
|
len += asm.length();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (BadLocationException e1) {
|
} catch (Exception e1) {
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user