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. 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. 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 Afffsdd
If I missed you, please feel free to contact me @Konloch or konloch@gmail.com 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 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 Website: https://bytecodeviewer.com
Source Code: https://github.com/konloch/bytecode-viewer 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/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 Disassembly.
02/04/2015 - Added Krakatau Assembly. 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. * allows the user to handle it completely using ASM.
* *
* TODO: * 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. * The import jar method eats up a lot of memory, look into some how reducing this.
* Add obfuscation: * Add obfuscation:
* - Add integer boxing and other obfuscation methods contra implemented * - Add integer boxing and other obfuscation methods contra implemented
* - Insert unadded/debug opcodes to try to fuck up decompilers * - Insert unadded/debug opcodes to try to fuck up decompilers
* - ClassAnylyzterAdapter * - ClassAnylyzterAdapter
* Add progress bars on saving all zips/java decompile jar
* Add the jump/save mark system Ida Pro has. * Add the jump/save mark system Ida Pro has.
* Add class annotations to bytecode decompiler. * Add class annotations to bytecode decompiler.
* Option to make the bytecode pane automatically scroll to where the source code pane is * EVERYTHING BUG FREE, CHECK 100%
* Replacing all string field calls with the string instance - would require EZ-Injection to run code? * add support for all files, and resource loading (images display inside, can be view in hex)
* Spiffy up the plugin console with red text optional, would require JTextPane, not JTextArea. *
*
* 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 * 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-----: * ----Beta 1.0.0-----:
* 10/4/2014 - Designed a POC GUI, still needs a lot of work. * 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/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 Disassembly.
* 02/04/2015 - Added Krakatau Assembly. * 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 * @author Konloch
* *
@ -317,7 +332,7 @@ import the.bytecode.club.bytecodeviewer.plugins.PluginManager;
public class BytecodeViewer { public class BytecodeViewer {
/*per version*/ /*per version*/
public static String version = "2.8.0"; public static String version = "2.8.1";
public static String krakatauVersion = "2"; public static String krakatauVersion = "2";
/*the rest*/ /*the rest*/
public static MainViewerGUI viewer = null; public static MainViewerGUI viewer = null;

View file

@ -23,6 +23,8 @@ import java.io.StringWriter;
public class ExceptionUI extends JFrame { public class ExceptionUI extends JFrame {
private static final long serialVersionUID = -5230501978224926296L;
/** /**
* @param e * @param e
* The exception to be shown * The exception to be shown
@ -98,6 +100,4 @@ public class ExceptionUI extends JFrame {
this.setVisible(true); 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()); JPanel panel = new JPanel(new BorderLayout());
JScrollPane scrollPane = new JScrollPane(); JScrollPane scrollPane = new JScrollPane();
public JCheckBox check = new JCheckBox("Exact"); public JCheckBox check = new JCheckBox("Exact");
final JTextField field = new JTextField();
public PluginConsole(String pluginName) { public PluginConsole(String pluginName) {
this.setIconImages(BytecodeViewer.iconList); this.setIconImages(BytecodeViewer.iconList);
@ -48,6 +49,17 @@ public class PluginConsole extends JFrame {
getContentPane().add(scrollPane, BorderLayout.CENTER); getContentPane().add(scrollPane, BorderLayout.CENTER);
scrollPane.setViewportView(textArea); 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 searchNext = new JButton();
JButton searchPrev = new JButton(); JButton searchPrev = new JButton();
@ -63,7 +75,6 @@ public class PluginConsole extends JFrame {
BytecodeViewer BytecodeViewer
.b642IMG("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAABnRSTlMANzlYgKhxpRi1AAAATElEQVR42mNgwAZYHIAEExA7qUAYLApMDmCGEwODCojByM/A8FEAyPi/moFh9QewYjCAM1iA+D2KqYwMrIlA6tUGFoa/Z4GMt1hsBgCe1wuKber+SwAAAABJRU5ErkJggg=="))); .b642IMG("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAABnRSTlMANzlYgKhxpRi1AAAATElEQVR42mNgwAZYHIAEExA7qUAYLApMDmCGEwODCojByM/A8FEAyPi/moFh9QewYjCAM1iA+D2KqYwMrIlA6tUGFoa/Z4GMt1hsBgCe1wuKber+SwAAAABJRU5ErkJggg==")));
panel.add(buttonPane, BorderLayout.WEST); panel.add(buttonPane, BorderLayout.WEST);
final JTextField field = new JTextField();
panel.add(field, BorderLayout.CENTER); panel.add(field, BorderLayout.CENTER);
panel.add(check, BorderLayout.EAST); panel.add(check, BorderLayout.EAST);
searchNext.addActionListener(new ActionListener() { searchNext.addActionListener(new ActionListener() {
@ -93,7 +104,6 @@ public class PluginConsole extends JFrame {
public void keyTyped(KeyEvent arg0) { public void keyTyped(KeyEvent arg0) {
} }
}); });
scrollPane.setColumnHeaderView(panel); scrollPane.setColumnHeaderView(panel);
this.setLocationRelativeTo(null); 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) { public ClassViewer(final String name, final ClassNode cn) {
JButton byteSearchNext = new JButton(); JButton byteSearchNext = new JButton();
JButton byteSearchPrev = new JButton(); JButton byteSearchPrev = new JButton();
@ -293,7 +296,6 @@ public class ClassViewer extends JPanel {
BytecodeViewer BytecodeViewer
.b642IMG("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAABnRSTlMANzlYgKhxpRi1AAAATElEQVR42mNgwAZYHIAEExA7qUAYLApMDmCGEwODCojByM/A8FEAyPi/moFh9QewYjCAM1iA+D2KqYwMrIlA6tUGFoa/Z4GMt1hsBgCe1wuKber+SwAAAABJRU5ErkJggg=="))); .b642IMG("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAABnRSTlMANzlYgKhxpRi1AAAATElEQVR42mNgwAZYHIAEExA7qUAYLApMDmCGEwODCojByM/A8FEAyPi/moFh9QewYjCAM1iA+D2KqYwMrIlA6tUGFoa/Z4GMt1hsBgCe1wuKber+SwAAAABJRU5ErkJggg==")));
panel1Search.add(byteButtonPane, BorderLayout.WEST); panel1Search.add(byteButtonPane, BorderLayout.WEST);
final JTextField field1 = new JTextField();
panel1Search.add(field1, BorderLayout.CENTER); panel1Search.add(field1, BorderLayout.CENTER);
panel1Search.add(check1, BorderLayout.EAST); panel1Search.add(check1, BorderLayout.EAST);
byteSearchNext.addActionListener(new ActionListener() { byteSearchNext.addActionListener(new ActionListener() {
@ -338,7 +340,6 @@ public class ClassViewer extends JPanel {
BytecodeViewer BytecodeViewer
.b642IMG("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAABnRSTlMANzlYgKhxpRi1AAAATElEQVR42mNgwAZYHIAEExA7qUAYLApMDmCGEwODCojByM/A8FEAyPi/moFh9QewYjCAM1iA+D2KqYwMrIlA6tUGFoa/Z4GMt1hsBgCe1wuKber+SwAAAABJRU5ErkJggg=="))); .b642IMG("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAABnRSTlMANzlYgKhxpRi1AAAATElEQVR42mNgwAZYHIAEExA7qUAYLApMDmCGEwODCojByM/A8FEAyPi/moFh9QewYjCAM1iA+D2KqYwMrIlA6tUGFoa/Z4GMt1hsBgCe1wuKber+SwAAAABJRU5ErkJggg==")));
panel2Search.add(buttonPane2, BorderLayout.WEST); panel2Search.add(buttonPane2, BorderLayout.WEST);
final JTextField field2 = new JTextField();
panel2Search.add(field2, BorderLayout.CENTER); panel2Search.add(field2, BorderLayout.CENTER);
panel2Search.add(check2, BorderLayout.EAST); panel2Search.add(check2, BorderLayout.EAST);
searchNext2.addActionListener(new ActionListener() { searchNext2.addActionListener(new ActionListener() {
@ -383,7 +384,6 @@ public class ClassViewer extends JPanel {
BytecodeViewer BytecodeViewer
.b642IMG("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAABnRSTlMANzlYgKhxpRi1AAAATElEQVR42mNgwAZYHIAEExA7qUAYLApMDmCGEwODCojByM/A8FEAyPi/moFh9QewYjCAM1iA+D2KqYwMrIlA6tUGFoa/Z4GMt1hsBgCe1wuKber+SwAAAABJRU5ErkJggg=="))); .b642IMG("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAABnRSTlMANzlYgKhxpRi1AAAATElEQVR42mNgwAZYHIAEExA7qUAYLApMDmCGEwODCojByM/A8FEAyPi/moFh9QewYjCAM1iA+D2KqYwMrIlA6tUGFoa/Z4GMt1hsBgCe1wuKber+SwAAAABJRU5ErkJggg==")));
panel3Search.add(buttonPane3, BorderLayout.WEST); panel3Search.add(buttonPane3, BorderLayout.WEST);
final JTextField field3 = new JTextField();
panel3Search.add(field3, BorderLayout.CENTER); panel3Search.add(field3, BorderLayout.CENTER);
panel3Search.add(check3, BorderLayout.EAST); panel3Search.add(check3, BorderLayout.EAST);
searchNext3.addActionListener(new ActionListener() { searchNext3.addActionListener(new ActionListener() {
@ -579,6 +579,18 @@ public class ClassViewer extends JPanel {
panelArea.setText(proc_dc.decompileClassNode(cn)); panelArea.setText(proc_dc.decompileClassNode(cn));
panelArea.setCaretPosition(0); panelArea.setCaretPosition(0);
panelArea.setEditable(false); 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); panel1.add(scrollPane);
} }
@ -592,6 +604,17 @@ public class ClassViewer extends JPanel {
panelArea.setText(cfr_dc.decompileClassNode(cn)); panelArea.setText(cfr_dc.decompileClassNode(cn));
panelArea.setCaretPosition(0); panelArea.setCaretPosition(0);
panelArea.setEditable(false); 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); panel1.add(scrollPane);
} }
@ -605,6 +628,17 @@ public class ClassViewer extends JPanel {
panelArea.setText(ff_dc.decompileClassNode(cn)); panelArea.setText(ff_dc.decompileClassNode(cn));
panelArea.setCaretPosition(0); panelArea.setCaretPosition(0);
panelArea.setEditable(false); 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); panel1.add(scrollPane);
} }
@ -614,12 +648,23 @@ public class ClassViewer extends JPanel {
.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA); .setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
bytecodeArea.setCodeFoldingEnabled(true); bytecodeArea.setCodeFoldingEnabled(true);
bytecodeArea.setAntiAliasingEnabled(true); bytecodeArea.setAntiAliasingEnabled(true);
RTextScrollPane bytecodeSPane = new RTextScrollPane( RTextScrollPane scrollPane = new RTextScrollPane(
bytecodeArea); bytecodeArea);
bytecodeArea.setText(ClassNodeDecompiler.decompile(cn)); bytecodeArea.setText(ClassNodeDecompiler.decompile(cn));
bytecodeArea.setCaretPosition(0); bytecodeArea.setCaretPosition(0);
bytecodeArea.setEditable(false); 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 if (pane1 == 5) {// hex
@ -635,12 +680,23 @@ public class ClassViewer extends JPanel {
.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA); .setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
bytecodeArea.setCodeFoldingEnabled(true); bytecodeArea.setCodeFoldingEnabled(true);
bytecodeArea.setAntiAliasingEnabled(true); bytecodeArea.setAntiAliasingEnabled(true);
RTextScrollPane bytecodeSPane = new RTextScrollPane( RTextScrollPane scrollPane = new RTextScrollPane(
bytecodeArea); bytecodeArea);
bytecodeArea.setText(SmaliDisassembler.decompileClassNode(cn)); bytecodeArea.setText(SmaliDisassembler.decompileClassNode(cn));
bytecodeArea.setCaretPosition(0); bytecodeArea.setCaretPosition(0);
smali1 = bytecodeArea; 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 if (pane1 == 7) {// krakatau
@ -649,11 +705,22 @@ public class ClassViewer extends JPanel {
.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA); .setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
bytecodeArea.setCodeFoldingEnabled(true); bytecodeArea.setCodeFoldingEnabled(true);
bytecodeArea.setAntiAliasingEnabled(true); bytecodeArea.setAntiAliasingEnabled(true);
RTextScrollPane bytecodeSPane = new RTextScrollPane( RTextScrollPane scrollPane = new RTextScrollPane(
bytecodeArea); bytecodeArea);
bytecodeArea.setText(krak_dc.decompileClassNode(cn)); bytecodeArea.setText(krak_dc.decompileClassNode(cn));
bytecodeArea.setCaretPosition(0); 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); .setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
bytecodeArea.setCodeFoldingEnabled(true); bytecodeArea.setCodeFoldingEnabled(true);
bytecodeArea.setAntiAliasingEnabled(true); bytecodeArea.setAntiAliasingEnabled(true);
RTextScrollPane bytecodeSPane = new RTextScrollPane( RTextScrollPane scrollPane = new RTextScrollPane(
bytecodeArea); bytecodeArea);
bytecodeArea.setText(KrakatauDisassembler.decompileClassNode(cn)); bytecodeArea.setText(KrakatauDisassembler.decompileClassNode(cn));
bytecodeArea.setCaretPosition(0); bytecodeArea.setCaretPosition(0);
krakatau1 = bytecodeArea; 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) { if (pane2 == 1) {
@ -682,6 +760,17 @@ public class ClassViewer extends JPanel {
panelArea.setText(proc_dc.decompileClassNode(cn)); panelArea.setText(proc_dc.decompileClassNode(cn));
panelArea.setCaretPosition(0); panelArea.setCaretPosition(0);
panelArea.setEditable(false); 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); panel2.add(scrollPane);
} }
@ -695,6 +784,17 @@ public class ClassViewer extends JPanel {
panelArea.setText(cfr_dc.decompileClassNode(cn)); panelArea.setText(cfr_dc.decompileClassNode(cn));
panelArea.setCaretPosition(0); panelArea.setCaretPosition(0);
panelArea.setEditable(false); 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); panel2.add(scrollPane);
} }
@ -708,6 +808,17 @@ public class ClassViewer extends JPanel {
panelArea.setText(ff_dc.decompileClassNode(cn)); panelArea.setText(ff_dc.decompileClassNode(cn));
panelArea.setCaretPosition(0); panelArea.setCaretPosition(0);
panelArea.setEditable(false); 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); panel2.add(scrollPane);
} }
@ -720,6 +831,17 @@ public class ClassViewer extends JPanel {
paneArea.setText(ClassNodeDecompiler.decompile(cn)); paneArea.setText(ClassNodeDecompiler.decompile(cn));
paneArea.setCaretPosition(0); paneArea.setCaretPosition(0);
paneArea.setEditable(false); 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); panel2.add(scrollPane);
} }
@ -739,6 +861,17 @@ public class ClassViewer extends JPanel {
paneArea.setText(SmaliDisassembler.decompileClassNode(cn)); paneArea.setText(SmaliDisassembler.decompileClassNode(cn));
paneArea.setCaretPosition(0); paneArea.setCaretPosition(0);
smali2 = paneArea; 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); panel2.add(scrollPane);
} }
@ -748,11 +881,22 @@ public class ClassViewer extends JPanel {
.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA); .setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
bytecodeArea.setCodeFoldingEnabled(true); bytecodeArea.setCodeFoldingEnabled(true);
bytecodeArea.setAntiAliasingEnabled(true); bytecodeArea.setAntiAliasingEnabled(true);
RTextScrollPane bytecodeSPane = new RTextScrollPane( RTextScrollPane scrollPane = new RTextScrollPane(
bytecodeArea); bytecodeArea);
bytecodeArea.setText(krak_dc.decompileClassNode(cn)); bytecodeArea.setText(krak_dc.decompileClassNode(cn));
bytecodeArea.setCaretPosition(0); 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); .setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
bytecodeArea.setCodeFoldingEnabled(true); bytecodeArea.setCodeFoldingEnabled(true);
bytecodeArea.setAntiAliasingEnabled(true); bytecodeArea.setAntiAliasingEnabled(true);
RTextScrollPane bytecodeSPane = new RTextScrollPane( RTextScrollPane scrollPane = new RTextScrollPane(
bytecodeArea); bytecodeArea);
bytecodeArea.setText(KrakatauDisassembler.decompileClassNode(cn)); bytecodeArea.setText(KrakatauDisassembler.decompileClassNode(cn));
bytecodeArea.setCaretPosition(0); bytecodeArea.setCaretPosition(0);
krakatau2 = bytecodeArea; 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) { if (pane3 == 1) {
@ -781,6 +936,17 @@ public class ClassViewer extends JPanel {
panelArea.setText(proc_dc.decompileClassNode(cn)); panelArea.setText(proc_dc.decompileClassNode(cn));
panelArea.setCaretPosition(0); panelArea.setCaretPosition(0);
panelArea.setEditable(false); 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); panel3.add(scrollPane);
} }
@ -794,6 +960,17 @@ public class ClassViewer extends JPanel {
panelArea.setText(cfr_dc.decompileClassNode(cn)); panelArea.setText(cfr_dc.decompileClassNode(cn));
panelArea.setCaretPosition(0); panelArea.setCaretPosition(0);
panelArea.setEditable(false); 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); panel3.add(scrollPane);
} }
@ -807,6 +984,17 @@ public class ClassViewer extends JPanel {
panelArea.setText(ff_dc.decompileClassNode(cn)); panelArea.setText(ff_dc.decompileClassNode(cn));
panelArea.setCaretPosition(0); panelArea.setCaretPosition(0);
panelArea.setEditable(false); 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); panel3.add(scrollPane);
} }
@ -819,6 +1007,17 @@ public class ClassViewer extends JPanel {
paneArea.setText(ClassNodeDecompiler.decompile(cn)); paneArea.setText(ClassNodeDecompiler.decompile(cn));
paneArea.setCaretPosition(0); paneArea.setCaretPosition(0);
paneArea.setEditable(false); 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); panel3.add(scrollPane);
} }
@ -838,6 +1037,17 @@ public class ClassViewer extends JPanel {
paneArea.setText(SmaliDisassembler.decompileClassNode(cn)); paneArea.setText(SmaliDisassembler.decompileClassNode(cn));
paneArea.setCaretPosition(0); paneArea.setCaretPosition(0);
smali3 = paneArea; 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); panel3.add(scrollPane);
} }
@ -847,11 +1057,22 @@ public class ClassViewer extends JPanel {
.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA); .setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
bytecodeArea.setCodeFoldingEnabled(true); bytecodeArea.setCodeFoldingEnabled(true);
bytecodeArea.setAntiAliasingEnabled(true); bytecodeArea.setAntiAliasingEnabled(true);
RTextScrollPane bytecodeSPane = new RTextScrollPane( RTextScrollPane scrollPane = new RTextScrollPane(
bytecodeArea); bytecodeArea);
bytecodeArea.setText(krak_dc.decompileClassNode(cn)); bytecodeArea.setText(krak_dc.decompileClassNode(cn));
bytecodeArea.setCaretPosition(0); 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); .setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
bytecodeArea.setCodeFoldingEnabled(true); bytecodeArea.setCodeFoldingEnabled(true);
bytecodeArea.setAntiAliasingEnabled(true); bytecodeArea.setAntiAliasingEnabled(true);
RTextScrollPane bytecodeSPane = new RTextScrollPane( RTextScrollPane scrollPane = new RTextScrollPane(
bytecodeArea); bytecodeArea);
bytecodeArea.setText(KrakatauDisassembler.decompileClassNode(cn)); bytecodeArea.setText(KrakatauDisassembler.decompileClassNode(cn));
bytecodeArea.setCaretPosition(0); bytecodeArea.setCaretPosition(0);
krakatau3 = bytecodeArea; 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(); resetDivider();

View file

@ -374,11 +374,17 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
} }
private class Test implements KeyEventDispatcher { private class Test implements KeyEventDispatcher {
long last = System.currentTimeMillis();
@Override @Override
public boolean dispatchKeyEvent(KeyEvent e) { public boolean dispatchKeyEvent(KeyEvent e) {
if(System.currentTimeMillis() - last <= (1000 * 4)) checkKey(e);
return false; 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)) { if ((e.getKeyCode() == KeyEvent.VK_O) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
last = System.currentTimeMillis(); last = System.currentTimeMillis();
@ -407,8 +413,6 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
last = System.currentTimeMillis(); last = System.currentTimeMillis();
BytecodeViewer.resetWorkSpace(true); BytecodeViewer.resetWorkSpace(true);
} }
return false;
}
} }
ImageIcon busy = new ImageIcon(getClass().getResource("/resources/1.gif")); ImageIcon busy = new ImageIcon(getClass().getResource("/resources/1.gif"));
@ -436,6 +440,10 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
public final JRadioButtonMenuItem panel3Krakatau = new JRadioButtonMenuItem("Krakatau"); public final JRadioButtonMenuItem panel3Krakatau = new JRadioButtonMenuItem("Krakatau");
public final JRadioButtonMenuItem panel3KrakatauEditable = new JRadioButtonMenuItem("Krakatau Editable"); public final JRadioButtonMenuItem panel3KrakatauEditable = new JRadioButtonMenuItem("Krakatau Editable");
private final JMenuItem mntmSetJreRt = new JMenuItem("Set JRE RT Library"); 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) { public void setIcon(final boolean busy) {
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(new Runnable() {
public void run() { public void run() {
@ -525,6 +533,8 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
panel1Bytecode.addActionListener(listener); panel1Bytecode.addActionListener(listener);
panel1Smali.addActionListener(listener); panel1Smali.addActionListener(listener);
panel1Hexcode.addActionListener(listener); panel1Hexcode.addActionListener(listener);
panel1Krakatau.addActionListener(listener);
panel1KrakatauEditable.addActionListener(listener);
panel2None.addActionListener(listener); panel2None.addActionListener(listener);
panel2Fern.addActionListener(listener); panel2Fern.addActionListener(listener);
panel2Proc.addActionListener(listener); panel2Proc.addActionListener(listener);
@ -532,6 +542,8 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
panel2Bytecode.addActionListener(listener); panel2Bytecode.addActionListener(listener);
panel2Smali.addActionListener(listener); panel2Smali.addActionListener(listener);
panel2Hexcode.addActionListener(listener); panel2Hexcode.addActionListener(listener);
panel2Krakatau.addActionListener(listener);
panel2KrakatauEditable.addActionListener(listener);
panel3None.addActionListener(listener); panel3None.addActionListener(listener);
panel3Fern.addActionListener(listener); panel3Fern.addActionListener(listener);
panel3Proc.addActionListener(listener); panel3Proc.addActionListener(listener);
@ -539,6 +551,8 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
panel3Bytecode.addActionListener(listener); panel3Bytecode.addActionListener(listener);
panel3Smali.addActionListener(listener); panel3Smali.addActionListener(listener);
panel3Hexcode.addActionListener(listener); panel3Hexcode.addActionListener(listener);
panel3Krakatau.addActionListener(listener);
panel3KrakatauEditable.addActionListener(listener);
obfuscatorGroup.add(strongObf); obfuscatorGroup.add(strongObf);
obfuscatorGroup.add(lightObf); obfuscatorGroup.add(lightObf);
obfuscatorGroup.setSelected(strongObf.getModel(), true); obfuscatorGroup.setSelected(strongObf.getModel(), true);
@ -562,7 +576,9 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
JFileChooser fc = new JFileChooser(); JFileChooser fc = new JFileChooser();
try { try {
fc.setSelectedFile(new File(BytecodeViewer.lastDirectory)); File f = new File(BytecodeViewer.lastDirectory);
if(f.exists())
fc.setSelectedFile(f);
} catch(Exception e2) { } catch(Exception e2) {
} }
@ -1054,6 +1070,14 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
menuBar.add(mnNewMenu_6); 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_6.add(mnNewMenu_7);
mnNewMenu_7.add(panel1None); mnNewMenu_7.add(panel1None);