5 Commits
20 changed files with 95 additions and 483 deletions

No files matched your search

+1 -2
View File
@@ -106,7 +106,7 @@ public class CompilationBox extends JFrame {
null, Arrays.asList(new JavaSourceFromString("Compiled", source))).call(); null, Arrays.asList(new JavaSourceFromString("Compiled", source))).call();
String res = out.toString(); String res = out.toString();
if (res.isEmpty()) { if (res.isEmpty()) {
SingleThreadedExecutor.execute(() -> { SingleThreadedExecutor.submit(() -> {
try { try {
File clazz = new File(tmpFolder, "Compiled.class"); File clazz = new File(tmpFolder, "Compiled.class");
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
@@ -145,7 +145,6 @@ public class CompilationBox extends JFrame {
e2.printStackTrace(); e2.printStackTrace();
} }
}); });
} else { } else {
JOptionPane.showMessageDialog(CompilationBox.this, res, "Error!", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(CompilationBox.this, res, "Error!", JOptionPane.ERROR_MESSAGE);
} }
+6 -36
View File
@@ -1,8 +1,6 @@
package me.ByteEdit.boxes; package me.ByteEdit.boxes;
import java.awt.Toolkit; import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
@@ -60,13 +58,7 @@ public class GlobalSearchBox extends JFrame {
contentPane.add(lblFind); contentPane.add(lblFind);
txtString = new JTextField(); txtString = new JTextField();
KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0); KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
txtString.registerKeyboardAction(new ActionListener() { txtString.registerKeyboardAction(e -> find(), enter, JComponent.WHEN_IN_FOCUSED_WINDOW);
@Override
public void actionPerformed(ActionEvent e) {
find();
}
}, enter, JComponent.WHEN_IN_FOCUSED_WINDOW);
txtString.setBounds(91, 22, 149, 20); txtString.setBounds(91, 22, 149, 20);
contentPane.add(txtString); contentPane.add(txtString);
txtString.setColumns(10); txtString.setColumns(10);
@@ -74,12 +66,7 @@ public class GlobalSearchBox extends JFrame {
chckbxCaseSensitive.setBounds(10, 199, 114, 23); chckbxCaseSensitive.setBounds(10, 199, 114, 23);
contentPane.add(chckbxCaseSensitive); contentPane.add(chckbxCaseSensitive);
JButton btnFind = new JButton("Find"); JButton btnFind = new JButton("Find");
btnFind.addActionListener(new ActionListener() { btnFind.addActionListener(e -> find());
public void actionPerformed(ActionEvent e) {
find();
}
});
btnFind.setBounds(130, 199, 110, 23); btnFind.setBounds(130, 199, 110, 23);
contentPane.add(btnFind); contentPane.add(btnFind);
@@ -92,12 +79,7 @@ public class GlobalSearchBox extends JFrame {
contentPane.add(lblOwner); contentPane.add(lblOwner);
txtOwner = new JTextField(); txtOwner = new JTextField();
txtOwner.addActionListener(new ActionListener() { txtOwner.addActionListener(e -> find());
public void actionPerformed(ActionEvent e) {
find();
}
});
txtOwner.setColumns(10); txtOwner.setColumns(10);
txtOwner.setBounds(91, 78, 149, 20); txtOwner.setBounds(91, 78, 149, 20);
contentPane.add(txtOwner); contentPane.add(txtOwner);
@@ -107,12 +89,7 @@ public class GlobalSearchBox extends JFrame {
contentPane.add(lblName); contentPane.add(lblName);
txtName = new JTextField(); txtName = new JTextField();
txtName.addActionListener(new ActionListener() { txtName.addActionListener(e -> find());
public void actionPerformed(ActionEvent e) {
find();
}
});
txtName.setColumns(10); txtName.setColumns(10);
txtName.setBounds(91, 106, 149, 20); txtName.setBounds(91, 106, 149, 20);
contentPane.add(txtName); contentPane.add(txtName);
@@ -122,12 +99,7 @@ public class GlobalSearchBox extends JFrame {
contentPane.add(lblDesc); contentPane.add(lblDesc);
txtDesc = new JTextField(); txtDesc = new JTextField();
txtDesc.addActionListener(new ActionListener() { txtDesc.addActionListener(e -> find());
public void actionPerformed(ActionEvent e) {
find();
}
});
txtDesc.setColumns(10); txtDesc.setColumns(10);
txtDesc.setBounds(91, 134, 149, 20); txtDesc.setBounds(91, 134, 149, 20);
contentPane.add(txtDesc); contentPane.add(txtDesc);
@@ -194,9 +166,7 @@ public class GlobalSearchBox extends JFrame {
} }
} }
} }
for (Info s : set) { set.forEach(openBox.model::addElement);
openBox.model.addElement(s);
}
openBox.setVisible(true); openBox.setVisible(true);
} }
} }
@@ -37,7 +37,7 @@ public class GlobalSearchOpenBox extends JFrame {
JList<Info> list = new JList(model); JList<Info> list = new JList(model);
list.addListSelectionListener(new ListSelectionListener() { list.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) { public void valueChanged(ListSelectionEvent e) {
SingleThreadedExecutor.execute(() -> { SingleThreadedExecutor.submit(() -> {
Info val = list.getSelectedValue(); Info val = list.getSelectedValue();
if (val != null && !val.owner.equals(Main.currentNodeName)) { if (val != null && !val.owner.equals(Main.currentNodeName)) {
Main.selectFile(val.nodePath); Main.selectFile(val.nodePath);
+1 -1
View File
@@ -211,7 +211,7 @@ public class RenameBox extends JFrame {
} }
} }
SingleThreadedExecutor.execute(() -> { SingleThreadedExecutor.submit(() -> {
// refresh // refresh
Main.decompileCurrentNode(); Main.decompileCurrentNode();
name = newName; name = newName;
-1
View File
@@ -125,7 +125,6 @@ public class SearchBox extends JFrame {
public void replace() { public void replace() {
if (!Main.decompiler.isEditable()) if (!Main.decompiler.isEditable())
return; return;
String txt = Main.txtByteEditView.getText();
int startPos = Main.txtByteEditView.getSelectionStart(); int startPos = Main.txtByteEditView.getSelectionStart();
Main.txtByteEditView.replaceSelection(txtReplace.getText()); Main.txtByteEditView.replaceSelection(txtReplace.getText());
Main.txtByteEditView.select(startPos, startPos + txtReplace.getText().length()); Main.txtByteEditView.select(startPos, startPos + txtReplace.getText().length());
+2 -3
View File
@@ -40,12 +40,11 @@ public class TypeOpenBox extends JFrame {
DefaultListModel<String> model = new DefaultListModel<>(); DefaultListModel<String> model = new DefaultListModel<>();
JList<String> list = new JList(model); JList<String> list = new JList(model);
list.addListSelectionListener(new ListSelectionListener() { list.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) { public void valueChanged(ListSelectionEvent e) {
String val = list.getSelectedValue(); String val = list.getSelectedValue();
if (val != null && !val.equals(Main.currentNodeName)) { if (val != null && !val.equals(Main.currentNodeName)) {
SingleThreadedExecutor.submit(() -> Main.selectFile(val));
SingleThreadedExecutor.execute(() -> Main.selectFile(val));
} }
} }
}); });
+3 -39
View File
@@ -3,24 +3,13 @@ package me.ByteEdit.decompiler;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.StringWriter; import java.io.StringWriter;
import java.lang.reflect.Field;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map;
import org.benf.cfr.reader.PluginRunner; import org.benf.cfr.reader.PluginRunner;
import org.benf.cfr.reader.api.ClassFileSource; import org.benf.cfr.reader.api.ClassFileSource;
import org.benf.cfr.reader.bytecode.analysis.parse.utils.Pair; import org.benf.cfr.reader.bytecode.analysis.parse.utils.Pair;
import org.benf.cfr.reader.entities.ClassFile;
import org.benf.cfr.reader.entities.Method;
import org.benf.cfr.reader.entities.constantpool.ConstantPool;
import org.benf.cfr.reader.state.ClassFileSourceImpl;
import org.benf.cfr.reader.state.DCCommonState;
import org.benf.cfr.reader.util.bytestream.BaseByteData;
import org.benf.cfr.reader.util.getopt.OptionsImpl;
import org.benf.cfr.reader.util.output.ToStringDumper;
import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodNode;
public class CFRDecompiler implements IDecompiler { public class CFRDecompiler implements IDecompiler {
@@ -83,10 +72,10 @@ public class CFRDecompiler implements IDecompiler {
@Override @Override
public String decompile(ClassNode cn) { public String decompile(ClassNode cn) {
return doDecompilation(cn, getBytes(cn), null); return doDecompilation(cn, getBytes(cn));
} }
private static String doDecompilation(ClassNode cn, byte[] b, MethodNode mn) { private static String doDecompilation(ClassNode cn, byte[] b) {
try { try {
HashMap<String, String> ops = options; HashMap<String, String> ops = options;
ClassFileSource cfs = new ClassFileSource() { ClassFileSource cfs = new ClassFileSource() {
@@ -114,24 +103,7 @@ public class CFRDecompiler implements IDecompiler {
throw new RuntimeException(); throw new RuntimeException();
} }
}; };
PluginRunner runner = new PluginRunner(ops, cfs); String decompilation = new PluginRunner(ops, cfs).getDecompilationFor(cn.name);
if (mn != null) {
BaseByteData data = new BaseByteData(b);
ClassFile cf = new ClassFile(data, "", initDCState(ops, cfs));
Field cpf = Method.class.getDeclaredField("cp");
Field descI = Method.class.getDeclaredField("descriptorIndex");
descI.setAccessible(true);
cpf.setAccessible(true);
for (Method m : cf.getMethodByName(mn.name)) {
ConstantPool cp = (ConstantPool) cpf.get(m);
if (cp.getUTF8Entry(descI.getInt(m)).getValue().equals(mn.desc)) {
ToStringDumper tsd = new ToStringDumper();
m.dump(tsd, true);
return tsd.toString();
}
}
}
String decompilation = runner.getDecompilationFor(cn.name);
System.gc(); // cfr has a performance bug System.gc(); // cfr has a performance bug
return decompilation; return decompilation;
} catch (Exception e) { } catch (Exception e) {
@@ -142,12 +114,4 @@ public class CFRDecompiler implements IDecompiler {
return sw.toString(); return sw.toString();
} }
} }
private static DCCommonState initDCState(Map<String, String> optionsMap, ClassFileSource classFileSource) {
OptionsImpl options = new OptionsImpl(optionsMap);
if (classFileSource == null)
classFileSource = new ClassFileSourceImpl(options);
DCCommonState dcCommonState = new DCCommonState(options, classFileSource);
return dcCommonState;
}
} }
@@ -17,7 +17,6 @@ import org.jetbrains.java.decompiler.struct.StructClass;
import org.jetbrains.java.decompiler.struct.StructContext; import org.jetbrains.java.decompiler.struct.StructContext;
import org.jetbrains.java.decompiler.struct.lazy.LazyLoader; import org.jetbrains.java.decompiler.struct.lazy.LazyLoader;
import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodNode;
public class FernflowerDecompiler implements IBytecodeProvider, IResultSaver, IDecompiler { public class FernflowerDecompiler implements IBytecodeProvider, IResultSaver, IDecompiler {
@@ -53,10 +52,10 @@ public class FernflowerDecompiler implements IBytecodeProvider, IResultSaver, ID
@Override @Override
public String decompile(ClassNode cn) { public String decompile(ClassNode cn) {
return doDecompilation(cn, getBytes(cn), null); return doDecompilation(cn, getBytes(cn));
} }
public String doDecompilation(ClassNode cn, byte[] b, MethodNode mn) { public String doDecompilation(ClassNode cn, byte[] b) {
try { try {
// TODO decompile method only // TODO decompile method only
this.bytes = b; this.bytes = b;
@@ -64,6 +63,7 @@ public class FernflowerDecompiler implements IBytecodeProvider, IResultSaver, ID
for (Entry<String, Boolean> entry : options.entrySet()) { for (Entry<String, Boolean> entry : options.entrySet()) {
map.put(entry.getKey(), entry.getValue() ? "1" : "0"); map.put(entry.getKey(), entry.getValue() ? "1" : "0");
} }
map.put("ind", " ");
Fernflower f = new Fernflower(this, this, map, new IFernflowerLogger() { Fernflower f = new Fernflower(this, this, map, new IFernflowerLogger() {
@Override @Override
public void writeMessage(String message, Throwable t) { public void writeMessage(String message, Throwable t) {
@@ -5,7 +5,6 @@ import java.io.StringWriter;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodNode;
import com.strobel.assembler.InputTypeLoader; import com.strobel.assembler.InputTypeLoader;
import com.strobel.assembler.metadata.Buffer; import com.strobel.assembler.metadata.Buffer;
@@ -21,10 +20,10 @@ public class ProcyonDecompiler implements IDecompiler {
@Override @Override
public String decompile(ClassNode cn) { public String decompile(ClassNode cn) {
return doDecompilation(cn, getBytes(cn), null); return doDecompilation(cn, getBytes(cn));
} }
private static String doDecompilation(ClassNode cn, byte[] b, MethodNode mn) { private static String doDecompilation(ClassNode cn, byte[] b) {
try { try {
// TODO decompile method only // TODO decompile method only
DecompilerSettings settings = new DecompilerSettings(); DecompilerSettings settings = new DecompilerSettings();
@@ -48,9 +47,8 @@ public class ProcyonDecompiler implements IDecompiler {
buffer.putByteArray(b, 0, b.length); buffer.putByteArray(b, 0, b.length);
buffer.position(0); buffer.position(0);
return true; return true;
} else {
return backLoader.tryLoadType(s, buffer);
} }
return backLoader.tryLoadType(s, buffer);
} }
}); });
TypeReference type = metadataSystem.lookupType(cn.name); TypeReference type = metadataSystem.lookupType(cn.name);
@@ -4,16 +4,30 @@ import java.util.concurrent.LinkedBlockingQueue;
public class SingleThreadedExecutor { public class SingleThreadedExecutor {
// We don't need to run every Runnable,
// we only care about the last submitted Runnable.
private static final Object lock = new Object();
private static Runnable runnable;
private static final LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<>(); private static final LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
private static final Thread thread = new Thread(() -> { private static final Thread thread = new Thread(() -> {
while (true) {
try { try {
queue.take().run(); while (true) {
Runnable r = null;
synchronized (lock) {
while (runnable == null)
lock.wait();
r = runnable;
runnable = null;
}
try {
r.run();
} catch (Throwable e) { } catch (Throwable e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
} catch (InterruptedException e) {
}
}, "SingleThreadedExecutor"); }, "SingleThreadedExecutor");
static { static {
@@ -21,7 +35,10 @@ public class SingleThreadedExecutor {
thread.start(); thread.start();
} }
public static void execute(Runnable r) { public static void submit(Runnable r) {
queue.add(r); synchronized (lock) {
runnable = r;
lock.notifyAll();
}
} }
} }
+13 -3
View File
@@ -339,6 +339,8 @@ public class Assembler {
tryCatchBlocksToParse.clear(); tryCatchBlocksToParse.clear();
stage = 0; stage = 0;
} else if (s.startsWith("// #Signature: ")) { } else if (s.startsWith("// #Signature: ")) {
if (node == null)
throw new IllegalStateException("node is null");
node.signature = UnicodeUtils.unescape(hsr, s.substring(15)); node.signature = UnicodeUtils.unescape(hsr, s.substring(15));
} else if (s.equals("// #TryCatch:")) { } else if (s.equals("// #TryCatch:")) {
stage = 1; stage = 1;
@@ -352,6 +354,8 @@ public class Assembler {
localVarsToParse.add(s); localVarsToParse.add(s);
} }
} else if (s.equals("}")) { } else if (s.equals("}")) {
if (node == null)
throw new IllegalStateException("node is null");
if (!annotationsForNext.isEmpty()) { if (!annotationsForNext.isEmpty()) {
if (node.visibleAnnotations == null) { if (node.visibleAnnotations == null) {
node.visibleAnnotations = new ArrayList<>(); node.visibleAnnotations = new ArrayList<>();
@@ -404,6 +408,8 @@ public class Assembler {
} }
clazz.methods.add(node); clazz.methods.add(node);
} else if (!s.startsWith("\t")) { } else if (!s.startsWith("\t")) {
if (node == null)
throw new IllegalStateException("node is null");
s = s.substring(0, s.length() - 2); s = s.substring(0, s.length() - 2);
if (s.contains(" throws ")) { if (s.contains(" throws ")) {
String exceptions = s.substring(s.lastIndexOf(" throws ") + 8); String exceptions = s.substring(s.lastIndexOf(" throws ") + 8);
@@ -477,6 +483,8 @@ public class Assembler {
s = s.substring(1); s = s.substring(1);
if (!temp.isEmpty()) { if (!temp.isEmpty()) {
if (s.equals("]")) { if (s.equals("]")) {
if (node == null)
throw new IllegalStateException("node is null");
temp += s; temp += s;
node.instructions.add(getNode(hsr, temp, methodLabelMap)); node.instructions.add(getNode(hsr, temp, methodLabelMap));
temp = ""; temp = "";
@@ -487,6 +495,8 @@ public class Assembler {
if (s.endsWith("[")) { if (s.endsWith("[")) {
temp += s + "\n"; temp += s + "\n";
} else { } else {
if (node == null)
throw new IllegalStateException("node is null");
node.instructions.add(getNode(hsr, s, methodLabelMap)); node.instructions.add(getNode(hsr, s, methodLabelMap));
} }
} }
@@ -508,6 +518,7 @@ public class Assembler {
return null; return null;
} finally { } finally {
try { try {
if (read != null)
read.close(); read.close();
} catch (Exception e) { } catch (Exception e) {
} }
@@ -1559,9 +1570,9 @@ public class Assembler {
private static Object[] parseFrameList(HugeStringsRev hsr, String str, HashMap<LabelNode, Integer> labels) { private static Object[] parseFrameList(HugeStringsRev hsr, String str, HashMap<LabelNode, Integer> labels) {
ArrayList<Object> list = new ArrayList<>(); ArrayList<Object> list = new ArrayList<>();
String l = str.substring(1, str.length() - 1); String l = str.substring(1, str.length() - 1);
if (l.isEmpty()) { if (l.isEmpty())
return EMPTY_OBJECT_ARRAY; return EMPTY_OBJECT_ARRAY;
} else {
for (String asd : l.split(", ")) { for (String asd : l.split(", ")) {
if (!asd.startsWith("(")) { if (!asd.startsWith("(")) {
int frameType = ClassUtil.getFrameTypeByName(asd); int frameType = ClassUtil.getFrameTypeByName(asd);
@@ -1591,6 +1602,5 @@ public class Assembler {
} }
return list.toArray(new Object[list.size()]); return list.toArray(new Object[list.size()]);
} }
}
} }
+9 -12
View File
@@ -127,7 +127,7 @@ public class Disassembler implements IDecompiler {
ctx.next("\n// #Fields\n"); ctx.next("\n// #Fields\n");
ctx.next(doFields(classNode.fields, hs)); ctx.next(doFields(classNode.fields, hs));
ctx.next("\n// #Methods\n"); ctx.next("\n// #Methods\n");
ctx.next(doMethods(classNode.methods, classNode.name, hs)); ctx.next(doMethods(classNode.methods, hs));
ctx.next("}\n"); ctx.next("}\n");
if (!hs.isEmpty()) if (!hs.isEmpty())
@@ -154,7 +154,7 @@ public class Disassembler implements IDecompiler {
s += o + " = ["; s += o + " = [";
valBefore = false; valBefore = false;
continue; continue;
} else { }
if (o instanceof String[]) { if (o instanceof String[]) {
String[] arr = (String[]) o; String[] arr = (String[]) o;
boolean w8ing = false; boolean w8ing = false;
@@ -196,7 +196,6 @@ public class Disassembler implements IDecompiler {
} }
valBefore = true; valBefore = true;
} }
}
if (s.endsWith(", ")) if (s.endsWith(", "))
s = s.substring(0, s.length() - 2); s = s.substring(0, s.length() - 2);
s += ")"; s += ")";
@@ -207,7 +206,7 @@ public class Disassembler implements IDecompiler {
return ctx.finish(); return ctx.finish();
} }
private static String doMethods(List<MethodNode> methods, String className, HugeStrings hs) private static String doMethods(List<MethodNode> methods, HugeStrings hs)
throws InterruptedException, ExecutionException { throws InterruptedException, ExecutionException {
boolean multithreaded = Main.INSTANCE.mntmMultithreaded.isSelected(); boolean multithreaded = Main.INSTANCE.mntmMultithreaded.isSelected();
Future<String>[] futures = new Future[methods.size()]; Future<String>[] futures = new Future[methods.size()];
@@ -221,7 +220,7 @@ public class Disassembler implements IDecompiler {
ms += "\t// #Max: l:" + mn.maxLocals + " s:" + mn.maxStack + "\n"; ms += "\t// #Max: l:" + mn.maxLocals + " s:" + mn.maxStack + "\n";
if (mn.signature != null) if (mn.signature != null)
ms += "\t// #Signature: " + UnicodeUtils.escapeWithSpaces(hs, mn.signature) + "\n"; ms += "\t// #Signature: " + UnicodeUtils.escapeWithSpaces(hs, mn.signature) + "\n";
String[] dis = disassembleMethod(className, mn, hs); String[] dis = disassembleMethod(mn, hs);
ms += dis[2]; ms += dis[2];
ms += dis[1]; ms += dis[1];
if (mn.visibleAnnotations != null && !mn.visibleAnnotations.isEmpty()) if (mn.visibleAnnotations != null && !mn.visibleAnnotations.isEmpty())
@@ -286,7 +285,7 @@ public class Disassembler implements IDecompiler {
return ctx.finish(); return ctx.finish();
} }
private static String[] disassembleMethod(String className, MethodNode mn, HugeStrings hs) { private static String[] disassembleMethod(MethodNode mn, HugeStrings hs) {
HashMap<Label, Integer> labels = new HashMap<Label, Integer>(); HashMap<Label, Integer> labels = new HashMap<Label, Integer>();
String localVarTable; String localVarTable;
String tryCatchTable; String tryCatchTable;
@@ -299,7 +298,7 @@ public class Disassembler implements IDecompiler {
for (AbstractInsnNode n = insnList.getFirst(); n != null; n = n.getNext()) { for (AbstractInsnNode n = insnList.getFirst(); n != null; n = n.getNext()) {
if (n instanceof LabelNode) { if (n instanceof LabelNode) {
int id = labels.size() + 1; int id = labels.size() + 1;
if (deobfNumbers) if (deobfNumbers && labelsReversed != null)
labelsReversed.add(((LabelNode) n).getLabel()); labelsReversed.add(((LabelNode) n).getLabel());
labels.put(((LabelNode) n).getLabel(), id); labels.put(((LabelNode) n).getLabel(), id);
} }
@@ -336,7 +335,7 @@ public class Disassembler implements IDecompiler {
insnList = calc.get(); insnList = calc.get();
int i = 0; int i = 0;
for (AbstractInsnNode n = insnList.getFirst(); n != null; n = n.getNext()) { for (AbstractInsnNode n = insnList.getFirst(); n != null; n = n.getNext()) {
if (n instanceof LabelNode) { if (n instanceof LabelNode && labelsReversed != null) {
((LabelNode) n).setLabel(labelsReversed.get(i++)); ((LabelNode) n).setLabel(labelsReversed.get(i++));
} }
} }
@@ -359,9 +358,8 @@ public class Disassembler implements IDecompiler {
if (n.getOpcode() == Opcodes.NEWARRAY) { if (n.getOpcode() == Opcodes.NEWARRAY) {
return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " " return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " "
+ ClassUtil.getArrayTypeByID(node.operand) + "\n"; + ClassUtil.getArrayTypeByID(node.operand) + "\n";
} else {
return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " " + node.operand + "\n";
} }
return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " " + node.operand + "\n";
} }
case VAR_INSN: { case VAR_INSN: {
VarInsnNode node = (VarInsnNode) n; VarInsnNode node = (VarInsnNode) n;
@@ -443,7 +441,7 @@ public class Disassembler implements IDecompiler {
+ valueEnd + "\n\t\t\tbuf: " + ClassUtil.getDecompiledValue(buf, "", hs); + valueEnd + "\n\t\t\tbuf: " + ClassUtil.getDecompiledValue(buf, "", hs);
s += "\n\t\t]\n"; s += "\n\t\t]\n";
return s; return s;
} else { }
String decomp = ClassUtil.getDecompiledValue(node.cst, "", hs); String decomp = ClassUtil.getDecompiledValue(node.cst, "", hs);
if (node.cst instanceof String) { if (node.cst instanceof String) {
if (decomp.startsWith("\"#") && decomp.endsWith("\"")) if (decomp.startsWith("\"#") && decomp.endsWith("\""))
@@ -453,7 +451,6 @@ public class Disassembler implements IDecompiler {
} }
return "\t\t" + OpcodesReverse.reverseOpcode(node.getOpcode()) + " " + decomp + "\n"; return "\t\t" + OpcodesReverse.reverseOpcode(node.getOpcode()) + " " + decomp + "\n";
} }
}
case IINC_INSN: { case IINC_INSN: {
IincInsnNode node = (IincInsnNode) n; IincInsnNode node = (IincInsnNode) n;
return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " " + node.var + " " + node.incr + "\n"; return "\t\t" + OpcodesReverse.reverseOpcode(n.getOpcode()) + " " + node.var + " " + node.incr + "\n";
-60
View File
@@ -1,60 +0,0 @@
package me.ByteEdit.edit;
import java.awt.EventQueue;
import java.awt.Toolkit;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
public class OptionBox extends JFrame {
private JPanel contentPane;
public JCheckBox chckbxComputeFrames;
public JCheckBox chckbxComputeMax;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
OptionBox frame = new OptionBox();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public OptionBox() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
setResizable(false);
setTitle("Options");
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
setBounds((int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 2 - 150),
(int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight() / 2 - 100), 300, 200);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
chckbxComputeFrames = new JCheckBox("Compute Frames");
chckbxComputeFrames.setBounds(6, 7, 138, 23);
contentPane.add(chckbxComputeFrames);
chckbxComputeMax = new JCheckBox("Compute Max");
chckbxComputeMax.setBounds(6, 33, 138, 23);
contentPane.add(chckbxComputeMax);
}
}
-153
View File
@@ -1,153 +0,0 @@
package me.ByteEdit.edit;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.regex.Pattern;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import me.ByteEdit.main.Main;
public class SearchBox extends JFrame {
public JPanel contentPane;
public JTextField txtFind;
public JTextField txtReplace;
public JCheckBox chckbxCaseSensitive;
/**
* Create the frame.
*/
public SearchBox() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
setResizable(false);
setTitle("Find/Replace");
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
setBounds((int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 2 - 128),
(int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight() / 2 - 181), 256, 262);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel lblFind = new JLabel("Find:");
lblFind.setBounds(10, 25, 71, 14);
contentPane.add(lblFind);
txtFind = new JTextField();
KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
txtFind.registerKeyboardAction(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
find();
}
}, enter, JComponent.WHEN_IN_FOCUSED_WINDOW);
txtFind.setBounds(91, 22, 149, 20);
contentPane.add(txtFind);
txtFind.setColumns(10);
JLabel lblReplaceWith = new JLabel("Replace with:");
lblReplaceWith.setBounds(10, 53, 71, 14);
contentPane.add(lblReplaceWith);
txtReplace = new JTextField();
txtReplace.setColumns(10);
txtReplace.setBounds(91, 50, 149, 20);
contentPane.add(txtReplace);
chckbxCaseSensitive = new JCheckBox("Case sensitive");
chckbxCaseSensitive.setBounds(10, 103, 230, 23);
contentPane.add(chckbxCaseSensitive);
JButton btnFind = new JButton("Find");
btnFind.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
find();
}
});
btnFind.setBounds(10, 150, 110, 23);
contentPane.add(btnFind);
JButton btnReplacefind = new JButton("Replace/Find");
btnReplacefind.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
replaceFind();
}
});
btnReplacefind.setBounds(130, 150, 110, 23);
contentPane.add(btnReplacefind);
JButton btnReplace = new JButton("Replace");
btnReplace.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
replace();
}
});
btnReplace.setBounds(10, 184, 110, 23);
contentPane.add(btnReplace);
JButton btnReplaceAll = new JButton("Replace All");
btnReplaceAll.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
replaceAll();
}
});
btnReplaceAll.setBounds(130, 184, 110, 23);
contentPane.add(btnReplaceAll);
}
public void find() {
int startPos = Main.txtByteEditView.getCaretPosition();
String toFind = txtFind.getText();
String txt = chckbxCaseSensitive.isSelected() ? Main.txtByteEditView.getText().substring(startPos)
: Main.txtByteEditView.getText().substring(startPos).toLowerCase();
int index = txt.indexOf(chckbxCaseSensitive.isSelected() ? toFind : toFind.toLowerCase());
if (index == -1) {
txt = chckbxCaseSensitive.isSelected() ? Main.txtByteEditView.getText()
: Main.txtByteEditView.getText().toLowerCase();
index = txt.indexOf(chckbxCaseSensitive.isSelected() ? toFind : toFind.toLowerCase());
startPos = 0;
if (index == -1) {
return;
}
}
Main.txtByteEditView.select(startPos + index, startPos + index + toFind.length());
}
public void replaceFind() {
replace();
find();
}
public void replace() {
String txt = Main.txtByteEditView.getText();
int startPos = Main.txtByteEditView.getSelectionStart();
Main.txtByteEditView.replaceSelection(txtReplace.getText());
Main.txtByteEditView.select(startPos, startPos + txtReplace.getText().length());
}
public void replaceAll() {
String toFind = txtFind.getText();
String toReplace = txtReplace.getText();
String txt = Main.txtByteEditView.getText();
int prev = Main.txtByteEditView.getCaretPosition();
if (chckbxCaseSensitive.isSelected()) {
Main.txtByteEditView.replaceRange(txt.replace(toFind, toReplace), 0, txt.length());
} else {
Main.txtByteEditView.replaceRange(txt.replaceAll("(?i)" + Pattern.quote(toFind), toReplace), 0,
txt.length());
}
Main.txtByteEditView.setCaretPosition(prev);
}
}
-121
View File
@@ -1,121 +0,0 @@
package me.ByteEdit.edit;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import me.ByteEdit.decompiler.SingleThreadedExecutor;
import me.ByteEdit.main.Main;
public class TypeOpenBox extends JFrame {
public JPanel contentPane;
public JTextField txtSearch;
/**
* Create the frame.
*/
public TypeOpenBox() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
setResizable(false);
setTitle("Open Type");
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
setBounds((int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 2 - 200),
(int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight() / 2 - 140), 400, 280);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
DefaultListModel<String> model = new DefaultListModel<>();
JList<String> list = new JList(model);
list.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
String val = list.getSelectedValue();
if (val != null && !val.equals(Main.currentNodeName)) {
SingleThreadedExecutor.execute(() -> Main.selectFile(val));
}
}
});
txtSearch = new JTextField();
txtSearch.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (model.size() == 1) {
list.setSelectedIndex(0);
}
}
});
txtSearch.getDocument().addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
updateList();
}
public void removeUpdate(DocumentEvent e) {
updateList();
}
public void insertUpdate(DocumentEvent e) {
updateList();
}
public void updateList() {
model.clear();
if (txtSearch.getText().isEmpty()) {
return;
}
String search = txtSearch.getText().toLowerCase();
if (search.contains("/")) {
for (String s : Main.classNodes.keySet()) {
String className = s.substring(0, s.length() - 6);
if (!className.contains("$") && className.toLowerCase().startsWith(search)) {
model.addElement(s);
}
}
} else {
for (String s : Main.classNodes.keySet()) {
String[] split = s.split("/");
String className = split[split.length - 1];
className = className.substring(0, className.length() - 6);
if (!className.contains("$") && className.toLowerCase().startsWith(search)) {
model.addElement(s);
}
}
}
}
});
txtSearch.setBounds(10, 11, 374, 20);
contentPane.add(txtSearch);
txtSearch.setColumns(10);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(10, 46, 374, 194);
contentPane.add(scrollPane);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
scrollPane.setViewportView(list);
}
}
+1 -1
View File
@@ -89,7 +89,7 @@ public class ArchiveTreeModel extends DefaultTreeModel {
} }
} }
private int getSlashCount(String s) { private static int getSlashCount(String s) {
int count = 0; int count = 0;
for (char c : s.toCharArray()) { for (char c : s.toCharArray()) {
if (c == '/') if (c == '/')
@@ -85,9 +85,8 @@ public class HugeStringsToolTips implements ToolTipSupplier {
} catch (IOException e1) { } catch (IOException e1) {
} }
break; break;
} else {
len += asm.length();
} }
len += asm.length();
} }
} catch (Exception e1) { } catch (Exception e1) {
} }
+28 -29
View File
@@ -54,8 +54,6 @@ import javax.swing.JSplitPane;
import javax.swing.JTree; import javax.swing.JTree;
import javax.swing.KeyStroke; import javax.swing.KeyStroke;
import javax.swing.border.EmptyBorder; import javax.swing.border.EmptyBorder;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.text.BadLocationException; import javax.swing.text.BadLocationException;
import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeCellRenderer;
@@ -168,7 +166,7 @@ public class Main extends JFrame {
/** /**
* Create a simple provider that adds some Java-related completions. * Create a simple provider that adds some Java-related completions.
*/ */
private CompletionProvider createCompletionProvider() { private static CompletionProvider createCompletionProvider() {
DefaultCompletionProvider provider = new DefaultCompletionProvider(); DefaultCompletionProvider provider = new DefaultCompletionProvider();
for (int i = 0; i < 200; i++) { for (int i = 0; i < 200; i++) {
String s = OpcodesReverse.reverseOpcode(i); String s = OpcodesReverse.reverseOpcode(i);
@@ -290,7 +288,6 @@ public class Main extends JFrame {
if (action == 0) { if (action == 0) {
final File file = fileChooser.getSelectedFile(); final File file = fileChooser.getSelectedFile();
saveFolder = file.getParentFile(); saveFolder = file.getParentFile();
boolean shouldSave = false;
if (file.exists()) { if (file.exists()) {
synchronized (treeLock) { synchronized (treeLock) {
jarFile = file; jarFile = file;
@@ -306,7 +303,7 @@ public class Main extends JFrame {
try { try {
ArchiveTreeModel model = new ArchiveTreeModel(new ZipFile(jarFile), classNodes, ArchiveTreeModel model = new ArchiveTreeModel(new ZipFile(jarFile), classNodes,
otherFiles); otherFiles);
EventQueue.invokeLater(new Runnable() { EventQueue.invokeAndWait(new Runnable() {
public void run() { public void run() {
synchronized (treeLock) { synchronized (treeLock) {
tree.setModel(model); tree.setModel(model);
@@ -323,7 +320,7 @@ public class Main extends JFrame {
} }
} }
}); });
} catch (IOException e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@@ -461,7 +458,7 @@ public class Main extends JFrame {
try { try {
ArchiveTreeModel model = new ArchiveTreeModel(new ZipFile(jarFile), classNodes, ArchiveTreeModel model = new ArchiveTreeModel(new ZipFile(jarFile), classNodes,
otherFiles); otherFiles);
EventQueue.invokeLater(new Runnable() { EventQueue.invokeAndWait(new Runnable() {
public void run() { public void run() {
synchronized (treeLock) { synchronized (treeLock) {
tree.setModel(model); tree.setModel(model);
@@ -470,7 +467,7 @@ public class Main extends JFrame {
} }
} }
}); });
} catch (IOException e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@@ -515,17 +512,8 @@ public class Main extends JFrame {
} }
}); });
scrollPane.setViewportView(tree); scrollPane.setViewportView(tree);
tree.addTreeSelectionListener(new TreeSelectionListener() { tree.addTreeSelectionListener(e -> SingleThreadedExecutor
.submit(() -> selectFile(((ByteEditTreeNode) e.getPath().getLastPathComponent()).path)));
public void valueChanged(TreeSelectionEvent e) {
synchronized (treeLock) {
if (!isChangingFile) {
SingleThreadedExecutor.execute(
() -> selectFile(((ByteEditTreeNode) e.getPath().getLastPathComponent()).path));
}
}
}
});
new DropTarget(tree, new DropTargetListener() { new DropTarget(tree, new DropTargetListener() {
@Override @Override
@@ -557,7 +545,7 @@ public class Main extends JFrame {
try { try {
ArchiveTreeModel model = new ArchiveTreeModel(new ZipFile(jarFile), ArchiveTreeModel model = new ArchiveTreeModel(new ZipFile(jarFile),
classNodes, otherFiles); classNodes, otherFiles);
EventQueue.invokeLater(new Runnable() { EventQueue.invokeAndWait(new Runnable() {
public void run() { public void run() {
synchronized (treeLock) { synchronized (treeLock) {
tree.setModel(model); tree.setModel(model);
@@ -574,7 +562,7 @@ public class Main extends JFrame {
} }
} }
}); });
} catch (IOException e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@@ -618,7 +606,7 @@ public class Main extends JFrame {
@Override @Override
public void keyReleased(KeyEvent e) { public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == 116 && currentNodeName != null) { // F5 if (e.getKeyCode() == 116 && currentNodeName != null) { // F5
SingleThreadedExecutor.execute(Main::decompileCurrentNode); SingleThreadedExecutor.submit(Main::decompileCurrentNode);
} }
} }
}); });
@@ -673,23 +661,23 @@ public class Main extends JFrame {
public void itemStateChanged(ItemEvent e) { public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) { if (e.getStateChange() == ItemEvent.SELECTED) {
EnumDecompiler selected = (EnumDecompiler) e.getItem(); EnumDecompiler selected = (EnumDecompiler) e.getItem();
SingleThreadedExecutor.execute(() -> { SingleThreadedExecutor.submit(() -> {
decompiler = selected; decompiler = selected;
if (currentNodeName != null) {
decompileCurrentNode(); decompileCurrentNode();
try { try {
EventQueue.invokeAndWait(() -> { EventQueue.invokeAndWait(() -> {
synchronized (treeLock) {
txtByteEditView.setCaretPosition(0); txtByteEditView.setCaretPosition(0);
try { try {
txtByteEditView.setSyntaxEditingStyle(decompiler.getSyntaxStyle()); txtByteEditView.setSyntaxEditingStyle(decompiler.getSyntaxStyle());
} catch (Throwable t) { } catch (Throwable t) {
} }
txtByteEditView.setEditable(decompiler.isEditable()); txtByteEditView.setEditable(decompiler.isEditable());
}
}); });
} catch (Exception e1) { } catch (Exception e1) {
e1.printStackTrace(); e1.printStackTrace();
} }
}
}); });
} }
} }
@@ -760,7 +748,7 @@ public class Main extends JFrame {
} }
} }
private void saveCurrentClassNode() { private static void saveCurrentClassNode() {
String txt = txtByteEditView.getText(); String txt = txtByteEditView.getText();
for (String s : txt.split("\\/\\/ #Annotations:\n")) { for (String s : txt.split("\\/\\/ #Annotations:\n")) {
if (s.isEmpty()) if (s.isEmpty())
@@ -791,6 +779,8 @@ public class Main extends JFrame {
} }
public static void decompileCurrentNode() { public static void decompileCurrentNode() {
if (currentNodeName == null)
return;
try { try {
EnumDecompiler decompiler = Main.decompiler; EnumDecompiler decompiler = Main.decompiler;
String current = currentNodeName; String current = currentNodeName;
@@ -808,9 +798,14 @@ public class Main extends JFrame {
} }
} }
} }
txtByteEditView.setText(dis); String fdis = dis;
if (dis.length() > prev) EventQueue.invokeAndWait(() -> {
synchronized (treeLock) {
txtByteEditView.setText(fdis);
if (fdis.length() > prev)
txtByteEditView.setCaretPosition(prev); txtByteEditView.setCaretPosition(prev);
}
});
} catch (Exception e2) { } catch (Exception e2) {
e2.printStackTrace(); e2.printStackTrace();
} }
@@ -869,7 +864,8 @@ public class Main extends JFrame {
public void run() { public void run() {
synchronized (treeLock) { synchronized (treeLock) {
save(file, classNodes.values()); save(file, classNodes.values());
EventQueue.invokeLater(new Runnable() { try {
EventQueue.invokeAndWait(new Runnable() {
public void run() { public void run() {
synchronized (treeLock) { synchronized (treeLock) {
isChangingFile = false; isChangingFile = false;
@@ -877,6 +873,9 @@ public class Main extends JFrame {
} }
} }
}); });
} catch (Exception e) {
e.printStackTrace();
}
} }
} }
}).start(); }).start();
+1 -4
View File
@@ -320,12 +320,10 @@ public class ClassUtil {
s += "enum "; s += "enum ";
acc ^= ACC_ENUM; acc ^= ACC_ENUM;
} }
if (acc == access) { if (acc == access)
return s; return s;
} else {
return "0x" + Integer.toHexString(access) + " "; return "0x" + Integer.toHexString(access) + " ";
} }
}
/** /**
* @return { JavaType, Import } * @return { JavaType, Import }
@@ -544,7 +542,6 @@ public class ClassUtil {
DecompilationInterface di = diMap.get(o.getClass()); DecompilationInterface di = diMap.get(o.getClass());
if (di != null) if (di != null)
return di.apply(o, desc, escapeSpaces, hs); return di.apply(o, desc, escapeSpaces, hs);
else
return o.toString(); return o.toString();
} }
+1 -3
View File
@@ -84,12 +84,10 @@ public class UnicodeUtils {
sb.append(c); sb.append(c);
} }
if (stage != 0) { if (stage != 0) {
if (unicodeBuffer != 0) { if (unicodeBuffer != 0)
throw new IllegalArgumentException("The unicode at the end is incomplete."); throw new IllegalArgumentException("The unicode at the end is incomplete.");
} else {
throw new IllegalArgumentException("'\\' at the end is invalid."); throw new IllegalArgumentException("'\\' at the end is invalid.");
} }
}
return sb.toString(); return sb.toString();
} }