Code Cleanup

This commit is contained in:
Konloch 2021-06-21 17:46:57 -07:00
parent 47d8222f2e
commit 85197c9739
16 changed files with 340 additions and 271 deletions

View file

@ -24,7 +24,7 @@ import the.bytecode.club.bootloader.Boot;
import the.bytecode.club.bytecodeviewer.api.ClassNodeLoader;
import the.bytecode.club.bytecodeviewer.compilers.Compilers;
import the.bytecode.club.bytecodeviewer.gui.ClassViewer;
import the.bytecode.club.bytecodeviewer.gui.ResourceListPane;
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.ResourceListPane;
import the.bytecode.club.bytecodeviewer.gui.MainViewerGUI;
import the.bytecode.club.bytecodeviewer.gui.extras.RunOptions;
import the.bytecode.club.bytecodeviewer.gui.SearchBoxPane;
@ -104,6 +104,7 @@ public class BytecodeViewer
public static Refactorer refactorer = new Refactorer();
public static List<FileContainer> files = new ArrayList<>(); //all of BCV's loaded files/classes/etc
public static List<Process> createdProcesses = new ArrayList<>();
public static final boolean EXPERIMENTAL_DRAG_TABS = false;
/**
* The version checker thread

View file

@ -32,6 +32,7 @@ import the.bytecode.club.bytecodeviewer.gui.extras.AboutWindow;
import the.bytecode.club.bytecodeviewer.gui.extras.RunOptions;
import the.bytecode.club.bytecodeviewer.gui.plugins.MaliciousCodeScannerOptions;
import the.bytecode.club.bytecodeviewer.gui.plugins.ReplaceStringsOptions;
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.ResourceListPane;
import the.bytecode.club.bytecodeviewer.obfuscators.rename.RenameClasses;
import the.bytecode.club.bytecodeviewer.obfuscators.rename.RenameFields;
import the.bytecode.club.bytecodeviewer.obfuscators.rename.RenameMethods;

View file

@ -47,7 +47,6 @@ import static the.bytecode.club.bytecodeviewer.gui.TabbedPane.BLANK;
* @author Konloch
* @author DreamSworK
*/
public abstract class PaneUpdaterThread extends Thread {
public ClassViewer viewer;
public RSyntaxTextArea panelArea;
@ -62,8 +61,8 @@ public abstract class PaneUpdaterThread extends Thread {
public void run() {
doShit();
synchronizePane();
attachCtrlMouseWheelZoom(scrollPane, panelArea); //freezes the UI for some reason, probably cause BCV is
// doing dumb shit with the swing thread
attachCtrlMouseWheelZoom(scrollPane, panelArea); //freezes the UI for some reason
//probably cause BCV is doing dumb shit with the swing thread
}
public void attachCtrlMouseWheelZoom(RTextScrollPane scrollPane, RSyntaxTextArea panelArea) {

View file

@ -18,6 +18,7 @@ import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import org.objectweb.asm.tree.ClassNode;
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.ResourceListPane;
import the.bytecode.club.bytecodeviewer.searching.BackgroundSearchThread;
import the.bytecode.club.bytecodeviewer.searching.FieldCallSearch;
import the.bytecode.club.bytecodeviewer.searching.LDCSearch;

View file

@ -14,14 +14,7 @@ import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JTabbedPane;
import javax.swing.*;
import javax.swing.plaf.basic.BasicButtonUI;
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
@ -55,6 +48,8 @@ public class TabbedPane extends JPanel {
public static final Color BLANK = new Color(0, 0, 0, 0);
private final JTabbedPane pane;
public final JLabel label;
private DelayTabbedPaneThread probablyABadIdea;
private long startedDragging = 0;
private static long zero = System.currentTimeMillis();
public String tabName;
public String fileContainerName;
@ -159,48 +154,40 @@ public class TabbedPane extends JPanel {
public void mouseReleased(MouseEvent e) {
}
});
/*this.addMouseListener(new MouseListener() {
@Override public void mouseClicked(MouseEvent e) {}
@Override public void mouseEntered(MouseEvent arg0) {
}
@Override public void mouseExited(MouseEvent arg0) {
}
@Override public void mousePressed(MouseEvent e) {
if(e.getButton() == 1)
{
startedDragging = System.currentTimeMillis();
dragging = true;
if (probablyABadIdea != null)
{
probablyABadIdea.stopped = true;
}
probablyABadIdea = new DelayTabbedPaneThread(THIS);
probablyABadIdea.start();
repaint();
System.out.println(e.getX()+", "+e.getY());
Rectangle bounds = new Rectangle(1, 1, e.getX(), e.getY());
for(int i = 0; i < BytecodeViewer.viewer.workPane.tabs.getTabCount(); i++)
{
Component c = BytecodeViewer.viewer.workPane.tabs.getTabComponentAt(i);
if(c != null && bounds.intersects(c.getBounds()))
{
BytecodeViewer.viewer.workPane.tabs.setSelectedIndex(i);
}
}
if(BytecodeViewer.EXPERIMENTAL_DRAG_TABS)
{
/*label.addMouseListener(new MouseListener() {
@Override public void mouseClicked(MouseEvent e) {}
@Override public void mouseEntered(MouseEvent arg0) {
}
else
{
@Override public void mouseExited(MouseEvent arg0) {
}
@Override public void mousePressed(MouseEvent e) {
onMousePressed(e);
}
@Override public void mouseReleased(MouseEvent e) {
stopDragging(e.getX(), e.getY());
}
}
@Override public void mouseReleased(MouseEvent e) {
stopDragging(e.getX(), e.getY());
}
});*/
});*/
this.addMouseListener(new MouseListener() {
@Override public void mouseClicked(MouseEvent e) {}
@Override public void mouseEntered(MouseEvent arg0) {
}
@Override public void mouseExited(MouseEvent arg0) {
}
@Override public void mousePressed(MouseEvent e) {
onMousePressed(e);
}
@Override public void mouseReleased(MouseEvent e) {
stopDragging(e.getX(), e.getY());
}
});
}
}
private void stopDragging(int mouseX, int mouseY) {
long startedDragging = 0;
if (System.currentTimeMillis() - startedDragging >= 210) {
Rectangle bounds = new Rectangle(1, 1, mouseX, mouseY);
System.out.println("debug-5: " + mouseX + ", " + mouseY);
@ -228,8 +215,43 @@ public class TabbedPane extends JPanel {
BytecodeViewer.viewer.workPane.tabs.setTabComponentAt(index, this);
}
}
label.setBackground(BLANK);
label.updateUI();
SwingUtilities.invokeLater(() ->
{
label.setBackground(BLANK);
label.updateUI();
});
}
public void onMousePressed(MouseEvent e)
{
BytecodeViewer.viewer.workPane.tabs.dispatchEvent(e);
if(e.getButton() == 1)
{
startedDragging = System.currentTimeMillis();
//dragging = true;
if (probablyABadIdea != null)
{
probablyABadIdea.stopped = true;
}
probablyABadIdea = new DelayTabbedPaneThread(TabbedPane.this);
probablyABadIdea.start();
repaint();
System.out.println(e.getX()+", "+e.getY());
Rectangle bounds = new Rectangle(1, 1, e.getX(), e.getY());
for(int i = 0; i < BytecodeViewer.viewer.workPane.tabs.getTabCount(); i++)
{
Component c = BytecodeViewer.viewer.workPane.tabs.getTabComponentAt(i);
if(c != null && bounds.intersects(c.getBounds()))
{
BytecodeViewer.viewer.workPane.tabs.setSelectedIndex(i);
}
}
}
else
{
stopDragging(e.getX(), e.getY());
}
}
private class TabButton extends JButton implements ActionListener {

View file

@ -37,10 +37,12 @@ import static the.bytecode.club.bytecodeviewer.Constants.*;
* @author Konloch
*/
public class AboutWindow extends JFrame {
public class AboutWindow extends JFrame
{
JTextArea textArea = new JTextArea();
public AboutWindow() {
public AboutWindow()
{
this.setIconImages(Resources.iconList);
setSize(Toolkit.getDefaultToolkit().getScreenSize());
setType(Type.UTILITY);
@ -57,12 +59,13 @@ public class AboutWindow extends JFrame {
}
@Override
public void setVisible(boolean b) {
public void setVisible(boolean b)
{
super.setVisible(b);
textArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int) BytecodeViewer.viewer.fontSpinner.getValue()));
textArea.setText("Bytecode Viewer " + VERSION + " is an open source program developed and "
+ "maintained by Konloch (konloch@gmail.com) 100% free and open sourced licensed under GPL v3 "
+ "CopyLeft\r\n\r\n" +
textArea.setText("Bytecode Viewer " + VERSION + " is an open source program developed and " +
"maintained by Konloch (konloch@gmail.com) 100% free and open sourced licensed under GPL v3 " +
"CopyLeft" + nl + nl +
"Settings:" + nl +
" Preview Copy: " + PREVIEW_COPY + nl +
" Fat Jar: " + FAT_JAR + nl +
@ -81,11 +84,11 @@ public class AboutWindow extends JFrame {
" -help Displays the help menu" + nl +
" -list Displays the available decompilers" + nl +
" -decompiler <decompiler> Selects the decompiler, procyon by default" + nl +
" -i <input file> Selects the input file (Jar, Class, APK, ZIP, DEX all work "
+ "automatically)" + nl +
" -i <input file> Selects the input file (Jar, Class, APK, ZIP, DEX all work " +
"automatically)" + nl +
" -o <output file> Selects the output file (Java or Java-Bytecode)" + nl +
" -t <target classname> Must either be the fully qualified classname or \"all\" to decompile"
+ " all as zip" + nl +
" -t <target classname> Must either be the fully qualified classname or \"all\" to decompile" +
" all as zip" + nl +
" -nowait Doesn't wait for the user to read the CLI messages" + nl + nl +
"Keybinds:" + nl +
" CTRL + O: Open/add new jar/class/apk" + nl +
@ -94,13 +97,13 @@ public class AboutWindow extends JFrame {
" CTRL + T: Compile" + nl +
" CTRL + S: Save classes as zip" + nl +
" CTRL + R: Run (EZ-Inject) - dynamically load the classes and invoke a main class" +
"\r\n\r\nCode from various projects has been used, including but not limited to:\r\n J-RET by "
+ "WaterWolf\r\n JHexPane by Sam Koivu\r\n RSynaxPane by Robert Futrell\r\n Commons IO by "
+ "Apache\r\n ASM by OW2\r\n FernFlower by Stiver\r\n Procyon by Mstrobel\r\n CFR by Lee "
+ "Benfield\r\n CFIDE by Bibl\r\n Smali by JesusFreke\r\n Dex2Jar by pxb1..?\r\n Krakatau by "
+ "Storyyeller\r\n JD-GUI + JD-Core by The Java-Decompiler Team\r\n Enjarify by "
+ "Storyyeller\r\n\r\nIf you're interested in Java Reverse Engineering, join The Bytecode Club - "
+ "https://the.bytecode.club");
"\r\n\r\nCode from various projects has been used, including but not limited to:\r\n J-RET by " +
"WaterWolf\r\n JHexPane by Sam Koivu\r\n RSynaxPane by Robert Futrell\r\n Commons IO by " +
"Apache\r\n ASM by OW2\r\n FernFlower by Stiver\r\n Procyon by Mstrobel\r\n CFR by Lee " +
"Benfield\r\n CFIDE by Bibl\r\n Smali by JesusFreke\r\n Dex2Jar by pxb1..?\r\n Krakatau by " +
"Storyyeller\r\n JD-GUI + JD-Core by The Java-Decompiler Team\r\n Enjarify by " +
"Storyyeller\r\n\r\nIf you're interested in Java Reverse Engineering, join The Bytecode Club - " +
"https://the.bytecode.club");
}

View file

@ -34,8 +34,10 @@ import the.bytecode.club.bytecodeviewer.util.JarUtils;
* @author Konloch
*/
public class ExportJar extends JFrame {
public ExportJar(final String jarPath) {
public class ExportJar extends JFrame
{
public ExportJar(final String jarPath)
{
setSize(new Dimension(250, 277));
setResizable(false);
setTitle("Save As Jar..");
@ -44,14 +46,12 @@ public class ExportJar extends JFrame {
btnNewButton.setMaximumSize(new Dimension(999, 23));
btnNewButton.setMinimumSize(new Dimension(999, 23));
btnNewButton.setSize(new Dimension(999, 0));
getContentPane().setLayout(
new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
JScrollPane scrollPane = new JScrollPane();
getContentPane().add(scrollPane);
JLabel lblMetainfmanifestmf = new JLabel("META-INF/MANIFEST.MF:");
scrollPane.setColumnHeaderView(lblMetainfmanifestmf);
scrollPane.setColumnHeaderView(new JLabel("META-INF/MANIFEST.MF:"));
final JTextArea mani = new JTextArea();
mani.setText("Manifest-Version: 1.0\r\nClass-Path: .\r\nMain-Class: ");
@ -61,8 +61,7 @@ public class ExportJar extends JFrame {
btnNewButton.addActionListener(arg0 -> {
BytecodeViewer.viewer.updateBusyStatus(true);
Thread t = new Thread(() -> {
JarUtils.saveAsJar(BytecodeViewer.getLoadedClasses(), jarPath,
mani.getText());
JarUtils.saveAsJar(BytecodeViewer.getLoadedClasses(), jarPath, mani.getText());
BytecodeViewer.viewer.updateBusyStatus(false);
});
t.start();
@ -73,4 +72,4 @@ public class ExportJar extends JFrame {
}
private static final long serialVersionUID = -2662514582647810868L;
}
}

View file

@ -0,0 +1,31 @@
package the.bytecode.club.bytecodeviewer.gui.extras;
import javax.swing.*;
import java.io.IOException;
import java.io.OutputStream;
/**
* @author Konloch
* @since 6/21/2021
*/
public class JTextAreaOutputStream extends OutputStream
{
private final StringBuilder sb = new StringBuilder();
private final JTextArea textArea;
public JTextAreaOutputStream(JTextArea textArea)
{
this.textArea = textArea;
}
public void update()
{
textArea.append(sb.toString());
}
@Override
public void write(int b) throws IOException
{
sb.append((char) b);
}
}

View file

@ -45,8 +45,7 @@ public class RunOptions extends JFrame {
setTitle("Run Options");
getContentPane().setLayout(null);
final JCheckBox accessModifiers = new JCheckBox(
"Set All Access Modifiers Public");
final JCheckBox accessModifiers = new JCheckBox("Set All Access Modifiers Public");
accessModifiers.setBounds(6, 7, 232, 23);
getContentPane().add(accessModifiers);
@ -74,8 +73,7 @@ public class RunOptions extends JFrame {
for (Object o : classNode.methods.toArray()) {
MethodNode m = (MethodNode) o;
if (m.name.equals("main")
&& m.desc.equals("([Ljava/lang/String;)V")) {
if (m.name.equals("main") && m.desc.equals("([Ljava/lang/String;)V")) {
if (!b) {
b = true;
txtThebytecodeclubexamplemainlstring
@ -86,8 +84,7 @@ public class RunOptions extends JFrame {
}
if (!b)
txtThebytecodeclubexamplemainlstring
.setText("the/bytecode/club/Example.main");
txtThebytecodeclubexamplemainlstring.setText("the/bytecode/club/Example.main");
txtThebytecodeclubexamplemainlstring.setBounds(6, 233, 232, 20);
getContentPane().add(txtThebytecodeclubexamplemainlstring);
@ -109,13 +106,11 @@ public class RunOptions extends JFrame {
textField_1.setBounds(6, 172, 232, 20);
getContentPane().add(textField_1);
final JCheckBox forceProxy = new JCheckBox(
"Force Proxy (socks5, host:port):");
final JCheckBox forceProxy = new JCheckBox("Force Proxy (socks5, host:port):");
forceProxy.setBounds(6, 142, 232, 23);
getContentPane().add(forceProxy);
final JCheckBox launchReflectionKit = new JCheckBox(
"Launch Reflection Kit On Successful Invoke");
final JCheckBox launchReflectionKit = new JCheckBox("Launch Reflection Kit On Successful Invoke");
launchReflectionKit.setEnabled(false);
launchReflectionKit.setBounds(6, 260, 232, 23);
getContentPane().add(launchReflectionKit);
@ -125,8 +120,7 @@ public class RunOptions extends JFrame {
console.setSelected(true);
getContentPane().add(console);
final JCheckBox chckbxPrintToTerminal = new JCheckBox(
"Print To Command Line");
final JCheckBox chckbxPrintToTerminal = new JCheckBox("Print To Command Line");
chckbxPrintToTerminal.setSelected(true);
chckbxPrintToTerminal.setBounds(6, 315, 232, 23);
getContentPane().add(chckbxPrintToTerminal);

View file

@ -5,8 +5,6 @@ import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import javax.swing.JButton;
import javax.swing.JCheckBox;
@ -47,16 +45,18 @@ import static the.bytecode.club.bytecodeviewer.Constants.*;
* @author Konloch
*/
public class SystemErrConsole extends JFrame {
JTextArea textArea = new JTextArea();
JPanel panel = new JPanel(new BorderLayout());
JScrollPane scrollPane = new JScrollPane();
public JCheckBox check = new JCheckBox("Exact");
final JTextField field = new JTextField();
public class SystemErrConsole extends JFrame
{
private final JTextArea textArea = new JTextArea();
private final JPanel panel = new JPanel(new BorderLayout());
private final JScrollPane scrollPane = new JScrollPane();
private final JCheckBox check = new JCheckBox("Exact");
private final JTextField field = new JTextField();
private final PrintStream originalOut;
private final JTextAreaOutputStream s;
public SystemErrConsole(String title) {
public SystemErrConsole(String title)
{
this.setIconImages(Resources.iconList);
setTitle(title);
setSize(new Dimension(542, 316));
@ -64,7 +64,8 @@ public class SystemErrConsole extends JFrame {
getContentPane().add(scrollPane, BorderLayout.CENTER);
scrollPane.setViewportView(textArea);
textArea.addKeyListener(new KeyListener() {
textArea.addKeyListener(new KeyListener()
{
@Override
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
@ -113,14 +114,12 @@ public class SystemErrConsole extends JFrame {
});
scrollPane.setColumnHeaderView(panel);
this.setLocationRelativeTo(null);
s = new CustomOutputStream(textArea);
s = new JTextAreaOutputStream(textArea);
PrintStream printStream = new PrintStream(s);
originalOut = System.err;
System.setErr(printStream);
}
CustomOutputStream s;
public void finished() {
if (originalOut != null)
System.setErr(originalOut);
@ -294,24 +293,6 @@ public class SystemErrConsole extends JFrame {
textArea.setText(t);
textArea.setCaretPosition(0);
}
static class CustomOutputStream extends OutputStream {
private final StringBuilder sb = new StringBuilder();
private final JTextArea textArea;
public CustomOutputStream(JTextArea textArea) {
this.textArea = textArea;
}
public void update() {
textArea.append(sb.toString());
}
@Override
public void write(int b) throws IOException {
sb.append((char) b);
}
}
private static final long serialVersionUID = -6556940545421437508L;
}

View file

@ -31,8 +31,10 @@ import the.bytecode.club.bytecodeviewer.Resources;
* @author Konloch
*/
public class GraphicalReflectionKit extends JFrame {
public GraphicalReflectionKit() {
public class GraphicalReflectionKit extends JFrame
{
public GraphicalReflectionKit()
{
this.setIconImages(Resources.iconList);
setSize(new Dimension(382, 356));
setTitle("Graphical Reflection Kit");

View file

@ -35,7 +35,8 @@ import the.bytecode.club.bytecodeviewer.plugin.preinstalled.MaliciousCodeScanner
* @author Adrianherrera
*/
public class MaliciousCodeScannerOptions extends JFrame {
public class MaliciousCodeScannerOptions extends JFrame
{
public static void open()
{
if (BytecodeViewer.getLoadedClasses().isEmpty()) {
@ -44,15 +45,16 @@ public class MaliciousCodeScannerOptions extends JFrame {
}
new MaliciousCodeScannerOptions().setVisible(true);
}
public MaliciousCodeScannerOptions() {
public MaliciousCodeScannerOptions()
{
this.setIconImages(Resources.iconList);
setSize(new Dimension(250, 323));
setResizable(false);
setTitle("Malicious Code Scanner Options");
getContentPane().setLayout(null);
final JCheckBox chckbxJavalangreflection = new JCheckBox(
"java/lang/reflection");
final JCheckBox chckbxJavalangreflection = new JCheckBox("java/lang/reflection");
chckbxJavalangreflection.setSelected(true);
chckbxJavalangreflection.setBounds(6, 7, 232, 23);
getContentPane().add(chckbxJavalangreflection);
@ -66,38 +68,32 @@ public class MaliciousCodeScannerOptions extends JFrame {
chckbxJavaio.setBounds(6, 104, 232, 23);
getContentPane().add(chckbxJavaio);
final JCheckBox chckbxJavalangruntime = new JCheckBox(
"java/lang/Runtime");
final JCheckBox chckbxJavalangruntime = new JCheckBox("java/lang/Runtime");
chckbxJavalangruntime.setSelected(true);
chckbxJavalangruntime.setBounds(6, 33, 232, 23);
getContentPane().add(chckbxJavalangruntime);
final JCheckBox chckbxLdcContainswww = new JCheckBox(
"LDC contains 'www.'");
final JCheckBox chckbxLdcContainswww = new JCheckBox("LDC contains 'www.'");
chckbxLdcContainswww.setSelected(true);
chckbxLdcContainswww.setBounds(6, 130, 232, 23);
getContentPane().add(chckbxLdcContainswww);
final JCheckBox chckbxLdcContainshttp = new JCheckBox(
"LDC contains 'http://'");
final JCheckBox chckbxLdcContainshttp = new JCheckBox("LDC contains 'http://'");
chckbxLdcContainshttp.setSelected(true);
chckbxLdcContainshttp.setBounds(6, 156, 232, 23);
getContentPane().add(chckbxLdcContainshttp);
final JCheckBox chckbxLdcContainshttps = new JCheckBox(
"LDC contains 'https://'");
final JCheckBox chckbxLdcContainshttps = new JCheckBox("LDC contains 'https://'");
chckbxLdcContainshttps.setSelected(true);
chckbxLdcContainshttps.setBounds(6, 182, 232, 23);
getContentPane().add(chckbxLdcContainshttps);
final JCheckBox chckbxLdcMatchesIp = new JCheckBox(
"LDC matches IP regex");
final JCheckBox chckbxLdcMatchesIp = new JCheckBox("LDC matches IP regex");
chckbxLdcMatchesIp.setSelected(true);
chckbxLdcMatchesIp.setBounds(6, 208, 232, 23);
getContentPane().add(chckbxLdcMatchesIp);
final JCheckBox chckbxNullSecMan = new JCheckBox(
"SecurityManager set to null");
final JCheckBox chckbxNullSecMan = new JCheckBox("SecurityManager set to null");
chckbxNullSecMan.setSelected(true);
chckbxNullSecMan.setBounds(6, 234, 232, 23);
getContentPane().add(chckbxNullSecMan);

View file

@ -36,17 +36,19 @@ import the.bytecode.club.bytecodeviewer.plugin.preinstalled.ReplaceStrings;
* @author Konloch
*/
public class ReplaceStringsOptions extends JFrame {
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() {
public ReplaceStringsOptions()
{
this.setIconImages(Resources.iconList);
setSize(new Dimension(250, 176));
setResizable(false);
@ -61,49 +63,48 @@ public class ReplaceStringsOptions extends JFrame {
lblNewLabel.setBounds(6, 40, 67, 14);
getContentPane().add(lblNewLabel);
textField = new JTextField();
textField.setBounds(80, 37, 158, 20);
getContentPane().add(textField);
textField.setColumns(10);
originalLDC = new JTextField();
originalLDC.setBounds(80, 37, 158, 20);
getContentPane().add(originalLDC);
originalLDC.setColumns(10);
JLabel lblNewLabel_1 = new JLabel("New LDC:");
lblNewLabel_1.setBounds(6, 65, 77, 14);
getContentPane().add(lblNewLabel_1);
textField_1 = new JTextField();
textField_1.setColumns(10);
textField_1.setBounds(80, 62, 158, 20);
getContentPane().add(textField_1);
newLDC = new JTextField();
newLDC.setColumns(10);
newLDC.setBounds(80, 62, 158, 20);
getContentPane().add(newLDC);
JLabel lblNewLabel_2 = new JLabel("Class:");
lblNewLabel_2.setBounds(6, 90, 46, 14);
getContentPane().add(lblNewLabel_2);
textField_2 = new JTextField();
textField_2.setToolTipText("* will search all classes");
textField_2.setText("*");
textField_2.setBounds(80, 87, 158, 20);
getContentPane().add(textField_2);
textField_2.setColumns(10);
classToReplaceIn = new JTextField();
classToReplaceIn.setToolTipText("* will search all classes");
classToReplaceIn.setText("*");
classToReplaceIn.setBounds(80, 87, 158, 20);
getContentPane().add(classToReplaceIn);
classToReplaceIn.setColumns(10);
final JCheckBox chckbxNewCheckBox = new JCheckBox(
"Replace All Contains");
chckbxNewCheckBox
.setToolTipText("If it's unticked, it will check if the string equals, if its ticked it will check if"
final JCheckBox chckbxNewCheckBox = new JCheckBox("Replace All Contains");
chckbxNewCheckBox.setToolTipText("If it's unticked, it will check if the string equals, if its ticked it will check if"
+ " it contains, then replace the original LDC part of the string.");
chckbxNewCheckBox.setBounds(6, 7, 232, 23);
getContentPane().add(chckbxNewCheckBox);
btnNewButton.addActionListener(arg0 -> {
PluginManager.runPlugin(new ReplaceStrings(textField.getText(),
textField_1.getText(), textField_2.getText(),
PluginManager.runPlugin(new ReplaceStrings(originalLDC.getText(),
newLDC.getText(), classToReplaceIn.getText(),
chckbxNewCheckBox.isSelected()));
dispose();
});
this.setLocationRelativeTo(null);
}
private static final long serialVersionUID = -2662514582647810868L;
private final JTextField textField;
private final JTextField textField_1;
private final JTextField textField_2;
private final JTextField originalLDC;
private final JTextField newLDC;
private final JTextField classToReplaceIn;
}

View file

@ -0,0 +1,141 @@
package the.bytecode.club.bytecodeviewer.gui.resourceviewer;
import the.bytecode.club.bytecodeviewer.Resources;
import javax.swing.*;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeNode;
import java.awt.*;
import java.util.ArrayList;
/**
* @author http://stackoverflow.com/questions/14968005
* @author Konloch
*/
public class ImageRenderer extends DefaultTreeCellRenderer
{
//called every time there is a pane update, I.E. whenever you expand a folder
@Override
public Component getTreeCellRendererComponent(
JTree tree, Object value,
boolean sel, boolean expanded, boolean leaf,
int row, boolean hasFocus)
{
Component ret = super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
if (value instanceof ResourceListPane.MyTreeNode)
{
ResourceListPane.MyTreeNode node = (ResourceListPane.MyTreeNode) value;
String name = node.toString().toLowerCase();
if (name.endsWith(".jar") || name.endsWith(".war"))
{
setIcon(Resources.jarIcon);
}
else if (name.endsWith(".zip"))
{
setIcon(Resources.zipIcon);
}
else if (name.endsWith(".bat"))
{
setIcon(Resources.batIcon);
}
else if (name.endsWith(".sh"))
{
setIcon(Resources.shIcon);
}
else if (name.endsWith(".cs"))
{
setIcon(Resources.csharpIcon);
}
else if (name.endsWith(".c") || name.endsWith(".cpp") || name.endsWith(".h"))
{
setIcon(Resources.cplusplusIcon);
}
else if (name.endsWith(".apk") || name.endsWith(".dex"))
{
setIcon(Resources.androidIcon);
}
else if (name.endsWith(".png") || name.endsWith(".jpg") || name.endsWith(".jpeg")
|| name.endsWith(".bmp") || name.endsWith(".gif"))
{
setIcon(Resources.imageIcon);
}
else if (name.endsWith(".class"))
{
setIcon(Resources.classIcon);
}
else if (name.endsWith(".java"))
{
setIcon(Resources.javaIcon);
}
else if (name.endsWith(".txt") || name.endsWith(".md"))
{
setIcon(Resources.textIcon);
}
else if (name.equals("decoded resources"))
{
setIcon(Resources.decodedIcon);
}
else if (name.endsWith(".properties") || name.endsWith(".xml") || name.endsWith(".jsp")
|| name.endsWith(".mf") || name.endsWith(".config") || name.endsWith(".cfg"))
{
setIcon(Resources.configIcon);
}
else if (node.getChildCount() <= 0)
{ //random file
setIcon(Resources.fileIcon);
}
else
{ //folder
ArrayList<TreeNode> nodes = new ArrayList<>();
ArrayList<TreeNode> totalNodes = new ArrayList<>();
nodes.add(node);
totalNodes.add(node);
boolean isJava = false;
boolean finished = false;
while (!finished)
{ //may cause a clusterfuck with huge files
if (nodes.isEmpty())
finished = true;
else
{
TreeNode treeNode = nodes.get(0);
nodes.remove(treeNode);
int children = treeNode.getChildCount();
if (children >= 1)
for (int i = 0; i < children; i++)
{
TreeNode child = treeNode.getChildAt(i);
if (!totalNodes.contains(child))
{
nodes.add(child);
totalNodes.add(child);
}
if (child.toString().endsWith(".class"))
isJava = true;
}
if (isJava)
nodes.clear();
}
}
if (isJava)
setIcon(Resources.packagesIcon);
else
{
setIcon(Resources.folderIcon);
}
}
}
return ret;
}
}

View file

@ -1,10 +1,9 @@
package the.bytecode.club.bytecodeviewer.gui;
package the.bytecode.club.bytecodeviewer.gui.resourceviewer;
//TODO fix for Java 9+
import com.sun.java.swing.plaf.windows.WindowsTreeUI;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
@ -19,7 +18,6 @@ import java.awt.event.MouseEvent;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.io.File;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.Map.Entry;
@ -33,13 +31,12 @@ import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import org.objectweb.asm.tree.ClassNode;
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
import the.bytecode.club.bytecodeviewer.Resources;
import the.bytecode.club.bytecodeviewer.gui.VisibleComponent;
import the.bytecode.club.bytecodeviewer.util.FileContainer;
import the.bytecode.club.bytecodeviewer.util.FileDrop;
import the.bytecode.club.bytecodeviewer.util.LazyNameUtil;
@ -641,104 +638,4 @@ public class ResourceListPane extends VisibleComponent implements FileDrop.Liste
BytecodeViewer.getFileContents(nameBuffer.toString()));
}
}
/**
* @author http://stackoverflow.com/questions/14968005
* @author Konloch
*/
public static class ImageRenderer extends DefaultTreeCellRenderer {
@Override
public Component getTreeCellRendererComponent(
JTree tree,
Object value,
boolean sel,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus) { //called every time there is a pane update, I.E. whenever you expand a folder
Component ret = super.getTreeCellRendererComponent(tree, value,
selected, expanded, leaf, row, hasFocus);
if (value instanceof MyTreeNode) {
ResourceListPane.MyTreeNode node =
(ResourceListPane.MyTreeNode) value;
String name = node.toString().toLowerCase();
if (name.endsWith(".jar") || name.endsWith(".war")) {
setIcon(Resources.jarIcon);
} else if (name.endsWith(".zip")) {
setIcon(Resources.zipIcon);
} else if (name.endsWith(".bat")) {
setIcon(Resources.batIcon);
} else if (name.endsWith(".sh")) {
setIcon(Resources.shIcon);
} else if (name.endsWith(".cs")) {
setIcon(Resources.csharpIcon);
} else if (name.endsWith(".c") || name.endsWith(".cpp") || name.endsWith(".h")) {
setIcon(Resources.cplusplusIcon);
} else if (name.endsWith(".apk") || name.endsWith(".dex")) {
setIcon(Resources.androidIcon);
} else if (name.endsWith(".png") || name.endsWith(".jpg") || name.endsWith(".jpeg") || name.endsWith(
".bmp") || name.endsWith(".gif")) {
setIcon(Resources.imageIcon);
} else if (name.endsWith(".class")) {
setIcon(Resources.classIcon);
} else if (name.endsWith(".java")) {
setIcon(Resources.javaIcon);
} else if (name.endsWith(".txt") || name.endsWith(".md")) {
setIcon(Resources.textIcon);
} else if (name.equals("decoded resources")) {
setIcon(Resources.decodedIcon);
} else if (name.endsWith(".properties") || name.endsWith(".xml") || name.endsWith(".jsp") || name.endsWith(".mf") || name.endsWith(".config") || name.endsWith(".cfg")) {
setIcon(Resources.configIcon);
} else if (node.getChildCount() <= 0) { //random file
setIcon(Resources.fileIcon);
} else { //folder
ArrayList<TreeNode> nodes = new ArrayList<>();
ArrayList<TreeNode> totalNodes = new ArrayList<>();
nodes.add(node);
totalNodes.add(node);
boolean isJava = false;
boolean finished = false;
while (!finished) { //may cause a clusterfuck with huge files
if (nodes.isEmpty())
finished = true;
else {
TreeNode treeNode = nodes.get(0);
nodes.remove(treeNode);
int children = treeNode.getChildCount();
if (children >= 1)
for (int i = 0; i < children; i++) {
TreeNode child = treeNode.getChildAt(i);
if (!totalNodes.contains(child)) {
nodes.add(child);
totalNodes.add(child);
}
if (child.toString().endsWith(".class"))
isJava = true;
}
if (isJava)
nodes.clear();
}
}
if (isJava)
setIcon(Resources.packagesIcon);
else {
setIcon(Resources.folderIcon);
}
}
}
return ret;
}
}
}

View file

@ -4,7 +4,7 @@ import org.apache.commons.io.FileUtils;
import org.objectweb.asm.tree.ClassNode;
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
import the.bytecode.club.bytecodeviewer.api.ExceptionUI;
import the.bytecode.club.bytecodeviewer.gui.ResourceListPane;
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.ResourceListPane;
import the.bytecode.club.bytecodeviewer.gui.MainViewerGUI;
import java.io.File;