02/04/2015 - Fixed UI bug with Krakatau/Krakatau Editable view panes.
02/05/2015 - Added CTRL + F.
This commit is contained in:
Kalen Kinloch 2015-02-10 18:07:13 -08:00
parent 0fb031b19d
commit 5efba02200
9 changed files with 353 additions and 95 deletions

View file

@ -1,4 +1,4 @@
Bytecode Viewer is an Advanced Lightweight Java Bytecode Viewer, GUI Smali, GUI Baksmali, GUI APK Editor, GUI Dex Editor, GUI APK Decompiler, GUI DEX Decompiler, GUI Procyon Java Decompiler, GUI Krakatau, GUI CFR Java Decompiler, GUI FernFlower Java Decompiler, GUI DEX2Jar, GUI Jar2DEX, GUI Jar-Jar, Hex Viewer, Code Searcher, Debugger and more.
Bytecode Viewer is an Advanced Lightweight Java Bytecode Viewer, GUI Java Decompiler, GUI Bytecode Editor, GUI Smali, GUI Baksmali, GUI APK Editor, GUI Dex Editor, GUI APK Decompiler, GUI DEX Decompiler, GUI Procyon Java Decompiler, GUI Krakatau, GUI CFR Java Decompiler, GUI FernFlower Java Decompiler, GUI DEX2Jar, GUI Jar2DEX, GUI Jar-Jar, Hex Viewer, Code Searcher, Debugger and more.
It's written completely in Java, and it's open sourced. It's currently being maintained and developed by Konloch.
There is also a plugin system that will allow you to interact with the loaded classfiles, for example you can write a String deobfuscator, a malicious code searcher, or something else you can think of.
@ -28,9 +28,11 @@ Contributors:
Afffsdd
If I missed you, please feel free to contact me @Konloch or konloch@gmail.com
Contribution Guide Lines:
Contribution Guide Lines/Coding Conventions:
Packages must start with the.bytecode.club.bytecodeviewer
If code you write can throw an exception, handle it using new the.bytecode.club.bytecodeviewer.ExceptionUI(exception)
If code you write can throw an exception, handle it using new the.bytecode.club.bytecodeviewer.ExceptionUI(exception, "authors@email.com")
All variables must be at the start of each class.
Brackets are meant to be on the same line, I.E. public void main(String[] args) { not (String[] args) <NEWLINE_BREAK> {
Website: https://bytecodeviewer.com
Source Code: https://github.com/konloch/bytecode-viewer
@ -288,3 +290,6 @@ Changelog:
02/03/2015 - Dropped JRuby and Jython support (BCV is now roughly 16mb, was 45mb).
02/04/2015 - Added Krakatau Disassembly.
02/04/2015 - Added Krakatau Assembly.
--- 2.8.1 ---:
02/04/2015 - Fixed UI bug with Krakatau/Krakatau Editable view panes.
02/05/2015 - Added CTRL + F.

View file

@ -1,15 +0,0 @@
require 'java'
java_import 'the.bytecode.club.bytecodeviewer.api.Plugin'
java_import 'the.bytecode.club.bytecodeviewer.api.PluginConsole'
java_import 'java.lang.System'
java_import 'java.util.ArrayList'
java_import 'org.objectweb.asm.tree.ClassNode'
class Skeleton < Plugin
def execute(classNodeList)
gui = PluginConsole.new "Skeleton"
gui.setVisible(true)
gui.appendText("exceuted skeleton")
end
end

View file

@ -1,13 +0,0 @@
from the.bytecode.club.bytecodeviewer.api import Plugin
from the.bytecode.club.bytecodeviewer.api import PluginConsole
from java.lang import System
from java.lang import Boolean
from java.util import ArrayList
from org.objectweb.asm.tree import ClassNode
class skeleton(Plugin):
def execute(classNodeList, poop): #for some reason it requires a second arg
gui = PluginConsole("Skeleton")
gui.setVisible(Boolean.TRUE)
gui.appendText("exceuted skeleton")

View file

@ -66,19 +66,31 @@ import the.bytecode.club.bytecodeviewer.plugins.PluginManager;
* allows the user to handle it completely using ASM.
*
* TODO:
*
* 3.0.0: (RETIREMENT PARTY, WOHOOO)
* maybe just do AMS5 then obfuscate the dex2jar shit.
* The import jar method eats up a lot of memory, look into some how reducing this.
* Add obfuscation:
* - Add integer boxing and other obfuscation methods contra implemented
* - Insert unadded/debug opcodes to try to fuck up decompilers
* - ClassAnylyzterAdapter
* Add progress bars on saving all zips/java decompile jar
* Add the jump/save mark system Ida Pro has.
* Add class annotations to bytecode decompiler.
* Option to make the bytecode pane automatically scroll to where the source code pane is
* Replacing all string field calls with the string instance - would require EZ-Injection to run code?
* Spiffy up the plugin console with red text optional, would require JTextPane, not JTextArea.
* EVERYTHING BUG FREE, CHECK 100%
* add support for all files, and resource loading (images display inside, can be view in hex)
*
*
* 2.9.0:
* make it save the last used main class entry globally, reset on workspace reset
* make it use that global last used inside of export as jar
* remake EZ-Inject plugin as File-Run
* Add Java compiler to attempt to recompile the decompiled Java code
* Add right click on tab > close other tabs > close this tab
* maybe just do AMS5 then obfuscate the dex2jar shit.
* Spiffy up the plugin console with red text optional, would require JTextPane, not JTextArea.
* Option to make the bytecode pane automatically scroll to where the source code pane is
* Add progress bars on saving all zips/java decompile jar
* Take https://github.com/ptnkjke/Java-Bytecode-Editor visualize
*
*
* ----Beta 1.0.0-----:
* 10/4/2014 - Designed a POC GUI, still needs a lot of work.
@ -309,6 +321,9 @@ import the.bytecode.club.bytecodeviewer.plugins.PluginManager;
* 02/03/2015 - Dropped JRuby and Jython support (BCV is now roughly 16mb, was 45mb).
* 02/04/2015 - Added Krakatau Disassembly.
* 02/04/2015 - Added Krakatau Assembly.
* -----2.8.1-----:
* 02/04/2015 - Fixed UI bug with Krakatau/Krakatau Editable view panes.
* 02/05/2015 - Added CTRL + F.
*
* @author Konloch
*
@ -317,7 +332,7 @@ import the.bytecode.club.bytecodeviewer.plugins.PluginManager;
public class BytecodeViewer {
/*per version*/
public static String version = "2.8.0";
public static String version = "2.8.1";
public static String krakatauVersion = "2";
/*the rest*/
public static MainViewerGUI viewer = null;

View file

@ -23,6 +23,8 @@ import java.io.StringWriter;
public class ExceptionUI extends JFrame {
private static final long serialVersionUID = -5230501978224926296L;
/**
* @param e
* The exception to be shown
@ -98,6 +100,4 @@ public class ExceptionUI extends JFrame {
this.setVisible(true);
}
private static final long serialVersionUID = -5230501978224926296L;
}

View file

@ -39,6 +39,7 @@ public class PluginConsole extends JFrame {
JPanel panel = new JPanel(new BorderLayout());
JScrollPane scrollPane = new JScrollPane();
public JCheckBox check = new JCheckBox("Exact");
final JTextField field = new JTextField();
public PluginConsole(String pluginName) {
this.setIconImages(BytecodeViewer.iconList);
@ -48,6 +49,17 @@ public class PluginConsole extends JFrame {
getContentPane().add(scrollPane, BorderLayout.CENTER);
scrollPane.setViewportView(textArea);
textArea.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
JButton searchNext = new JButton();
JButton searchPrev = new JButton();
@ -63,7 +75,6 @@ public class PluginConsole extends JFrame {
BytecodeViewer
.b642IMG("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAABnRSTlMANzlYgKhxpRi1AAAATElEQVR42mNgwAZYHIAEExA7qUAYLApMDmCGEwODCojByM/A8FEAyPi/moFh9QewYjCAM1iA+D2KqYwMrIlA6tUGFoa/Z4GMt1hsBgCe1wuKber+SwAAAABJRU5ErkJggg==")));
panel.add(buttonPane, BorderLayout.WEST);
final JTextField field = new JTextField();
panel.add(field, BorderLayout.CENTER);
panel.add(check, BorderLayout.EAST);
searchNext.addActionListener(new ActionListener() {
@ -93,7 +104,6 @@ public class PluginConsole extends JFrame {
public void keyTyped(KeyEvent arg0) {
}
});
scrollPane.setColumnHeaderView(panel);
this.setLocationRelativeTo(null);
}

View file

@ -278,6 +278,9 @@ public class ClassViewer extends JPanel {
}
}
final JTextField field1 = new JTextField();
final JTextField field2 = new JTextField();
final JTextField field3 = new JTextField();
public ClassViewer(final String name, final ClassNode cn) {
JButton byteSearchNext = new JButton();
JButton byteSearchPrev = new JButton();
@ -293,7 +296,6 @@ public class ClassViewer extends JPanel {
BytecodeViewer
.b642IMG("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAABnRSTlMANzlYgKhxpRi1AAAATElEQVR42mNgwAZYHIAEExA7qUAYLApMDmCGEwODCojByM/A8FEAyPi/moFh9QewYjCAM1iA+D2KqYwMrIlA6tUGFoa/Z4GMt1hsBgCe1wuKber+SwAAAABJRU5ErkJggg==")));
panel1Search.add(byteButtonPane, BorderLayout.WEST);
final JTextField field1 = new JTextField();
panel1Search.add(field1, BorderLayout.CENTER);
panel1Search.add(check1, BorderLayout.EAST);
byteSearchNext.addActionListener(new ActionListener() {
@ -338,7 +340,6 @@ public class ClassViewer extends JPanel {
BytecodeViewer
.b642IMG("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAABnRSTlMANzlYgKhxpRi1AAAATElEQVR42mNgwAZYHIAEExA7qUAYLApMDmCGEwODCojByM/A8FEAyPi/moFh9QewYjCAM1iA+D2KqYwMrIlA6tUGFoa/Z4GMt1hsBgCe1wuKber+SwAAAABJRU5ErkJggg==")));
panel2Search.add(buttonPane2, BorderLayout.WEST);
final JTextField field2 = new JTextField();
panel2Search.add(field2, BorderLayout.CENTER);
panel2Search.add(check2, BorderLayout.EAST);
searchNext2.addActionListener(new ActionListener() {
@ -383,7 +384,6 @@ public class ClassViewer extends JPanel {
BytecodeViewer
.b642IMG("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAABnRSTlMANzlYgKhxpRi1AAAATElEQVR42mNgwAZYHIAEExA7qUAYLApMDmCGEwODCojByM/A8FEAyPi/moFh9QewYjCAM1iA+D2KqYwMrIlA6tUGFoa/Z4GMt1hsBgCe1wuKber+SwAAAABJRU5ErkJggg==")));
panel3Search.add(buttonPane3, BorderLayout.WEST);
final JTextField field3 = new JTextField();
panel3Search.add(field3, BorderLayout.CENTER);
panel3Search.add(check3, BorderLayout.EAST);
searchNext3.addActionListener(new ActionListener() {
@ -579,6 +579,18 @@ public class ClassViewer extends JPanel {
panelArea.setText(proc_dc.decompileClassNode(cn));
panelArea.setCaretPosition(0);
panelArea.setEditable(false);
panelArea.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field1.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
panel1.add(scrollPane);
}
@ -592,6 +604,17 @@ public class ClassViewer extends JPanel {
panelArea.setText(cfr_dc.decompileClassNode(cn));
panelArea.setCaretPosition(0);
panelArea.setEditable(false);
panelArea.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field1.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
panel1.add(scrollPane);
}
@ -605,6 +628,17 @@ public class ClassViewer extends JPanel {
panelArea.setText(ff_dc.decompileClassNode(cn));
panelArea.setCaretPosition(0);
panelArea.setEditable(false);
panelArea.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field1.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
panel1.add(scrollPane);
}
@ -614,12 +648,23 @@ public class ClassViewer extends JPanel {
.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
bytecodeArea.setCodeFoldingEnabled(true);
bytecodeArea.setAntiAliasingEnabled(true);
RTextScrollPane bytecodeSPane = new RTextScrollPane(
RTextScrollPane scrollPane = new RTextScrollPane(
bytecodeArea);
bytecodeArea.setText(ClassNodeDecompiler.decompile(cn));
bytecodeArea.setCaretPosition(0);
bytecodeArea.setEditable(false);
panel1.add(bytecodeSPane);
bytecodeArea.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field1.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
panel1.add(scrollPane);
}
if (pane1 == 5) {// hex
@ -635,12 +680,23 @@ public class ClassViewer extends JPanel {
.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
bytecodeArea.setCodeFoldingEnabled(true);
bytecodeArea.setAntiAliasingEnabled(true);
RTextScrollPane bytecodeSPane = new RTextScrollPane(
RTextScrollPane scrollPane = new RTextScrollPane(
bytecodeArea);
bytecodeArea.setText(SmaliDisassembler.decompileClassNode(cn));
bytecodeArea.setCaretPosition(0);
smali1 = bytecodeArea;
panel1.add(bytecodeSPane);
smali1.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field1.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
panel1.add(scrollPane);
}
if (pane1 == 7) {// krakatau
@ -649,11 +705,22 @@ public class ClassViewer extends JPanel {
.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
bytecodeArea.setCodeFoldingEnabled(true);
bytecodeArea.setAntiAliasingEnabled(true);
RTextScrollPane bytecodeSPane = new RTextScrollPane(
RTextScrollPane scrollPane = new RTextScrollPane(
bytecodeArea);
bytecodeArea.setText(krak_dc.decompileClassNode(cn));
bytecodeArea.setCaretPosition(0);
panel1.add(bytecodeSPane);
bytecodeArea.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field1.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
panel1.add(scrollPane);
}
@ -664,12 +731,23 @@ public class ClassViewer extends JPanel {
.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
bytecodeArea.setCodeFoldingEnabled(true);
bytecodeArea.setAntiAliasingEnabled(true);
RTextScrollPane bytecodeSPane = new RTextScrollPane(
RTextScrollPane scrollPane = new RTextScrollPane(
bytecodeArea);
bytecodeArea.setText(KrakatauDisassembler.decompileClassNode(cn));
bytecodeArea.setCaretPosition(0);
krakatau1 = bytecodeArea;
panel1.add(bytecodeSPane);
krakatau1.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field1.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
panel1.add(scrollPane);
}
if (pane2 == 1) {
@ -682,6 +760,17 @@ public class ClassViewer extends JPanel {
panelArea.setText(proc_dc.decompileClassNode(cn));
panelArea.setCaretPosition(0);
panelArea.setEditable(false);
panelArea.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field2.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
panel2.add(scrollPane);
}
@ -695,6 +784,17 @@ public class ClassViewer extends JPanel {
panelArea.setText(cfr_dc.decompileClassNode(cn));
panelArea.setCaretPosition(0);
panelArea.setEditable(false);
panelArea.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field2.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
panel2.add(scrollPane);
}
@ -708,6 +808,17 @@ public class ClassViewer extends JPanel {
panelArea.setText(ff_dc.decompileClassNode(cn));
panelArea.setCaretPosition(0);
panelArea.setEditable(false);
panelArea.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field2.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
panel2.add(scrollPane);
}
@ -720,6 +831,17 @@ public class ClassViewer extends JPanel {
paneArea.setText(ClassNodeDecompiler.decompile(cn));
paneArea.setCaretPosition(0);
paneArea.setEditable(false);
paneArea.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field2.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
panel2.add(scrollPane);
}
@ -739,6 +861,17 @@ public class ClassViewer extends JPanel {
paneArea.setText(SmaliDisassembler.decompileClassNode(cn));
paneArea.setCaretPosition(0);
smali2 = paneArea;
paneArea.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field2.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
panel2.add(scrollPane);
}
@ -748,11 +881,22 @@ public class ClassViewer extends JPanel {
.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
bytecodeArea.setCodeFoldingEnabled(true);
bytecodeArea.setAntiAliasingEnabled(true);
RTextScrollPane bytecodeSPane = new RTextScrollPane(
RTextScrollPane scrollPane = new RTextScrollPane(
bytecodeArea);
bytecodeArea.setText(krak_dc.decompileClassNode(cn));
bytecodeArea.setCaretPosition(0);
panel2.add(bytecodeSPane);
bytecodeArea.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field2.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
panel2.add(scrollPane);
}
@ -763,12 +907,23 @@ public class ClassViewer extends JPanel {
.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
bytecodeArea.setCodeFoldingEnabled(true);
bytecodeArea.setAntiAliasingEnabled(true);
RTextScrollPane bytecodeSPane = new RTextScrollPane(
RTextScrollPane scrollPane = new RTextScrollPane(
bytecodeArea);
bytecodeArea.setText(KrakatauDisassembler.decompileClassNode(cn));
bytecodeArea.setCaretPosition(0);
krakatau2 = bytecodeArea;
panel2.add(bytecodeSPane);
krakatau2.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field2.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
panel2.add(scrollPane);
}
if (pane3 == 1) {
@ -781,6 +936,17 @@ public class ClassViewer extends JPanel {
panelArea.setText(proc_dc.decompileClassNode(cn));
panelArea.setCaretPosition(0);
panelArea.setEditable(false);
panelArea.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field3.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
panel3.add(scrollPane);
}
@ -794,6 +960,17 @@ public class ClassViewer extends JPanel {
panelArea.setText(cfr_dc.decompileClassNode(cn));
panelArea.setCaretPosition(0);
panelArea.setEditable(false);
panelArea.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field3.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
panel3.add(scrollPane);
}
@ -807,6 +984,17 @@ public class ClassViewer extends JPanel {
panelArea.setText(ff_dc.decompileClassNode(cn));
panelArea.setCaretPosition(0);
panelArea.setEditable(false);
panelArea.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field3.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
panel3.add(scrollPane);
}
@ -819,6 +1007,17 @@ public class ClassViewer extends JPanel {
paneArea.setText(ClassNodeDecompiler.decompile(cn));
paneArea.setCaretPosition(0);
paneArea.setEditable(false);
paneArea.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field3.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
panel3.add(scrollPane);
}
@ -838,6 +1037,17 @@ public class ClassViewer extends JPanel {
paneArea.setText(SmaliDisassembler.decompileClassNode(cn));
paneArea.setCaretPosition(0);
smali3 = paneArea;
smali3.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field3.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
panel3.add(scrollPane);
}
@ -847,11 +1057,22 @@ public class ClassViewer extends JPanel {
.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
bytecodeArea.setCodeFoldingEnabled(true);
bytecodeArea.setAntiAliasingEnabled(true);
RTextScrollPane bytecodeSPane = new RTextScrollPane(
RTextScrollPane scrollPane = new RTextScrollPane(
bytecodeArea);
bytecodeArea.setText(krak_dc.decompileClassNode(cn));
bytecodeArea.setCaretPosition(0);
panel3.add(bytecodeSPane);
bytecodeArea.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field3.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
panel3.add(scrollPane);
}
@ -862,12 +1083,23 @@ public class ClassViewer extends JPanel {
.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
bytecodeArea.setCodeFoldingEnabled(true);
bytecodeArea.setAntiAliasingEnabled(true);
RTextScrollPane bytecodeSPane = new RTextScrollPane(
RTextScrollPane scrollPane = new RTextScrollPane(
bytecodeArea);
bytecodeArea.setText(KrakatauDisassembler.decompileClassNode(cn));
bytecodeArea.setCaretPosition(0);
krakatau3 = bytecodeArea;
panel3.add(bytecodeSPane);
krakatau3.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
field3.requestFocus();
}
BytecodeViewer.viewer.checkKey(e);
}
@Override public void keyReleased(KeyEvent arg0) { }
@Override public void keyTyped(KeyEvent arg0) { }
});
panel3.add(scrollPane);
}
resetDivider();

View file

@ -374,43 +374,47 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
}
private class Test implements KeyEventDispatcher {
long last = System.currentTimeMillis();
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if(System.currentTimeMillis() - last <= (1000 * 4))
return false;
if ((e.getKeyCode() == KeyEvent.VK_O) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
last = System.currentTimeMillis();
JFileChooser fc = new JFileChooser();
try {
fc.setSelectedFile(new File(BytecodeViewer.lastDirectory));
} catch(Exception e2) {
}
fc.setFileFilter(new APKDEXJarZipClassFileFilter());
fc.setFileHidingEnabled(false);
fc.setAcceptAllFileFilterUsed(false);
int returnVal = fc.showOpenDialog(BytecodeViewer.viewer);
if (returnVal == JFileChooser.APPROVE_OPTION) {
BytecodeViewer.lastDirectory = fc.getSelectedFile().getAbsolutePath();
try {
BytecodeViewer.viewer.setIcon(true);
BytecodeViewer.openFiles(new File[] { fc.getSelectedFile() }, true);
BytecodeViewer.viewer.setIcon(false);
} catch (Exception e1) {
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e1);
}
}
} else if ((e.getKeyCode() == KeyEvent.VK_N) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
last = System.currentTimeMillis();
BytecodeViewer.resetWorkSpace(true);
}
checkKey(e);
return false;
}
}
long last = System.currentTimeMillis();
public void checkKey(KeyEvent e) {
if(System.currentTimeMillis() - last <= (1000 * 4))
return;
if ((e.getKeyCode() == KeyEvent.VK_O) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
last = System.currentTimeMillis();
JFileChooser fc = new JFileChooser();
try {
fc.setSelectedFile(new File(BytecodeViewer.lastDirectory));
} catch(Exception e2) {
}
fc.setFileFilter(new APKDEXJarZipClassFileFilter());
fc.setFileHidingEnabled(false);
fc.setAcceptAllFileFilterUsed(false);
int returnVal = fc.showOpenDialog(BytecodeViewer.viewer);
if (returnVal == JFileChooser.APPROVE_OPTION) {
BytecodeViewer.lastDirectory = fc.getSelectedFile().getAbsolutePath();
try {
BytecodeViewer.viewer.setIcon(true);
BytecodeViewer.openFiles(new File[] { fc.getSelectedFile() }, true);
BytecodeViewer.viewer.setIcon(false);
} catch (Exception e1) {
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e1);
}
}
} else if ((e.getKeyCode() == KeyEvent.VK_N) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
last = System.currentTimeMillis();
BytecodeViewer.resetWorkSpace(true);
}
}
ImageIcon busy = new ImageIcon(getClass().getResource("/resources/1.gif"));
ImageIcon busyB64 = new ImageIcon(BytecodeViewer.b642IMG("R0lGODlhEAALAPQAAP///wAAANra2tDQ0Orq6gcHBwAAAC8vL4KCgmFhYbq6uiMjI0tLS4qKimVlZb6+vicnJwUFBU9PT+bm5tjY2PT09Dk5Odzc3PLy8ra2tqCgoMrKyu7u7gAAAAAAAAAAACH5BAkLAAAAIf4aQ3JlYXRlZCB3aXRoIGFqYXhsb2FkLmluZm8AIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAALAAAFLSAgjmRpnqSgCuLKAq5AEIM4zDVw03ve27ifDgfkEYe04kDIDC5zrtYKRa2WQgAh+QQJCwAAACwAAAAAEAALAAAFJGBhGAVgnqhpHIeRvsDawqns0qeN5+y967tYLyicBYE7EYkYAgAh+QQJCwAAACwAAAAAEAALAAAFNiAgjothLOOIJAkiGgxjpGKiKMkbz7SN6zIawJcDwIK9W/HISxGBzdHTuBNOmcJVCyoUlk7CEAAh+QQJCwAAACwAAAAAEAALAAAFNSAgjqQIRRFUAo3jNGIkSdHqPI8Tz3V55zuaDacDyIQ+YrBH+hWPzJFzOQQaeavWi7oqnVIhACH5BAkLAAAALAAAAAAQAAsAAAUyICCOZGme1rJY5kRRk7hI0mJSVUXJtF3iOl7tltsBZsNfUegjAY3I5sgFY55KqdX1GgIAIfkECQsAAAAsAAAAABAACwAABTcgII5kaZ4kcV2EqLJipmnZhWGXaOOitm2aXQ4g7P2Ct2ER4AMul00kj5g0Al8tADY2y6C+4FIIACH5BAkLAAAALAAAAAAQAAsAAAUvICCOZGme5ERRk6iy7qpyHCVStA3gNa/7txxwlwv2isSacYUc+l4tADQGQ1mvpBAAIfkECQsAAAAsAAAAABAACwAABS8gII5kaZ7kRFGTqLLuqnIcJVK0DeA1r/u3HHCXC/aKxJpxhRz6Xi0ANAZDWa+kEAA7"));
private final JMenuItem mntmSaveAsApk = new JMenuItem("Save As DEX..");
@ -436,6 +440,10 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
public final JRadioButtonMenuItem panel3Krakatau = new JRadioButtonMenuItem("Krakatau");
public final JRadioButtonMenuItem panel3KrakatauEditable = new JRadioButtonMenuItem("Krakatau Editable");
private final JMenuItem mntmSetJreRt = new JMenuItem("Set JRE RT Library");
private final JSeparator separator_14 = new JSeparator();
private final JCheckBoxMenuItem chckbxmntmPaneEditable = new JCheckBoxMenuItem("Pane 1 Editable");
private final JCheckBoxMenuItem chckbxmntmPaneEditable_1 = new JCheckBoxMenuItem("Pane 2 Editable");
private final JCheckBoxMenuItem chckbxmntmPaneEditable_2 = new JCheckBoxMenuItem("Pane 3 Editable");
public void setIcon(final boolean busy) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
@ -525,6 +533,8 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
panel1Bytecode.addActionListener(listener);
panel1Smali.addActionListener(listener);
panel1Hexcode.addActionListener(listener);
panel1Krakatau.addActionListener(listener);
panel1KrakatauEditable.addActionListener(listener);
panel2None.addActionListener(listener);
panel2Fern.addActionListener(listener);
panel2Proc.addActionListener(listener);
@ -532,6 +542,8 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
panel2Bytecode.addActionListener(listener);
panel2Smali.addActionListener(listener);
panel2Hexcode.addActionListener(listener);
panel2Krakatau.addActionListener(listener);
panel2KrakatauEditable.addActionListener(listener);
panel3None.addActionListener(listener);
panel3Fern.addActionListener(listener);
panel3Proc.addActionListener(listener);
@ -539,6 +551,8 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
panel3Bytecode.addActionListener(listener);
panel3Smali.addActionListener(listener);
panel3Hexcode.addActionListener(listener);
panel3Krakatau.addActionListener(listener);
panel3KrakatauEditable.addActionListener(listener);
obfuscatorGroup.add(strongObf);
obfuscatorGroup.add(lightObf);
obfuscatorGroup.setSelected(strongObf.getModel(), true);
@ -562,7 +576,9 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
public void actionPerformed(ActionEvent e) {
JFileChooser fc = new JFileChooser();
try {
fc.setSelectedFile(new File(BytecodeViewer.lastDirectory));
File f = new File(BytecodeViewer.lastDirectory);
if(f.exists())
fc.setSelectedFile(f);
} catch(Exception e2) {
}
@ -1054,6 +1070,14 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
menuBar.add(mnNewMenu_6);
mnNewMenu_6.add(chckbxmntmPaneEditable);
mnNewMenu_6.add(chckbxmntmPaneEditable_1);
mnNewMenu_6.add(chckbxmntmPaneEditable_2);
mnNewMenu_6.add(separator_14);
mnNewMenu_6.add(mnNewMenu_7);
mnNewMenu_7.add(panel1None);