Merge branch 'master' of https://github.com/Konloch/bytecode-viewer.git
Conflicts: src/the/bytecode/club/bytecodeviewer/gui/MainViewerGUI.java src/the/bytecode/club/bytecodeviewer/plugins/CodeSequenceDiagram.java
This commit is contained in:
commit
5b87048682
9 changed files with 323 additions and 38 deletions
|
@ -88,9 +88,15 @@ import the.bytecode.club.bytecodeviewer.plugin.PluginManager;
|
|||
* add stackmapframes to bytecode decompiler
|
||||
* add stackmapframes remover?
|
||||
* In BCV if you open a class and the name is so big, you cannot close because the [X] does not appear."
|
||||
* refresh appears under panes that are non refreshable
|
||||
* make ez-injection plugin console show all sys.out calls
|
||||
* edit then save issues?
|
||||
*
|
||||
* -----2.9.5-----:
|
||||
* 05/01/2015 - Added 'pingback' for statistics (to track how many people globally use BCV)
|
||||
* -----2.9.6-----:
|
||||
* 05/05/2015 - Fixed a typo in the about window
|
||||
* 05/28/2015 - Started importing JD-GUI Decompiler.
|
||||
* 05/28/2015 - Compile on refresh and compile on save are now enabled by default.
|
||||
* 05/28/2015 - Renamed the File>Save As options to be much more informative.
|
||||
*
|
||||
* @author Konloch
|
||||
*
|
||||
|
@ -99,7 +105,7 @@ import the.bytecode.club.bytecodeviewer.plugin.PluginManager;
|
|||
public class BytecodeViewer {
|
||||
|
||||
/*per version*/
|
||||
public static String version = "2.9.5";
|
||||
public static String version = "2.9.6";
|
||||
public static String krakatauVersion = "2";
|
||||
/*the rest*/
|
||||
public static MainViewerGUI viewer = null;
|
||||
|
|
|
@ -115,6 +115,8 @@ public class Settings {
|
|||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "7", false);
|
||||
else if(BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1KrakatauBytecode.getModel()))
|
||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "8", false);
|
||||
else if(BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1JDGUI.getModel()))
|
||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "9", false);
|
||||
|
||||
if(BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2None.getModel()))
|
||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "0", false);
|
||||
|
@ -134,6 +136,8 @@ public class Settings {
|
|||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "7", false);
|
||||
else if(BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2KrakatauBytecode.getModel()))
|
||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "8", false);
|
||||
else if(BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2JDGUI.getModel()))
|
||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "9", false);
|
||||
|
||||
if(BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3None.getModel()))
|
||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "0", false);
|
||||
|
@ -153,6 +157,8 @@ public class Settings {
|
|||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "7", false);
|
||||
else if(BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3KrakatauBytecode.getModel()))
|
||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "8", false);
|
||||
else if(BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3JDGUI.getModel()))
|
||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "9", false);
|
||||
|
||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.refreshOnChange.isSelected()), false);
|
||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.isMaximized), false);
|
||||
|
@ -179,6 +185,9 @@ public class Settings {
|
|||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.decodeAPKResources.isSelected()), false);
|
||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, BytecodeViewer.library, false);
|
||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.pingback), false);
|
||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.panel1JDGUI_E.isSelected()), false);
|
||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.panel2JDGUI_E.isSelected()), false);
|
||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.panel3JDGUI_E.isSelected()), false);
|
||||
} catch(Exception e) {
|
||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||
}
|
||||
|
@ -285,6 +294,8 @@ public class Settings {
|
|||
BytecodeViewer.viewer.panelGroup1.setSelected(BytecodeViewer.viewer.panel1Krakatau.getModel(), true);
|
||||
else if(decompiler == 8)
|
||||
BytecodeViewer.viewer.panelGroup1.setSelected(BytecodeViewer.viewer.panel1KrakatauBytecode.getModel(), true);
|
||||
else if(decompiler == 9)
|
||||
BytecodeViewer.viewer.panelGroup1.setSelected(BytecodeViewer.viewer.panel1JDGUI.getModel(), true);
|
||||
|
||||
decompiler = Integer.parseInt(DiskReader.loadString(BytecodeViewer.settingsName, 82, false));
|
||||
if(decompiler == 0)
|
||||
|
@ -305,6 +316,8 @@ public class Settings {
|
|||
BytecodeViewer.viewer.panelGroup2.setSelected(BytecodeViewer.viewer.panel2Krakatau.getModel(), true);
|
||||
else if(decompiler == 8)
|
||||
BytecodeViewer.viewer.panelGroup2.setSelected(BytecodeViewer.viewer.panel2KrakatauBytecode.getModel(), true);
|
||||
else if(decompiler == 9)
|
||||
BytecodeViewer.viewer.panelGroup2.setSelected(BytecodeViewer.viewer.panel2JDGUI.getModel(), true);
|
||||
|
||||
decompiler = Integer.parseInt(DiskReader.loadString(BytecodeViewer.settingsName, 83, false));
|
||||
if(decompiler == 0)
|
||||
|
@ -325,6 +338,8 @@ public class Settings {
|
|||
BytecodeViewer.viewer.panelGroup3.setSelected(BytecodeViewer.viewer.panel3Krakatau.getModel(), true);
|
||||
else if(decompiler == 8)
|
||||
BytecodeViewer.viewer.panelGroup3.setSelected(BytecodeViewer.viewer.panel3KrakatauBytecode.getModel(), true);
|
||||
else if(decompiler == 9)
|
||||
BytecodeViewer.viewer.panelGroup3.setSelected(BytecodeViewer.viewer.panel3JDGUI.getModel(), true);
|
||||
|
||||
BytecodeViewer.viewer.refreshOnChange.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 84, false)));
|
||||
|
||||
|
@ -356,6 +371,9 @@ public class Settings {
|
|||
BytecodeViewer.viewer.decodeAPKResources.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 106, false)));
|
||||
BytecodeViewer.library = DiskReader.loadString(BytecodeViewer.settingsName, 107, false);
|
||||
BytecodeViewer.pingback = Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 108, false));
|
||||
BytecodeViewer.viewer.panel1JDGUI_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 109, false)));
|
||||
BytecodeViewer.viewer.panel2JDGUI_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 110, false)));
|
||||
BytecodeViewer.viewer.panel3JDGUI_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 111, false)));
|
||||
} catch(Exception e) {
|
||||
//ignore because errors are expected, first start up and outdated settings.
|
||||
//e.printStackTrace();
|
||||
|
|
|
@ -245,4 +245,12 @@ public class BytecodeViewer {
|
|||
public static the.bytecode.club.bytecodeviewer.compilers.Compiler getSmaliCompiler() {
|
||||
return the.bytecode.club.bytecodeviewer.compilers.Compiler.smali;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the wrapped JD-GUI Decompiler instance.
|
||||
* @return The wrapped JD-GUI Decompiler instance
|
||||
*/
|
||||
public static the.bytecode.club.bytecodeviewer.decompilers.Decompiler getDJGUIDecompiler() {
|
||||
return the.bytecode.club.bytecodeviewer.decompilers.Decompiler.jdgui;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,4 +26,5 @@ public abstract class Decompiler {
|
|||
public static Decompiler krakatau = new KrakatauDecompiler();
|
||||
public static Decompiler krakatauDA = new KrakatauDisassembler();
|
||||
public static Decompiler smali = new SmaliDisassembler();
|
||||
public static Decompiler jdgui = new JDGUIDecompiler();
|
||||
}
|
||||
|
|
|
@ -48,7 +48,7 @@ import the.bytecode.club.bytecodeviewer.MiscUtils;
|
|||
*
|
||||
*/
|
||||
|
||||
public class JDCoreDecompiler extends Decompiler {
|
||||
public class JDGUIDecompiler extends Decompiler {
|
||||
|
||||
@Override
|
||||
public void decompileToClass(String className, String classNameSaved) {
|
||||
|
@ -81,11 +81,11 @@ public class JDCoreDecompiler extends Decompiler {
|
|||
|
||||
exception = "Bytecode Viewer Version: " + BytecodeViewer.version + BytecodeViewer.nl + BytecodeViewer.nl + sw.toString();
|
||||
}
|
||||
return "Procyon error! Send the stacktrace to Konloch at http://the.bytecode.club or konloch@gmail.com"+BytecodeViewer.nl+BytecodeViewer.nl+"Suggested Fix: Click refresh class, if it fails again try another decompiler."+BytecodeViewer.nl+BytecodeViewer.nl+exception;
|
||||
return "JD-GUI error! Send the stacktrace to Konloch at http://the.bytecode.club or konloch@gmail.com"+BytecodeViewer.nl+BytecodeViewer.nl+"Suggested Fix: Click refresh class, if it fails again try another decompiler."+BytecodeViewer.nl+BytecodeViewer.nl+exception;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void decompileToZip(String zipName) {
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -40,7 +40,7 @@ public class AboutWindow extends JFrame {
|
|||
super.setVisible(b);
|
||||
txtrBytecodeViewerIs
|
||||
.setText("Bytecode Viewer "+BytecodeViewer.version+" is an open source program developed and maintained by Konloch (konloch@gmail.com)\r\n"+
|
||||
"100% free and open sourced licensed under GPL v3 CopyLef\r\n\r\n"+
|
||||
"100% free and open sourced licensed under GPL v3 CopyLeft\r\n\r\n"+
|
||||
"Settings:"+BytecodeViewer.nl+
|
||||
"BCV Dir: " + BytecodeViewer.getBCVDirectory()+BytecodeViewer.nl+
|
||||
"Python: " + BytecodeViewer.python+BytecodeViewer.nl+
|
||||
|
@ -51,6 +51,7 @@ public class AboutWindow extends JFrame {
|
|||
"Keybinds:"+BytecodeViewer.nl+
|
||||
"CTRL + O: Open/add new jar/class/apk"+BytecodeViewer.nl+
|
||||
"CTLR + N: Reset the workspace"+BytecodeViewer.nl+
|
||||
"CTRL + W: Closes the currently opened tab"+BytecodeViewer.nl+
|
||||
"CTRL + T: Compile"+BytecodeViewer.nl+
|
||||
"CTRL + S: Save classes as zip"+BytecodeViewer.nl+
|
||||
"CTRL + R: Run (EZ-Inject) - dynamically load the classes and invoke a main class"+
|
||||
|
|
|
@ -76,6 +76,8 @@ public class ClassViewer extends Viewer {
|
|||
pane1 = 7;
|
||||
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1KrakatauBytecode.getModel()))
|
||||
pane1 = 8;
|
||||
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1JDGUI.getModel()))
|
||||
pane1 = 9;
|
||||
|
||||
if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2None.getModel()))
|
||||
pane2 = 0;
|
||||
|
@ -95,6 +97,8 @@ public class ClassViewer extends Viewer {
|
|||
pane2 = 7;
|
||||
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2KrakatauBytecode.getModel()))
|
||||
pane2 = 8;
|
||||
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2JDGUI.getModel()))
|
||||
pane2 = 9;
|
||||
|
||||
if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3None.getModel()))
|
||||
pane3 = 0;
|
||||
|
@ -114,6 +118,8 @@ public class ClassViewer extends Viewer {
|
|||
pane3 = 7;
|
||||
else if (BytecodeViewer.viewer.panelGroup3 .isSelected(BytecodeViewer.viewer.panel3KrakatauBytecode.getModel()))
|
||||
pane3 = 8;
|
||||
else if (BytecodeViewer.viewer.panelGroup3 .isSelected(BytecodeViewer.viewer.panel3JDGUI.getModel()))
|
||||
pane3 = 9;
|
||||
}
|
||||
|
||||
public boolean isPanel1Editable() {
|
||||
|
@ -127,6 +133,8 @@ public class ClassViewer extends Viewer {
|
|||
return true;
|
||||
if(pane1 == 6 && BytecodeViewer.viewer.panel1Smali_E.isSelected())
|
||||
return true;
|
||||
if(pane1 == 9 && BytecodeViewer.viewer.panel1JDGUI_E.isSelected())
|
||||
return true;
|
||||
if((pane1 == 7 || pane1 == 8) && BytecodeViewer.viewer.panel1Krakatau_E.isSelected())
|
||||
return true;
|
||||
|
||||
|
@ -145,6 +153,8 @@ public class ClassViewer extends Viewer {
|
|||
return true;
|
||||
if(pane2 == 6 && BytecodeViewer.viewer.panel2Smali_E.isSelected())
|
||||
return true;
|
||||
if(pane2 == 9 && BytecodeViewer.viewer.panel2JDGUI_E.isSelected())
|
||||
return true;
|
||||
if((pane2 == 7 || pane2 == 8) && BytecodeViewer.viewer.panel2Krakatau_E.isSelected())
|
||||
return true;
|
||||
|
||||
|
@ -163,6 +173,8 @@ public class ClassViewer extends Viewer {
|
|||
return true;
|
||||
if(pane3 == 6 && BytecodeViewer.viewer.panel3Smali_E.isSelected())
|
||||
return true;
|
||||
if(pane3 == 9 && BytecodeViewer.viewer.panel3JDGUI_E.isSelected())
|
||||
return true;
|
||||
if((pane3 == 7 || pane3 == 8) && BytecodeViewer.viewer.panel3Krakatau_E.isSelected())
|
||||
return true;
|
||||
|
||||
|
@ -776,6 +788,32 @@ public class ClassViewer extends Viewer {
|
|||
});
|
||||
panel1.add(scrollPane);
|
||||
}
|
||||
|
||||
if (pane1 == 9) {// JD-GUI
|
||||
RSyntaxTextArea panelArea = new RSyntaxTextArea();
|
||||
panelArea
|
||||
.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
|
||||
panelArea.setCodeFoldingEnabled(true);
|
||||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(
|
||||
panelArea);
|
||||
panelArea.setText(Decompiler.jdgui.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(isPanel1Editable());
|
||||
panelArea.addKeyListener(new KeyListener() {
|
||||
public void keyPressed(KeyEvent e) {
|
||||
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
|
||||
field1.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
});
|
||||
panel1.add(scrollPane);
|
||||
java1 = panelArea;
|
||||
}
|
||||
} catch(Exception e) {
|
||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||
} finally {
|
||||
|
@ -972,6 +1010,32 @@ public class ClassViewer extends Viewer {
|
|||
});
|
||||
panel2.add(scrollPane);
|
||||
}
|
||||
|
||||
if (pane2 == 9) {// JD-GUI
|
||||
RSyntaxTextArea panelArea = new RSyntaxTextArea();
|
||||
panelArea
|
||||
.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
|
||||
panelArea.setCodeFoldingEnabled(true);
|
||||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(
|
||||
panelArea);
|
||||
panelArea.setText(Decompiler.jdgui.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(isPanel2Editable());
|
||||
panelArea.addKeyListener(new KeyListener() {
|
||||
public void keyPressed(KeyEvent e) {
|
||||
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
|
||||
field2.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
});
|
||||
panel2.add(scrollPane);
|
||||
java2 = panelArea;
|
||||
}
|
||||
} catch(Exception e) {
|
||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||
} finally {
|
||||
|
@ -1144,8 +1208,6 @@ public class ClassViewer extends Viewer {
|
|||
java3 = panelArea;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (pane3 == 8) {// kraktau bytecode
|
||||
RSyntaxTextArea panelArea = new RSyntaxTextArea();
|
||||
panelArea
|
||||
|
@ -1171,6 +1233,32 @@ public class ClassViewer extends Viewer {
|
|||
});
|
||||
panel3.add(scrollPane);
|
||||
}
|
||||
|
||||
if (pane3 == 9) {// JD-GUI
|
||||
RSyntaxTextArea panelArea = new RSyntaxTextArea();
|
||||
panelArea
|
||||
.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
|
||||
panelArea.setCodeFoldingEnabled(true);
|
||||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(
|
||||
panelArea);
|
||||
panelArea.setText(Decompiler.jdgui.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(isPanel3Editable());
|
||||
panelArea.addKeyListener(new KeyListener() {
|
||||
public void keyPressed(KeyEvent e) {
|
||||
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
|
||||
field3.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
});
|
||||
panel3.add(scrollPane);
|
||||
java3 = panelArea;
|
||||
}
|
||||
} catch(Exception e) {
|
||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||
} finally {
|
||||
|
|
|
@ -38,11 +38,7 @@ import the.bytecode.club.bytecodeviewer.FileChangeNotifier;
|
|||
import the.bytecode.club.bytecodeviewer.JarUtils;
|
||||
import the.bytecode.club.bytecodeviewer.MiscUtils;
|
||||
import the.bytecode.club.bytecodeviewer.Resources;
|
||||
import the.bytecode.club.bytecodeviewer.decompilers.CFRDecompiler;
|
||||
import the.bytecode.club.bytecodeviewer.decompilers.Decompiler;
|
||||
import the.bytecode.club.bytecodeviewer.decompilers.FernFlowerDecompiler;
|
||||
import the.bytecode.club.bytecodeviewer.decompilers.KrakatauDecompiler;
|
||||
import the.bytecode.club.bytecodeviewer.decompilers.ProcyonDecompiler;
|
||||
import the.bytecode.club.bytecodeviewer.obfuscators.rename.RenameClasses;
|
||||
import the.bytecode.club.bytecodeviewer.obfuscators.rename.RenameFields;
|
||||
import the.bytecode.club.bytecodeviewer.obfuscators.rename.RenameMethods;
|
||||
|
@ -109,11 +105,6 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
}
|
||||
}
|
||||
|
||||
final Decompiler ff_dc = new FernFlowerDecompiler();
|
||||
final Decompiler proc_dc = new ProcyonDecompiler();
|
||||
final Decompiler cfr_dc = new CFRDecompiler();
|
||||
final Decompiler krak_dc = new KrakatauDecompiler();
|
||||
|
||||
public static final long serialVersionUID = 1851409230530948543L;
|
||||
public JCheckBoxMenuItem debugHelpers = new JCheckBoxMenuItem("Debug Helpers");
|
||||
public JSplitPane sp1;
|
||||
|
@ -156,7 +147,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
public final JMenuItem mntmNewWorkspace = new JMenuItem("New Workspace");
|
||||
public JMenu mnRecentFiles = new JMenu("Recent Files");
|
||||
public final JMenuItem mntmNewMenuItem = new JMenuItem(
|
||||
"Save Java Files As..");
|
||||
"Decompile & Save All Classes..");
|
||||
public final JMenuItem mntmAbout = new JMenuItem("About");
|
||||
public AboutWindow aboutWindow = new AboutWindow();
|
||||
public final JSeparator separator_3 = new JSeparator();
|
||||
|
@ -176,7 +167,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
"Show All Strings");
|
||||
public final JMenuItem mntmShowMainMethods = new JMenuItem(
|
||||
"Show Main Methods");
|
||||
public final JMenuItem mntmNewMenuItem_3 = new JMenuItem("Save As Jar..");
|
||||
public final JMenuItem mntmNewMenuItem_3 = new JMenuItem("Save As Runnable Jar..");
|
||||
public JMenuBar menuBar = new JMenuBar();
|
||||
public final JMenuItem mntmReplaceStrings = new JMenuItem(
|
||||
"Replace Strings");
|
||||
|
@ -323,7 +314,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
"Java");
|
||||
public final JRadioButtonMenuItem panel1Proc = new JRadioButtonMenuItem(
|
||||
"Java");
|
||||
public final JMenuItem mntmNewMenuItem_12 = new JMenuItem("Save Java File..");
|
||||
public final JMenuItem mntmNewMenuItem_12 = new JMenuItem("Decompile & Save Opened Class..");
|
||||
public WorkPane workPane = new WorkPane(this);
|
||||
public final JMenu mnSettings = new JMenu("Settings");
|
||||
public final JSeparator separator_6 = new JSeparator();
|
||||
|
@ -490,6 +481,18 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
public final ButtonGroup panelGroup3 = new ButtonGroup();
|
||||
private final JMenuItem mntmSetOpitonalLibrary = new JMenuItem("Set Optionial Library Folder");
|
||||
private final JMenuItem mntmPingback = new JMenuItem("Pingback");
|
||||
private final JMenu mnJdgui = new JMenu("JD-GUI");
|
||||
public final JRadioButtonMenuItem panel3JDGUI = new JRadioButtonMenuItem("Java");
|
||||
private final JSeparator separator_33 = new JSeparator();
|
||||
public final JCheckBoxMenuItem panel3JDGUI_E = new JCheckBoxMenuItem("Editable");
|
||||
private final JMenu menu = new JMenu("JD-GUI");
|
||||
public final JRadioButtonMenuItem panel2JDGUI = new JRadioButtonMenuItem("Java");
|
||||
private final JSeparator separator_34 = new JSeparator();
|
||||
public final JCheckBoxMenuItem panel2JDGUI_E = new JCheckBoxMenuItem("Editable");
|
||||
private final JMenu menu_6 = new JMenu("JD-GUI");
|
||||
public final JRadioButtonMenuItem panel1JDGUI = new JRadioButtonMenuItem("Java");
|
||||
private final JSeparator separator_35 = new JSeparator();
|
||||
public final JCheckBoxMenuItem panel1JDGUI_E = new JCheckBoxMenuItem("Editable");
|
||||
public MainViewerGUI() {
|
||||
mnNewMenu_5.setVisible(false);
|
||||
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new Test());
|
||||
|
@ -581,7 +584,8 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
|
||||
mnNewMenu.add(mntmNewWorkspace);
|
||||
|
||||
JMenuItem mntmSave = new JMenuItem("Save Files As..");
|
||||
JMenuItem mntmSave = new JMenuItem("Save As Zip..");
|
||||
mntmSave.setActionCommand("");
|
||||
mntmSave.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent arg0) {
|
||||
|
@ -822,7 +826,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
JOptionPane pane = new JOptionPane(
|
||||
"What decompiler will you use?");
|
||||
Object[] options = new String[] { "Procyon", "CFR",
|
||||
"Fernflower", "Krakatau", "Cancel" };
|
||||
"Fernflower", "Krakatau", "JD-GUI", "Cancel" };
|
||||
pane.setOptions(options);
|
||||
JDialog dialog = pane.createDialog(BytecodeViewer.viewer,
|
||||
"Bytecode Viewer - Select Decompiler");
|
||||
|
@ -838,7 +842,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
proc_dc.decompileToZip(path);
|
||||
Decompiler.procyon.decompileToZip(path);
|
||||
BytecodeViewer.viewer.setIcon(false);
|
||||
} catch (Exception e) {
|
||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||
|
@ -852,7 +856,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
cfr_dc.decompileToZip(path);
|
||||
Decompiler.cfr.decompileToZip(path);
|
||||
BytecodeViewer.viewer.setIcon(false);
|
||||
} catch (Exception e) {
|
||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||
|
@ -866,7 +870,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
ff_dc.decompileToZip(path);
|
||||
Decompiler.fernflower.decompileToZip(path);
|
||||
BytecodeViewer.viewer.setIcon(false);
|
||||
} catch (Exception e) {
|
||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||
|
@ -881,7 +885,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
krak_dc.decompileToZip(path);
|
||||
Decompiler.krakatau.decompileToZip(path);
|
||||
BytecodeViewer.viewer.setIcon(false);
|
||||
} catch (Exception e) {
|
||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||
|
@ -891,7 +895,22 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
t.start();
|
||||
}
|
||||
|
||||
if(result == 4) {
|
||||
if (result == 4) {
|
||||
Thread t = new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
Decompiler.jdgui.decompileToZip(path);
|
||||
BytecodeViewer.viewer.setIcon(false);
|
||||
} catch (Exception e) {
|
||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||
}
|
||||
}
|
||||
};
|
||||
t.start();
|
||||
}
|
||||
|
||||
if(result == 5) {
|
||||
BytecodeViewer.viewer.setIcon(false);
|
||||
}
|
||||
}
|
||||
|
@ -944,7 +963,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
JOptionPane pane = new JOptionPane(
|
||||
"What decompiler will you use?");
|
||||
Object[] options = new String[] { "Procyon", "CFR",
|
||||
"Fernflower", "Krakatau", "Cancel" };
|
||||
"Fernflower", "Krakatau", "DJ GUI", "Cancel" };
|
||||
pane.setOptions(options);
|
||||
JDialog dialog = pane.createDialog(BytecodeViewer.viewer,
|
||||
"Bytecode Viewer - Select Decompiler");
|
||||
|
@ -960,7 +979,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
proc_dc.decompileToClass(s,path);
|
||||
Decompiler.procyon.decompileToClass(s,path);
|
||||
BytecodeViewer.viewer.setIcon(false);
|
||||
} catch (Exception e) {
|
||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(
|
||||
|
@ -975,7 +994,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
cfr_dc.decompileToClass(s,path);
|
||||
Decompiler.cfr.decompileToClass(s,path);
|
||||
BytecodeViewer.viewer.setIcon(false);
|
||||
} catch (Exception e) {
|
||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(
|
||||
|
@ -990,7 +1009,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
ff_dc.decompileToClass(s,path);
|
||||
Decompiler.fernflower.decompileToClass(s,path);
|
||||
BytecodeViewer.viewer.setIcon(false);
|
||||
} catch (Exception e) {
|
||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(
|
||||
|
@ -1005,7 +1024,22 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
krak_dc.decompileToClass(s,path);
|
||||
Decompiler.krakatau.decompileToClass(s,path);
|
||||
BytecodeViewer.viewer.setIcon(false);
|
||||
} catch (Exception e) {
|
||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(
|
||||
e);
|
||||
}
|
||||
}
|
||||
};
|
||||
t.start();
|
||||
}
|
||||
if (result == 4) {
|
||||
Thread t = new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
Decompiler.jdgui.decompileToClass(s,path);
|
||||
BytecodeViewer.viewer.setIcon(false);
|
||||
} catch (Exception e) {
|
||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(
|
||||
|
@ -1016,7 +1050,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
t.start();
|
||||
}
|
||||
|
||||
if(result == 4) {
|
||||
if(result == 5) {
|
||||
BytecodeViewer.viewer.setIcon(false);
|
||||
}
|
||||
}
|
||||
|
@ -1099,6 +1133,14 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
|
||||
mnCfr.add(panel1CFR_E);
|
||||
|
||||
mnNewMenu_7.add(menu_6);
|
||||
|
||||
menu_6.add(panel1JDGUI);
|
||||
|
||||
menu_6.add(separator_35);
|
||||
|
||||
menu_6.add(panel1JDGUI_E);
|
||||
|
||||
mnNewMenu_7.add(mnFernflower);
|
||||
mnFernflower.add(panel1Fern);
|
||||
panel1Fern.addActionListener(listener);
|
||||
|
@ -1156,6 +1198,14 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
|
||||
menu_2.add(panel2CFR_E);
|
||||
|
||||
mnPane.add(menu);
|
||||
|
||||
menu.add(panel2JDGUI);
|
||||
|
||||
menu.add(separator_34);
|
||||
|
||||
menu.add(panel2JDGUI_E);
|
||||
|
||||
mnPane.add(menu_3);
|
||||
|
||||
menu_3.add(panel2Fern);
|
||||
|
@ -1212,6 +1262,14 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
|
||||
menu_8.add(panel3CFR_E);
|
||||
|
||||
mnPane_1.add(mnJdgui);
|
||||
|
||||
mnJdgui.add(panel3JDGUI);
|
||||
|
||||
mnJdgui.add(separator_33);
|
||||
|
||||
mnJdgui.add(panel3JDGUI_E);
|
||||
|
||||
mnPane_1.add(menu_9);
|
||||
|
||||
menu_9.add(panel3Fern);
|
||||
|
@ -1247,8 +1305,10 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
mnPane_1.add(panel3Hexcode);
|
||||
|
||||
menuBar.add(mnSettings);
|
||||
autoCompileSmali.setSelected(true);
|
||||
|
||||
mnSettings.add(autoCompileSmali);
|
||||
autoCompileOnRefresh.setSelected(true);
|
||||
|
||||
mnSettings.add(autoCompileOnRefresh);
|
||||
mnSettings.add(chckbxmntmNewCheckItem_12);
|
||||
|
@ -1607,8 +1667,6 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
@Override
|
||||
public void actionPerformed(ActionEvent arg0) {
|
||||
JFileChooser fc = new JFileChooser();
|
||||
/* 01/06/15, 14:32, Changed to plugin file filter rather from the
|
||||
* only .java filter. */
|
||||
fc.setFileFilter(PluginManager.fileFilter());
|
||||
fc.setFileHidingEnabled(false);
|
||||
fc.setAcceptAllFileFilterUsed(false);
|
||||
|
@ -1690,6 +1748,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
panelGroup1.add(panel1None);
|
||||
panelGroup1.add(panel1Proc);
|
||||
panelGroup1.add(panel1CFR);
|
||||
panelGroup1.add(panel1JDGUI);
|
||||
panelGroup1.add(panel1Fern);
|
||||
panelGroup1.add(panel1Krakatau);
|
||||
panelGroup1.add(panel1KrakatauBytecode);
|
||||
|
@ -1700,6 +1759,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
panelGroup2.add(panel2None);
|
||||
panelGroup2.add(panel2Proc);
|
||||
panelGroup2.add(panel2CFR);
|
||||
panelGroup2.add(panel2JDGUI);
|
||||
panelGroup2.add(panel2Fern);
|
||||
panelGroup2.add(panel2Krakatau);
|
||||
panelGroup2.add(panel2KrakatauBytecode);
|
||||
|
@ -1710,6 +1770,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
panelGroup3.add(panel3None);
|
||||
panelGroup3.add(panel3Proc);
|
||||
panelGroup3.add(panel3CFR);
|
||||
panelGroup3.add(panel3JDGUI);
|
||||
panelGroup3.add(panel3Fern);
|
||||
panelGroup3.add(panel3Krakatau);
|
||||
panelGroup3.add(panel3KrakatauBytecode);
|
||||
|
|
|
@ -0,0 +1,102 @@
|
|||
package the.bytecode.club.bytecodeviewer.plugins;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.awt.font.FontRenderContext;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.UIManager;
|
||||
|
||||
import org.objectweb.asm.tree.AbstractInsnNode;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
import org.objectweb.asm.tree.MethodInsnNode;
|
||||
import org.objectweb.asm.tree.MethodNode;
|
||||
|
||||
import com.mxgraph.swing.mxGraphComponent;
|
||||
import com.mxgraph.view.mxGraph;
|
||||
|
||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||
import the.bytecode.club.bytecodeviewer.Resources;
|
||||
import the.bytecode.club.bytecodeviewer.api.Plugin;
|
||||
import the.bytecode.club.bytecodeviewer.gui.ClassViewer;
|
||||
|
||||
/**
|
||||
* A simple code sequence diagram.
|
||||
*
|
||||
* @author Konloch
|
||||
*
|
||||
*/
|
||||
|
||||
public class CodeSequenceDiagram extends Plugin {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public void execute(ArrayList<ClassNode> classNodeList) {
|
||||
if(BytecodeViewer.viewer.workPane.getCurrentViewer() == null || !(BytecodeViewer.viewer.workPane.getCurrentViewer() instanceof ClassViewer)) {
|
||||
BytecodeViewer.showMessage("First open a class file.");
|
||||
return;
|
||||
}
|
||||
ClassNode c = BytecodeViewer.viewer.workPane.getCurrentViewer().cn;
|
||||
if(c == null) {
|
||||
BytecodeViewer.showMessage("ClassNode is null for CodeSequenceDiagram. Please report to @Konloch");
|
||||
return;
|
||||
}
|
||||
JFrame frame = null;
|
||||
if(c.name != null)
|
||||
frame = new JFrame("Code Sequence Diagram - "+c.name);
|
||||
else
|
||||
frame = new JFrame("Code Sequence Diagram - Unknown Name");
|
||||
|
||||
frame.setIconImages(Resources.iconList);
|
||||
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
|
||||
frame.setSize(400, 320);
|
||||
mxGraph graph = new mxGraph();
|
||||
graph.setVertexLabelsMovable(false);
|
||||
graph.setGridEnabled(true);
|
||||
graph.setEnabled(false);
|
||||
graph.setCellsEditable(false);
|
||||
graph.setCellsSelectable(false);
|
||||
graph.setCellsMovable(false);
|
||||
graph.setCellsLocked(true);
|
||||
Object parent = graph.getDefaultParent();
|
||||
Font font = UIManager.getDefaults().getFont("TabbedPane.font");
|
||||
AffineTransform affinetransform = new AffineTransform();
|
||||
FontRenderContext frc = new FontRenderContext(affinetransform,true,true);
|
||||
|
||||
graph.getModel().beginUpdate();
|
||||
try
|
||||
{
|
||||
|
||||
int testX = 10;
|
||||
int testY = 0;
|
||||
double magicNumber = 5.8;
|
||||
|
||||
for(MethodNode m : (ArrayList<MethodNode>)c.methods) {
|
||||
String mIdentifier = c.name+"."+m.name+m.desc;
|
||||
Object node = graph.insertVertex(parent, null, mIdentifier, testX, testY, mIdentifier.length() * magicNumber, 30);
|
||||
Object attach = node;
|
||||
testX += (int) (font.getStringBounds(mIdentifier, frc).getWidth()) + 60;
|
||||
for (AbstractInsnNode i : m.instructions.toArray()) {
|
||||
if (i instanceof MethodInsnNode) {
|
||||
MethodInsnNode mi = (MethodInsnNode) i;
|
||||
String identifier = mi.owner+"."+mi.name+mi.desc;
|
||||
Object node2 = graph.insertVertex(parent, null, identifier, testX, testY, identifier.length() * 5, 30);
|
||||
testX += (int) (font.getStringBounds(identifier, frc).getWidth()) + 60;
|
||||
graph.insertEdge(parent, null, null, attach, node2);
|
||||
attach = node2;
|
||||
}
|
||||
}
|
||||
testY += 60;
|
||||
testX = 10;
|
||||
}
|
||||
} finally {
|
||||
graph.getModel().endUpdate();
|
||||
}
|
||||
|
||||
mxGraphComponent graphComponent = new mxGraphComponent(graph);
|
||||
frame.getContentPane().add(graphComponent);
|
||||
frame.setVisible(true);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue