MainViewerGUI Refactoring

This commit is contained in:
Konloch 2021-06-21 13:19:46 -07:00
parent 57a3aaf608
commit 92e11150ee
5 changed files with 145 additions and 131 deletions

View file

@ -4,9 +4,7 @@ import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
@ -76,7 +74,15 @@ import static the.bytecode.club.bytecodeviewer.Constants.*;
public class MainViewerGUI extends JFrame implements FileChangeNotifier {
public static final long serialVersionUID = 1851409230530948543L;
private static ArrayList<VisibleComponent> rfComps = new ArrayList<>();
private static final ArrayList<VisibleComponent> rfComps = new ArrayList<>();
public AboutWindow aboutWindow = new AboutWindow();
public FileNavigationPane cn = new FileNavigationPane(this);
public SearchingPane s;
public boolean isMaximized;
public JSplitPane sp1;
public JSplitPane sp2;
public final JMenuItem[] waitIcons;
public final JSpinner fontSpinner = new JSpinner();
//the root menu bar
public final JMenuBar rootMenu = new JMenuBar();
@ -104,8 +110,6 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
public final ViewPane viewPane2 = new ViewPane(2);
public final ViewPane viewPane3 = new ViewPane(3);
//TODO settings main menu components
//all of the plugins main menu components
public final JMenu pluginsMainMenu = new JMenu("Plugins");
public final JMenuItem openExternalPlugin = new JMenuItem("Open Plugin...");
@ -120,9 +124,13 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
public final JMenuItem stackFramesRemover = new JMenuItem("StackFrames Remover");
public final JMenuItem zStringArrayDecrypter = new JMenuItem("ZStringArray Decrypter");
//all of the settings main menu components
private final JCheckBoxMenuItem chckbxmntmDeleteForeignOutdatedLibs = new JCheckBoxMenuItem("Delete Foreign/Outdated Libs");
public final ButtonGroup apkConversionGroup = new ButtonGroup();
public final JRadioButtonMenuItem apkConversionDex = new JRadioButtonMenuItem("Dex2Jar");
public final JRadioButtonMenuItem apkConversionEnjarify = new JRadioButtonMenuItem("Enjarify");
public JCheckBoxMenuItem debugHelpers = new JCheckBoxMenuItem("Debug Helpers");
public JSplitPane sp1;
public JSplitPane sp2;
public JCheckBoxMenuItem rbr = new JCheckBoxMenuItem("Hide bridge methods");
public JCheckBoxMenuItem rsy = new JCheckBoxMenuItem("Hide synthetic class members");
public JCheckBoxMenuItem din = new JCheckBoxMenuItem("Decompile inner classes");
@ -142,8 +150,6 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
public JCheckBoxMenuItem fdi = new JCheckBoxMenuItem("Deinline finally structures");
public JCheckBoxMenuItem asc = new JCheckBoxMenuItem("Allow only ASCII characters in strings");
public JCheckBoxMenuItem ren = new JCheckBoxMenuItem("Rename ambiguous classes and class elements");
public final JMenuItem[] waitIcons;
public final JMenu mnNewMenu_3 = new JMenu("CFR");
public final JMenu mnNewMenu_4 = new JMenu("Procyon");
public final JCheckBoxMenuItem decodeenumswitch = new JCheckBoxMenuItem("Decode Enum Switch");
@ -216,9 +222,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
public final JRadioButtonMenuItem strongObf = new JRadioButtonMenuItem("Strong Obfuscation");
public final JRadioButtonMenuItem lightObf = new JRadioButtonMenuItem("Light Obfuscation");
public final JMenuItem mntmNewMenuItem_11 = new JMenuItem("Rename Classes");
public final JMenu mnSettings = new JMenu("Settings");
public AboutWindow aboutWindow = new AboutWindow();
public final JMenu settingsMainMenu = new JMenu("Settings");
public final JCheckBoxMenuItem compileOnSave = new JCheckBoxMenuItem("Compile On Save");
public final JCheckBoxMenuItem showFileInTabTitle = new JCheckBoxMenuItem("Show File In Tab Title");
public final JCheckBoxMenuItem forcePureAsciiAsText = new JCheckBoxMenuItem("Force Pure Ascii As Text");
@ -228,12 +232,13 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
public final JCheckBoxMenuItem decodeAPKResources = new JCheckBoxMenuItem("Decode APK Resources");
public final JCheckBoxMenuItem synchronizedViewing = new JCheckBoxMenuItem("Synchronized Viewing");
public final JCheckBoxMenuItem showClassMethods = new JCheckBoxMenuItem("Show Class Methods");
public FileNavigationPane cn = new FileNavigationPane(this);
public SearchingPane s;
public boolean isMaximized = false;
public final JMenu visualSettings = new JMenu("Visual Settings");
public final JMenu mnApkConversion = new JMenu("APK Conversion");
public final JMenuItem mntmSetPythonx = new JMenuItem("Set Python 3.X Executable");
public final JMenuItem mntmSetOpitonalLibrary = new JMenuItem("Set Optional Library Folder");
public final JMenuItem mntmSetJavacExecutable = new JMenuItem("Set Javac Executable");
public final JMenu mnDecompilerSettings = new JMenu("FernFlower");
public final JMenu mnBytecodeDecompilerSettings = new JMenu("Bytecode Decompiler");
public void removed(boolean busy) {
if (busy) {
@ -249,8 +254,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
if (c instanceof WorkPane) {
WorkPane w = (WorkPane) c;
for (Component c2 : w.tabs.getComponents())
c2.setCursor(Cursor
.getPredefinedCursor(Cursor.WAIT_CURSOR));
c2.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
}
}
} else {
@ -266,20 +270,11 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
if (c instanceof WorkPane) {
WorkPane w = (WorkPane) c;
for (Component c2 : w.tabs.getComponents())
c2.setCursor(Cursor
.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
c2.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
}
}
public static class Test implements KeyEventDispatcher {
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
BytecodeViewer.checkHotKey(e);
return false;
}
}
public synchronized void setIcon(final boolean busy) {
SwingUtilities.invokeLater(() -> {
@ -307,12 +302,6 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
});
}
public final JSpinner fontSpinner = new JSpinner();
private final JCheckBoxMenuItem chckbxmntmDeleteForeignOutdatedLibs = new JCheckBoxMenuItem("Delete Foreign/Outdated Libs");
public final ButtonGroup apkConversionGroup = new ButtonGroup();
public final JRadioButtonMenuItem apkConversionDex = new JRadioButtonMenuItem("Dex2Jar");
public final JRadioButtonMenuItem apkConversionEnjarify = new JRadioButtonMenuItem("Enjarify");
public void calledAfterLoad() {
chckbxmntmDeleteForeignOutdatedLibs.setSelected(Configuration.deleteForeignLibraries);
}
@ -323,7 +312,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
public MainViewerGUI()
{
mnNewMenu_5.setVisible(false);
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new Test());
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatch());
this.addWindowStateListener(new WindowAdapter() {
@Override
public void windowStateChanged(WindowEvent evt) {
@ -360,42 +349,23 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
buildMenuBar();
buildFileMenuBar();
buildViewMenuBar();
buildSettingsMenuBar();
buildPluginMenuBar();
compileOnSave.setSelected(false);
rootMenu.add(mnSettings);
JMenu visualSettings = new JMenu("Visual Settings");
mnSettings.add(visualSettings);
mnSettings.add(new JSeparator());
mnSettings.add(compileOnSave);
compileOnSave.setSelected(false);
autoCompileOnRefresh.setSelected(false);
mnSettings.add(autoCompileOnRefresh);
mnSettings.add(refreshOnChange);
mnSettings.add(new JSeparator());
decodeAPKResources.setSelected(true);
mnSettings.add(decodeAPKResources);
JMenu mnApkConversion = new JMenu("APK Conversion");
mnSettings.add(mnApkConversion);
mnApkConversion.add(apkConversionDex);
mnApkConversion.add(apkConversionEnjarify);
mnSettings.add(new JSeparator());
chckbxmntmNewCheckItem_12.setSelected(true);
mnSettings.add(chckbxmntmNewCheckItem_12);
chckbxmntmDeleteForeignOutdatedLibs.addActionListener(arg0 -> {
if (!chckbxmntmDeleteForeignOutdatedLibs.isSelected()) {
BytecodeViewer.showMessage("WARNING: With this being toggled off outdated libraries will NOT be "
@ -403,37 +373,23 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
}
Configuration.deleteForeignLibraries = chckbxmntmDeleteForeignOutdatedLibs.isSelected();
});
mnSettings.add(forcePureAsciiAsText);
forcePureAsciiAsText.setSelected(true);
forcePureAsciiAsText.addActionListener(arg0 -> Settings.saveSettings());
mnSettings.add(new JSeparator());
/*chckbxmntmDeleteForeinoutdatedLibs.setSelected(true);
mnSettings.add(chckbxmntmDeleteForeinoutdatedLibs);
mnSettings.add(separator_36);*/
mntmSetPythonDirectory.addActionListener(arg0 -> selectPythonC());
mnSettings.add(mntmSetPythonDirectory);
mntmSetJreRt.addActionListener(arg0 -> selectJRERTLibrary());
JMenuItem mntmSetPythonx = new JMenuItem("Set Python 3.X Executable");
mntmSetPythonx.addActionListener(arg0 -> selectPythonC3());
mnSettings.add(mntmSetPythonx);
mnSettings.add(mntmSetJreRt);
JMenuItem mntmSetOpitonalLibrary = new JMenuItem("Set Optional Library Folder");
mntmSetOpitonalLibrary.addActionListener(arg0 -> selectOpenalLibraryFolder());
mnSettings.add(mntmSetOpitonalLibrary);
JMenuItem mntmSetJavacExecutable = new JMenuItem("Set Javac Executable");
mntmSetJavacExecutable.addActionListener(arg0 -> selectJavac());
mnSettings.add(mntmSetJavacExecutable);
mnSettings.add(new JSeparator());
mnSettings.add(mnNewMenu_4);
mnNewMenu_4.add(chckbxmntmNewCheckItem_6);
mnNewMenu_4.add(chckbxmntmNewCheckItem_11);
@ -507,7 +463,6 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
recoverytypehints.setSelected(true);
forceturningifs.setSelected(true);
forloopaggcapture.setSelected(true);
mnSettings.add(mnNewMenu_3);
mnNewMenu_3.add(decodeenumswitch);
@ -609,8 +564,6 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
asc.setSelected(false);
ren.setSelected(false);
JMenu mnDecompilerSettings = new JMenu("FernFlower");
mnSettings.add(mnDecompilerSettings);
dc4.setSelected(true);
mnDecompilerSettings.add(dc4);
nns.setSelected(true);
@ -641,9 +594,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
debugHelpers.setSelected(true);
// other
chckbxmntmAppendBrackets.setSelected(true);
JMenu mnBytecodeDecompilerSettings = new JMenu("Bytecode Decompiler");
mnSettings.add(mnBytecodeDecompilerSettings);
mnBytecodeDecompilerSettings.add(debugHelpers);
@ -699,25 +650,6 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
mntmNewMenuItem_10.setEnabled(false);
mnNewMenu_5.add(mntmNewMenuItem_10);
codeSequenceDiagram.addActionListener(arg0 -> {
if (BytecodeViewer.getLoadedClasses().isEmpty()) {
BytecodeViewer.showMessage("First open a class, jar, zip, apk or dex file.");
return;
}
PluginManager.runPlugin(new CodeSequenceDiagram());
});
replaceStrings.addActionListener(arg0 -> {
if (BytecodeViewer.getLoadedClasses().isEmpty()) {
BytecodeViewer.showMessage("First open a class, jar, zip, apk or dex file.");
return;
}
new ReplaceStringsOptions().setVisible(true);
});
zStringArrayDecrypter.addActionListener(arg0 -> PluginManager.runPlugin(new ZStringArrayDecrypter()));
stackFramesRemover.addActionListener(e -> PluginManager.runPlugin(new StackFramesRemover()));
waitIcons = new JMenuItem[10];
for (int i = 0; i < 10; i++) {
waitIcons[i] = new JMenuItem("");
@ -725,29 +657,8 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
waitIcons[i].setEnabled(false);
rootMenu.add(waitIcons[i]);
}
openExternalPlugin.addActionListener(arg0 -> {
JFileChooser fc = new JFileChooser();
fc.setFileFilter(PluginManager.fileFilter());
fc.setFileHidingEnabled(false);
fc.setAcceptAllFileFilterUsed(false);
int returnVal = fc.showOpenDialog(BytecodeViewer.viewer);
if (returnVal == JFileChooser.APPROVE_OPTION)
try {
BytecodeViewer.viewer.setIcon(true);
BytecodeViewer.startPlugin(fc.getSelectedFile());
BytecodeViewer.viewer.setIcon(false);
} catch (Exception e1) {
new ExceptionUI(e1);
}
});
ZKMStringDecrypter.addActionListener(e -> PluginManager.runPlugin(new ZKMStringDecrypter()));
allatoriStringDecrypter.addActionListener(e -> PluginManager.runPlugin(new AllatoriStringDecrypter()));
maliciousCodeScanner.addActionListener(e -> MaliciousCodeScannerOptions.showOptionPanel());
showAllStrings.addActionListener(e -> PluginManager.runPlugin(new ShowAllStrings()));
showMainMethods.addActionListener(e -> PluginManager.runPlugin(new ShowMainMethods()));
setSize(new Dimension(800, 400));
if (PREVIEW_COPY)
@ -866,6 +777,40 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
viewMainMenu.add(viewPane3.menu);
}
public void buildSettingsMenuBar()
{
rootMenu.add(settingsMainMenu);
settingsMainMenu.add(visualSettings);
settingsMainMenu.add(new JSeparator());
settingsMainMenu.add(compileOnSave);
settingsMainMenu.add(autoCompileOnRefresh);
settingsMainMenu.add(refreshOnChange);
settingsMainMenu.add(new JSeparator());
settingsMainMenu.add(decodeAPKResources);
settingsMainMenu.add(mnApkConversion);
mnApkConversion.add(apkConversionDex);
mnApkConversion.add(apkConversionEnjarify);
settingsMainMenu.add(new JSeparator());
settingsMainMenu.add(chckbxmntmNewCheckItem_12);
settingsMainMenu.add(forcePureAsciiAsText);
settingsMainMenu.add(new JSeparator());
settingsMainMenu.add(mntmSetPythonDirectory);
settingsMainMenu.add(mntmSetPythonx);
settingsMainMenu.add(mntmSetJreRt);
settingsMainMenu.add(mntmSetOpitonalLibrary);
settingsMainMenu.add(mntmSetJavacExecutable);
settingsMainMenu.add(new JSeparator());
settingsMainMenu.add(mnNewMenu_4);
settingsMainMenu.add(mnNewMenu_3);
settingsMainMenu.add(mnDecompilerSettings);
settingsMainMenu.add(mnBytecodeDecompilerSettings);
}
public void buildPluginMenuBar()
{
rootMenu.add(pluginsMainMenu);
@ -883,6 +828,17 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
//mnNewMenu_1.add(mntmNewMenuItem_2);
//mnNewMenu_1.add(mntmStartZkmString);
pluginsMainMenu.add(zStringArrayDecrypter);
openExternalPlugin.addActionListener(arg0 -> openExternalPlugin());
codeSequenceDiagram.addActionListener(arg0 -> CodeSequenceDiagram.open());
maliciousCodeScanner.addActionListener(e -> MaliciousCodeScannerOptions.open());
showMainMethods.addActionListener(e -> PluginManager.runPlugin(new ShowMainMethods()));
showAllStrings.addActionListener(e -> PluginManager.runPlugin(new ShowAllStrings()));
replaceStrings.addActionListener(arg0 -> ReplaceStringsOptions.open());
stackFramesRemover.addActionListener(e -> PluginManager.runPlugin(new StackFramesRemover()));
allatoriStringDecrypter.addActionListener(e -> PluginManager.runPlugin(new AllatoriStringDecrypter()));
ZKMStringDecrypter.addActionListener(e -> PluginManager.runPlugin(new ZKMStringDecrypter()));
zStringArrayDecrypter.addActionListener(arg0 -> PluginManager.runPlugin(new ZStringArrayDecrypter()));
}
@Override
@ -1161,6 +1117,24 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
}
}
public void openExternalPlugin()
{
JFileChooser fc = new JFileChooser();
fc.setFileFilter(PluginManager.fileFilter());
fc.setFileHidingEnabled(false);
fc.setAcceptAllFileFilterUsed(false);
int returnVal = fc.showOpenDialog(BytecodeViewer.viewer);
if (returnVal == JFileChooser.APPROVE_OPTION)
try {
BytecodeViewer.viewer.setIcon(true);
BytecodeViewer.startPlugin(fc.getSelectedFile());
BytecodeViewer.viewer.setIcon(false);
} catch (Exception e1) {
new ExceptionUI(e1);
}
}
public void askBeforeExiting()
{
JOptionPane pane = new JOptionPane(

View file

@ -36,7 +36,7 @@ import the.bytecode.club.bytecodeviewer.plugin.preinstalled.MaliciousCodeScanner
*/
public class MaliciousCodeScannerOptions extends JFrame {
public static void showOptionPanel()
public static void open()
{
if (BytecodeViewer.getLoadedClasses().isEmpty()) {
BytecodeViewer.showMessage("First open a class, jar, zip, apk or dex file.");

View file

@ -6,6 +6,8 @@ import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
import the.bytecode.club.bytecodeviewer.Resources;
import the.bytecode.club.bytecodeviewer.plugin.PluginManager;
import the.bytecode.club.bytecodeviewer.plugin.preinstalled.ReplaceStrings;
@ -35,6 +37,15 @@ import the.bytecode.club.bytecodeviewer.plugin.preinstalled.ReplaceStrings;
*/
public class ReplaceStringsOptions extends JFrame {
public static void open()
{
if (BytecodeViewer.getLoadedClasses().isEmpty()) {
BytecodeViewer.showMessage("First open a class, jar, zip, apk or dex file.");
return;
}
new ReplaceStringsOptions().setVisible(true);
}
public ReplaceStringsOptions() {
this.setIconImages(Resources.iconList);
setSize(new Dimension(250, 176));

View file

@ -16,6 +16,7 @@ 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;
import the.bytecode.club.bytecodeviewer.plugin.PluginManager;
/***************************************************************************
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
@ -42,7 +43,16 @@ import the.bytecode.club.bytecodeviewer.gui.ClassViewer;
*/
public class CodeSequenceDiagram extends Plugin {
public static void open()
{
if (BytecodeViewer.getLoadedClasses().isEmpty())
{
BytecodeViewer.showMessage("First open a class, jar, zip, apk or dex file.");
return;
}
PluginManager.runPlugin(new CodeSequenceDiagram());
}
@Override
public void execute(ArrayList<ClassNode> classNodeList) {
if (BytecodeViewer.viewer.workPane.getCurrentViewer() == null || !(BytecodeViewer.viewer.workPane.getCurrentViewer() instanceof ClassViewer)) {

View file

@ -0,0 +1,19 @@
package the.bytecode.club.bytecodeviewer.util;
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
import java.awt.*;
import java.awt.event.KeyEvent;
/**
* @author Konloch
* @since 6/21/2021
*/
public class KeyEventDispatch implements KeyEventDispatcher
{
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
BytecodeViewer.checkHotKey(e);
return false;
}
}