A bunch of changes for 2.9.3
* -----2.9.3-----: * 02/28/2015 - Added drag and drop for any file. * 02/28/2015 - Added ctrl + w to close the current opened tab. * 02/28/2015 - Updated to CFR 0_97.jar * 02/28/2015 - Fixed a concurrency issue with the decompilers. * 02/28/2015 - Added image resize via scroll on mouse. * 02/28/2015 - Added resource refreshing. * 02/28/2015 - Im Frizzy started working on Obfuscation.
This commit is contained in:
parent
90241eb232
commit
a1dc3aecc6
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
/bin/
|
||||
.classpath
|
||||
.project
|
Binary file not shown.
|
@ -8,6 +8,6 @@ public class Skeleton extends Plugin {
|
|||
public void execute(ArrayList<ClassNode> classNodesList) {
|
||||
PluginConsole gui = new PluginConsole("Skeleton");
|
||||
gui.setVisible(true);
|
||||
gui.appendText("exceuted skeleton");
|
||||
gui.appendText("executed skeleton");
|
||||
}
|
||||
}
|
|
@ -3,6 +3,7 @@ package the.bytecode.club.bytecodeviewer;
|
|||
import java.awt.Desktop;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
|
@ -14,7 +15,6 @@ import java.net.URI;
|
|||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.swing.JDialog;
|
||||
|
@ -76,15 +76,22 @@ import the.bytecode.club.bytecodeviewer.obfuscators.mapping.Refactorer;
|
|||
* bytecode editor that works by editing per method instead of entire class, methods are in a pane like the file navigator
|
||||
* Make the tabs menu and middle mouse button click work on the tab itself not just the close button.
|
||||
*
|
||||
* 2.9.2:
|
||||
* before 3.0.0:
|
||||
* make it use that global last used inside of export as jar
|
||||
* Spiffy up the plugin console with hilighted lines
|
||||
* Take https://github.com/ptnkjke/Java-Bytecode-Editor visualize
|
||||
* fix the randomly sometimes fucked up names on file navigation bug
|
||||
* make zipfile not include the decode shit
|
||||
* When you drag a folder, it must add the folder name not just the child into the root jtree path
|
||||
*
|
||||
* -----2.9.2-----:
|
||||
* 02/24/2015 - Actually fixed the compiler, LOL.
|
||||
* -----2.9.3-----:
|
||||
* 02/28/2015 - Added drag and drop for any file.
|
||||
* 02/28/2015 - Added ctrl + w to close the current opened tab.
|
||||
* 02/28/2015 - Updated to CFR 0_97.jar
|
||||
* 02/28/2015 - Fixed a concurrency issue with the decompilers.
|
||||
* 02/28/2015 - Added image resize via scroll on mouse.
|
||||
* 02/28/2015 - Added resource refreshing.
|
||||
* 02/28/2015 - Im Frizzy started working on Obfuscation.
|
||||
*
|
||||
* @author Konloch
|
||||
*
|
||||
|
@ -93,7 +100,7 @@ import the.bytecode.club.bytecodeviewer.obfuscators.mapping.Refactorer;
|
|||
public class BytecodeViewer {
|
||||
|
||||
/*per version*/
|
||||
public static String version = "2.9.2";
|
||||
public static String version = "2.9.3";
|
||||
public static String krakatauVersion = "2";
|
||||
/*the rest*/
|
||||
public static MainViewerGUI viewer = null;
|
||||
|
@ -118,10 +125,7 @@ public class BytecodeViewer {
|
|||
private static long start = System.currentTimeMillis();
|
||||
public static String lastDirectory = "";
|
||||
public static ArrayList<Process> krakatau = new ArrayList<Process>();
|
||||
|
||||
/* ASM Re-mapping Constants */
|
||||
public static Refactorer refactorer = new Refactorer();
|
||||
/* ASM Re-mapping Constants */
|
||||
|
||||
/**
|
||||
* The version checker thread
|
||||
|
@ -354,7 +358,7 @@ public class BytecodeViewer {
|
|||
* @return the currently opened ClassNode
|
||||
*/
|
||||
public static ClassNode getCurrentlyOpenedClassNode() {
|
||||
return viewer.workPane.getCurrentClass().cn;
|
||||
return viewer.workPane.getCurrentViewer().cn;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -388,18 +392,6 @@ public class BytecodeViewer {
|
|||
BytecodeViewer.loadedClasses.remove(oldNode.name);
|
||||
BytecodeViewer.loadedClasses.put(oldNode.name, newNode);
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces an old node with a new instance
|
||||
* @param oldNode the old instance
|
||||
* @param newNode the new instance
|
||||
*/
|
||||
public static void relocate(String name, ClassNode node) {
|
||||
if (BytecodeViewer.loadedClasses.containsKey(name))
|
||||
BytecodeViewer.loadedClasses.remove(name);
|
||||
|
||||
BytecodeViewer.loadedClasses.put(node.name, node);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all of the loaded classes as an array list
|
||||
|
@ -422,9 +414,6 @@ public class BytecodeViewer {
|
|||
* @return true if no errors, false if it failed to compile.
|
||||
*/
|
||||
public static boolean compile(boolean message) {
|
||||
if(getLoadedClasses().isEmpty())
|
||||
return false;
|
||||
|
||||
boolean actuallyTried = false;
|
||||
|
||||
for(java.awt.Component c : BytecodeViewer.viewer.workPane.getLoadedViewers()) {
|
||||
|
@ -620,6 +609,9 @@ public class BytecodeViewer {
|
|||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||
}
|
||||
return;
|
||||
} else {
|
||||
byte[] bytes = JarUtils.getBytes(new FileInputStream(f));
|
||||
BytecodeViewer.loadedResources.put(f.getName(), bytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -672,12 +664,10 @@ public class BytecodeViewer {
|
|||
if(!ask) {
|
||||
loadedResources.clear();
|
||||
loadedClasses.clear();
|
||||
MainViewerGUI.getComponent(FileNavigationPane.class)
|
||||
.resetWorkspace();
|
||||
MainViewerGUI.getComponent(FileNavigationPane.class).resetWorkspace();
|
||||
MainViewerGUI.getComponent(WorkPane.class).resetWorkspace();
|
||||
MainViewerGUI.getComponent(SearchingPane.class).resetWorkspace();
|
||||
the.bytecode.club.bytecodeviewer.api.BytecodeViewer
|
||||
.getClassNodeLoader().clear();
|
||||
the.bytecode.club.bytecodeviewer.api.BytecodeViewer.getClassNodeLoader().clear();
|
||||
} else {
|
||||
JOptionPane pane = new JOptionPane(
|
||||
"Are you sure you want to reset the workspace?\n\rIt will also reset your file navigator and search.");
|
||||
|
@ -695,12 +685,10 @@ public class BytecodeViewer {
|
|||
if (result == 0) {
|
||||
loadedResources.clear();
|
||||
loadedClasses.clear();
|
||||
MainViewerGUI.getComponent(FileNavigationPane.class)
|
||||
.resetWorkspace();
|
||||
MainViewerGUI.getComponent(FileNavigationPane.class).resetWorkspace();
|
||||
MainViewerGUI.getComponent(WorkPane.class).resetWorkspace();
|
||||
MainViewerGUI.getComponent(SearchingPane.class).resetWorkspace();
|
||||
the.bytecode.club.bytecodeviewer.api.BytecodeViewer
|
||||
.getClassNodeLoader().clear();
|
||||
the.bytecode.club.bytecodeviewer.api.BytecodeViewer.getClassNodeLoader().clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -828,6 +816,19 @@ public class BytecodeViewer {
|
|||
return name;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Replaces an old node with a new instance
|
||||
* @param oldNode the old instance
|
||||
* @param newNode the new instance
|
||||
*/
|
||||
public static void relocate(String name, ClassNode node) {
|
||||
if (BytecodeViewer.loadedClasses.containsKey(name))
|
||||
BytecodeViewer.loadedClasses.remove(name);
|
||||
|
||||
BytecodeViewer.loadedClasses.put(node.name, node);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the BCV directory
|
||||
* @return the static BCV directory
|
||||
|
@ -876,4 +877,46 @@ public class BytecodeViewer {
|
|||
s += r + nl;
|
||||
return s;
|
||||
}
|
||||
|
||||
private static long last = System.currentTimeMillis();
|
||||
/**
|
||||
* Checks the hotkeys
|
||||
* @param e
|
||||
*/
|
||||
public static void checkHotKey(KeyEvent e) {
|
||||
if(System.currentTimeMillis() - last <= (4000))
|
||||
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(viewer.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);
|
||||
} else if ((e.getKeyCode() == KeyEvent.VK_W) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
|
||||
last = System.currentTimeMillis();
|
||||
if(viewer.workPane.getCurrentViewer() != null)
|
||||
viewer.workPane.tabs.remove(viewer.workPane.getCurrentViewer());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -55,7 +55,7 @@ public class PluginConsole extends JFrame {
|
|||
field.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
|
|
@ -36,12 +36,7 @@ public class CFRDecompiler extends Decompiler {
|
|||
|
||||
@Override
|
||||
public void decompileToClass(String className, String classNameSaved) {
|
||||
String contents = decompileClassNode(BytecodeViewer.getClassNode(className));
|
||||
DiskWriter.replaceFile(classNameSaved, contents, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String decompileClassNode(ClassNode cn) {
|
||||
ClassNode cn = BytecodeViewer.getClassNode(className);
|
||||
final ClassWriter cw = new ClassWriter(0);
|
||||
try {
|
||||
cn.accept(cw);
|
||||
|
@ -52,7 +47,12 @@ public class CFRDecompiler extends Decompiler {
|
|||
cn.accept(cw);
|
||||
} catch (InterruptedException e1) { }
|
||||
}
|
||||
|
||||
String contents = decompileClassNode(cn, cw.toByteArray());
|
||||
DiskWriter.replaceFile(classNameSaved, contents, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String decompileClassNode(ClassNode cn, byte[] b) {
|
||||
String fileStart = BytecodeViewer.tempDirectory + BytecodeViewer.fs;
|
||||
|
||||
final File tempClass = new File(MiscUtils.getUniqueName(fileStart, ".class") + ".class");
|
||||
|
@ -60,7 +60,7 @@ public class CFRDecompiler extends Decompiler {
|
|||
try {
|
||||
final FileOutputStream fos = new FileOutputStream(tempClass);
|
||||
|
||||
fos.write(cw.toByteArray());
|
||||
fos.write(b);
|
||||
|
||||
fos.close();
|
||||
} catch (final IOException e) {
|
||||
|
|
|
@ -13,7 +13,7 @@ import the.bytecode.club.bytecodeviewer.decompilers.bytecode.ClassNodeDecompiler
|
|||
|
||||
public abstract class Decompiler {
|
||||
|
||||
public abstract String decompileClassNode(ClassNode cn);
|
||||
public abstract String decompileClassNode(ClassNode cn, byte[] b);
|
||||
|
||||
public abstract void decompileToZip(String zipName);
|
||||
|
||||
|
|
|
@ -28,7 +28,18 @@ public class FernFlowerDecompiler extends Decompiler {
|
|||
|
||||
@Override
|
||||
public void decompileToClass(String className, String classNameSaved) {
|
||||
String contents = decompileClassNode(BytecodeViewer.getClassNode(className));
|
||||
ClassNode cn = BytecodeViewer.getClassNode(className);
|
||||
final ClassWriter cw = new ClassWriter(0);
|
||||
try {
|
||||
cn.accept(cw);
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
try {
|
||||
Thread.sleep(200);
|
||||
cn.accept(cw);
|
||||
} catch (InterruptedException e1) { }
|
||||
}
|
||||
String contents = decompileClassNode(cn, cw.toByteArray());
|
||||
DiskWriter.replaceFile(classNameSaved, contents, false);
|
||||
}
|
||||
|
||||
|
@ -60,10 +71,7 @@ public class FernFlowerDecompiler extends Decompiler {
|
|||
}
|
||||
|
||||
@Override
|
||||
public String decompileClassNode(final ClassNode cn) {
|
||||
final ClassWriter cw = new ClassWriter(0);
|
||||
cn.accept(cw);
|
||||
|
||||
public String decompileClassNode(final ClassNode cn, byte[] b) {
|
||||
String start = MiscUtils.getUniqueName("", ".class");
|
||||
|
||||
final File tempClass = new File(start + ".class");
|
||||
|
@ -72,7 +80,7 @@ public class FernFlowerDecompiler extends Decompiler {
|
|||
try {
|
||||
final FileOutputStream fos = new FileOutputStream(tempClass);
|
||||
|
||||
fos.write(cw.toByteArray());
|
||||
fos.write(b);
|
||||
|
||||
fos.close();
|
||||
} catch (final IOException e) {
|
||||
|
|
|
@ -25,7 +25,7 @@ import the.bytecode.club.bytecodeviewer.ZipUtils;
|
|||
|
||||
public class KrakatauDecompiler extends Decompiler {
|
||||
|
||||
public String decompileClassNode(ClassNode cn) {
|
||||
public String decompileClassNode(ClassNode cn, byte[] b) {
|
||||
|
||||
if(BytecodeViewer.python.equals("")) {
|
||||
BytecodeViewer.showMessage("You need to set your Python 2.7 executable path.");
|
||||
|
|
|
@ -24,7 +24,7 @@ import the.bytecode.club.bytecodeviewer.MiscUtils;
|
|||
|
||||
public class KrakatauDisassembler extends Decompiler {
|
||||
|
||||
public String decompileClassNode(ClassNode cn) {
|
||||
public String decompileClassNode(ClassNode cn, byte[] b) {
|
||||
if(BytecodeViewer.python.equals("")) {
|
||||
BytecodeViewer.showMessage("You need to set your Python 2.7 executable path.");
|
||||
BytecodeViewer.viewer.pythonC();
|
||||
|
|
|
@ -53,7 +53,18 @@ public class ProcyonDecompiler extends Decompiler {
|
|||
|
||||
@Override
|
||||
public void decompileToClass(String className, String classNameSaved) {
|
||||
String contents = decompileClassNode(BytecodeViewer.getClassNode(className));
|
||||
ClassNode cn = BytecodeViewer.getClassNode(className);
|
||||
final ClassWriter cw = new ClassWriter(0);
|
||||
try {
|
||||
cn.accept(cw);
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
try {
|
||||
Thread.sleep(200);
|
||||
cn.accept(cw);
|
||||
} catch (InterruptedException e1) { }
|
||||
}
|
||||
String contents = decompileClassNode(cn, cw.toByteArray());
|
||||
DiskWriter.replaceFile(classNameSaved, contents, false);
|
||||
}
|
||||
|
||||
|
@ -92,12 +103,9 @@ public class ProcyonDecompiler extends Decompiler {
|
|||
}
|
||||
|
||||
@Override
|
||||
public String decompileClassNode(ClassNode cn) {
|
||||
public String decompileClassNode(ClassNode cn, byte[] b) {
|
||||
String exception = "";
|
||||
try {
|
||||
final ClassWriter cw = new ClassWriter(0);
|
||||
cn.accept(cw);
|
||||
|
||||
String fileStart = BytecodeViewer.tempDirectory + BytecodeViewer.fs
|
||||
+ "temp";
|
||||
|
||||
|
@ -106,7 +114,7 @@ public class ProcyonDecompiler extends Decompiler {
|
|||
try {
|
||||
final FileOutputStream fos = new FileOutputStream(tempClass);
|
||||
|
||||
fos.write(cw.toByteArray());
|
||||
fos.write(b);
|
||||
|
||||
fos.close();
|
||||
} catch (final IOException e) {
|
||||
|
|
|
@ -6,7 +6,6 @@ import java.io.IOException;
|
|||
|
||||
import me.konloch.kontainer.io.DiskReader;
|
||||
|
||||
import org.objectweb.asm.ClassWriter;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
|
||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||
|
@ -23,10 +22,7 @@ import the.bytecode.club.bytecodeviewer.ZipUtils;
|
|||
|
||||
public class SmaliDisassembler extends Decompiler {
|
||||
|
||||
public String decompileClassNode(ClassNode cn) {
|
||||
final ClassWriter cw = new ClassWriter(0);
|
||||
cn.accept(cw);
|
||||
|
||||
public String decompileClassNode(ClassNode cn, byte[] b) {
|
||||
String fileStart = BytecodeViewer.tempDirectory + BytecodeViewer.fs
|
||||
+ "temp";
|
||||
|
||||
|
@ -40,7 +36,7 @@ public class SmaliDisassembler extends Decompiler {
|
|||
try {
|
||||
final FileOutputStream fos = new FileOutputStream(tempClass);
|
||||
|
||||
fos.write(cw.toByteArray());
|
||||
fos.write(b);
|
||||
|
||||
fos.close();
|
||||
} catch (final IOException e) {
|
||||
|
|
|
@ -21,7 +21,7 @@ import the.bytecode.club.bytecodeviewer.decompilers.Decompiler;
|
|||
|
||||
public class ClassNodeDecompiler extends Decompiler {
|
||||
|
||||
public String decompileClassNode(ClassNode cn) {
|
||||
public String decompileClassNode(ClassNode cn, byte[] b) {
|
||||
return decompile(new PrefixedStringBuilder(),
|
||||
new ArrayList<String>(), cn).toString();
|
||||
}
|
||||
|
|
|
@ -55,7 +55,7 @@ import the.bytecode.club.bytecodeviewer.decompilers.Decompiler;
|
|||
*
|
||||
*/
|
||||
|
||||
public class ClassViewer extends JPanel {
|
||||
public class ClassViewer extends Viewer {
|
||||
|
||||
/**
|
||||
* Whoever wrote this function, THANK YOU!
|
||||
|
@ -544,6 +544,17 @@ public class ClassViewer extends JPanel {
|
|||
if (pane3 != 0 && pane3 != 5)
|
||||
panel3.add(panel3Search, BorderLayout.NORTH);
|
||||
|
||||
final ClassWriter cw = new ClassWriter(0);
|
||||
try {
|
||||
cn.accept(cw);
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
try {
|
||||
Thread.sleep(200);
|
||||
cn.accept(cw);
|
||||
} catch (InterruptedException e1) { }
|
||||
}
|
||||
final byte[] b = cw.toByteArray();
|
||||
Thread t1 = new PaneUpdaterThread() {
|
||||
@Override
|
||||
public void doShit() {
|
||||
|
@ -555,7 +566,7 @@ public class ClassViewer extends JPanel {
|
|||
panelArea.setCodeFoldingEnabled(true);
|
||||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(panelArea);
|
||||
panelArea.setText(Decompiler.procyon.decompileClassNode(cn));
|
||||
panelArea.setText(Decompiler.procyon.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(BytecodeViewer.viewer.pane1Editable.isSelected());
|
||||
panelArea.addKeyListener(new KeyListener() {
|
||||
|
@ -565,7 +576,7 @@ public class ClassViewer extends JPanel {
|
|||
field1.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
@ -580,7 +591,7 @@ public class ClassViewer extends JPanel {
|
|||
panelArea.setCodeFoldingEnabled(true);
|
||||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(panelArea);
|
||||
panelArea.setText(Decompiler.cfr.decompileClassNode(cn));
|
||||
panelArea.setText(Decompiler.cfr.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(BytecodeViewer.viewer.pane1Editable.isSelected());
|
||||
panelArea.addKeyListener(new KeyListener() {
|
||||
|
@ -589,7 +600,7 @@ public class ClassViewer extends JPanel {
|
|||
field1.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
@ -605,7 +616,7 @@ public class ClassViewer extends JPanel {
|
|||
panelArea.setCodeFoldingEnabled(true);
|
||||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(panelArea);
|
||||
panelArea.setText(Decompiler.fernflower.decompileClassNode(cn));
|
||||
panelArea.setText(Decompiler.fernflower.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(BytecodeViewer.viewer.pane1Editable.isSelected());
|
||||
panelArea.addKeyListener(new KeyListener() {
|
||||
|
@ -614,7 +625,7 @@ public class ClassViewer extends JPanel {
|
|||
field1.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
@ -631,7 +642,7 @@ public class ClassViewer extends JPanel {
|
|||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(
|
||||
panelArea);
|
||||
panelArea.setText(Decompiler.bytecode.decompileClassNode(cn));
|
||||
panelArea.setText(Decompiler.bytecode.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(false);
|
||||
panelArea.addKeyListener(new KeyListener() {
|
||||
|
@ -640,7 +651,7 @@ public class ClassViewer extends JPanel {
|
|||
field1.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
@ -663,7 +674,7 @@ public class ClassViewer extends JPanel {
|
|||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(
|
||||
panelArea);
|
||||
panelArea.setText(Decompiler.smali.decompileClassNode(cn));
|
||||
panelArea.setText(Decompiler.smali.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(BytecodeViewer.viewer.pane1Editable.isSelected());
|
||||
smali1 = panelArea;
|
||||
|
@ -673,7 +684,7 @@ public class ClassViewer extends JPanel {
|
|||
field1.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
@ -689,7 +700,7 @@ public class ClassViewer extends JPanel {
|
|||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(
|
||||
panelArea);
|
||||
panelArea.setText(Decompiler.krakatau.decompileClassNode(cn));
|
||||
panelArea.setText(Decompiler.krakatau.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(BytecodeViewer.viewer.pane1Editable.isSelected());
|
||||
panelArea.addKeyListener(new KeyListener() {
|
||||
|
@ -698,7 +709,7 @@ public class ClassViewer extends JPanel {
|
|||
field1.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
@ -717,7 +728,7 @@ public class ClassViewer extends JPanel {
|
|||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(
|
||||
panelArea);
|
||||
panelArea.setText(Decompiler.krakatauDA.decompileClassNode(cn));
|
||||
panelArea.setText(Decompiler.krakatauDA.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(BytecodeViewer.viewer.pane1Editable.isSelected());
|
||||
krakatau1 = panelArea;
|
||||
|
@ -727,7 +738,7 @@ public class ClassViewer extends JPanel {
|
|||
field1.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
@ -757,7 +768,7 @@ public class ClassViewer extends JPanel {
|
|||
panelArea.setCodeFoldingEnabled(true);
|
||||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(panelArea);
|
||||
panelArea.setText(Decompiler.procyon.decompileClassNode(cn));
|
||||
panelArea.setText(Decompiler.procyon.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(BytecodeViewer.viewer.pane2Editable.isSelected());
|
||||
panelArea.addKeyListener(new KeyListener() {
|
||||
|
@ -766,7 +777,7 @@ public class ClassViewer extends JPanel {
|
|||
field2.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
@ -782,7 +793,7 @@ public class ClassViewer extends JPanel {
|
|||
panelArea.setCodeFoldingEnabled(true);
|
||||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(panelArea);
|
||||
panelArea.setText(Decompiler.cfr.decompileClassNode(cn));
|
||||
panelArea.setText(Decompiler.cfr.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(BytecodeViewer.viewer.pane2Editable.isSelected());
|
||||
panelArea.addKeyListener(new KeyListener() {
|
||||
|
@ -791,7 +802,7 @@ public class ClassViewer extends JPanel {
|
|||
field2.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
@ -807,7 +818,7 @@ public class ClassViewer extends JPanel {
|
|||
panelArea.setCodeFoldingEnabled(true);
|
||||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(panelArea);
|
||||
panelArea.setText(Decompiler.fernflower.decompileClassNode(cn));
|
||||
panelArea.setText(Decompiler.fernflower.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(BytecodeViewer.viewer.pane2Editable.isSelected());
|
||||
panelArea.addKeyListener(new KeyListener() {
|
||||
|
@ -816,7 +827,7 @@ public class ClassViewer extends JPanel {
|
|||
field2.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
@ -831,7 +842,7 @@ public class ClassViewer extends JPanel {
|
|||
panelArea.setCodeFoldingEnabled(true);
|
||||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(panelArea);
|
||||
panelArea.setText(Decompiler.bytecode.decompileClassNode(cn));
|
||||
panelArea.setText(Decompiler.bytecode.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(false);
|
||||
panelArea.addKeyListener(new KeyListener() {
|
||||
|
@ -840,7 +851,7 @@ public class ClassViewer extends JPanel {
|
|||
field2.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
@ -861,7 +872,7 @@ public class ClassViewer extends JPanel {
|
|||
panelArea.setCodeFoldingEnabled(true);
|
||||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(panelArea);
|
||||
panelArea.setText(Decompiler.smali.decompileClassNode(cn));
|
||||
panelArea.setText(Decompiler.smali.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(BytecodeViewer.viewer.pane2Editable.isSelected());
|
||||
smali2 = panelArea;
|
||||
|
@ -871,7 +882,7 @@ public class ClassViewer extends JPanel {
|
|||
field2.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
@ -887,7 +898,7 @@ public class ClassViewer extends JPanel {
|
|||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(
|
||||
panelArea);
|
||||
panelArea.setText(Decompiler.krakatau.decompileClassNode(cn));
|
||||
panelArea.setText(Decompiler.krakatau.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(BytecodeViewer.viewer.pane2Editable.isSelected());
|
||||
panelArea.addKeyListener(new KeyListener() {
|
||||
|
@ -896,7 +907,7 @@ public class ClassViewer extends JPanel {
|
|||
field2.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
@ -913,7 +924,7 @@ public class ClassViewer extends JPanel {
|
|||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(
|
||||
panelArea);
|
||||
panelArea.setText(Decompiler.krakatauDA.decompileClassNode(cn));
|
||||
panelArea.setText(Decompiler.krakatauDA.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(BytecodeViewer.viewer.pane2Editable.isSelected());
|
||||
krakatau2 = panelArea;
|
||||
|
@ -923,7 +934,7 @@ public class ClassViewer extends JPanel {
|
|||
field2.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
@ -954,7 +965,7 @@ public class ClassViewer extends JPanel {
|
|||
panelArea.setCodeFoldingEnabled(true);
|
||||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(panelArea);
|
||||
panelArea.setText(Decompiler.procyon.decompileClassNode(cn));
|
||||
panelArea.setText(Decompiler.procyon.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(BytecodeViewer.viewer.pane3Editable.isSelected());
|
||||
panelArea.addKeyListener(new KeyListener() {
|
||||
|
@ -963,7 +974,7 @@ public class ClassViewer extends JPanel {
|
|||
field3.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
@ -979,7 +990,7 @@ public class ClassViewer extends JPanel {
|
|||
panelArea.setCodeFoldingEnabled(true);
|
||||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(panelArea);
|
||||
panelArea.setText(Decompiler.cfr.decompileClassNode(cn));
|
||||
panelArea.setText(Decompiler.cfr.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(BytecodeViewer.viewer.pane3Editable.isSelected());
|
||||
panelArea.addKeyListener(new KeyListener() {
|
||||
|
@ -988,7 +999,7 @@ public class ClassViewer extends JPanel {
|
|||
field3.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
@ -1004,7 +1015,7 @@ public class ClassViewer extends JPanel {
|
|||
panelArea.setCodeFoldingEnabled(true);
|
||||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(panelArea);
|
||||
panelArea.setText(Decompiler.fernflower.decompileClassNode(cn));
|
||||
panelArea.setText(Decompiler.fernflower.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(BytecodeViewer.viewer.pane3Editable.isSelected());
|
||||
panelArea.addKeyListener(new KeyListener() {
|
||||
|
@ -1013,7 +1024,7 @@ public class ClassViewer extends JPanel {
|
|||
field3.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
@ -1028,7 +1039,7 @@ public class ClassViewer extends JPanel {
|
|||
panelArea.setCodeFoldingEnabled(true);
|
||||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(panelArea);
|
||||
panelArea.setText(Decompiler.bytecode.decompileClassNode(cn));
|
||||
panelArea.setText(Decompiler.bytecode.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(false);
|
||||
panelArea.addKeyListener(new KeyListener() {
|
||||
|
@ -1037,7 +1048,7 @@ public class ClassViewer extends JPanel {
|
|||
field3.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
@ -1058,7 +1069,7 @@ public class ClassViewer extends JPanel {
|
|||
panelArea.setCodeFoldingEnabled(true);
|
||||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(panelArea);
|
||||
panelArea.setText(Decompiler.smali.decompileClassNode(cn));
|
||||
panelArea.setText(Decompiler.smali.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(BytecodeViewer.viewer.pane3Editable.isSelected());
|
||||
smali3 = panelArea;
|
||||
|
@ -1068,7 +1079,7 @@ public class ClassViewer extends JPanel {
|
|||
field3.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
@ -1084,7 +1095,7 @@ public class ClassViewer extends JPanel {
|
|||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(
|
||||
panelArea);
|
||||
panelArea.setText(Decompiler.krakatau.decompileClassNode(cn));
|
||||
panelArea.setText(Decompiler.krakatau.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(BytecodeViewer.viewer.pane3Editable.isSelected());
|
||||
panelArea.addKeyListener(new KeyListener() {
|
||||
|
@ -1093,7 +1104,7 @@ public class ClassViewer extends JPanel {
|
|||
field3.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
@ -1112,7 +1123,7 @@ public class ClassViewer extends JPanel {
|
|||
panelArea.setAntiAliasingEnabled(true);
|
||||
RTextScrollPane scrollPane = new RTextScrollPane(
|
||||
panelArea);
|
||||
panelArea.setText(Decompiler.krakatauDA.decompileClassNode(cn));
|
||||
panelArea.setText(Decompiler.krakatauDA.decompileClassNode(cn,b));
|
||||
panelArea.setCaretPosition(0);
|
||||
panelArea.setEditable(BytecodeViewer.viewer.pane3Editable.isSelected());
|
||||
krakatau3 = panelArea;
|
||||
|
@ -1122,7 +1133,7 @@ public class ClassViewer extends JPanel {
|
|||
field3.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
|
|
@ -2,12 +2,15 @@ package the.bytecode.club.bytecodeviewer.gui;
|
|||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Color;
|
||||
import java.awt.Image;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.event.KeyListener;
|
||||
import java.awt.event.MouseWheelEvent;
|
||||
import java.awt.event.MouseWheelListener;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.CharsetEncoder;
|
||||
|
||||
|
@ -26,6 +29,7 @@ import javax.swing.text.JTextComponent;
|
|||
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
|
||||
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
|
||||
import org.fife.ui.rtextarea.RTextScrollPane;
|
||||
import org.imgscalr.Scalr;
|
||||
|
||||
import com.jhe.hexed.JHexEditor;
|
||||
|
||||
|
@ -39,7 +43,7 @@ import the.bytecode.club.bytecodeviewer.Resources;
|
|||
*
|
||||
*/
|
||||
|
||||
public class FileViewer extends JPanel {
|
||||
public class FileViewer extends Viewer {
|
||||
|
||||
private static final long serialVersionUID = 6103372882168257164L;
|
||||
|
||||
|
@ -50,6 +54,7 @@ public class FileViewer extends JPanel {
|
|||
JPanel panel2 = new JPanel(new BorderLayout());
|
||||
public JCheckBox check = new JCheckBox("Exact");
|
||||
final JTextField field = new JTextField();
|
||||
public BufferedImage image;
|
||||
|
||||
public void setContents() {
|
||||
String name = this.name.toLowerCase();
|
||||
|
@ -62,7 +67,7 @@ public class FileViewer extends JPanel {
|
|||
field.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
@ -75,9 +80,26 @@ public class FileViewer extends JPanel {
|
|||
name.endsWith(".gif") || name.endsWith(".tif") || name.endsWith(".bmp"))
|
||||
{
|
||||
try {
|
||||
final Image i = ImageIO.read(new ByteArrayInputStream(contents)); //gifs fail cause of this
|
||||
JLabel label = new JLabel("", new ImageIcon(i), JLabel.CENTER);
|
||||
image = ImageIO.read(new ByteArrayInputStream(contents)); //gifs fail cause of this
|
||||
JLabel label = new JLabel("", new ImageIcon(image), JLabel.CENTER);
|
||||
panel2.add( label, BorderLayout.CENTER );
|
||||
panel2.addMouseWheelListener(new MouseWheelListener() {
|
||||
|
||||
@Override
|
||||
public void mouseWheelMoved(MouseWheelEvent e) {
|
||||
int notches = e.getWheelRotation();
|
||||
if (notches < 0) {
|
||||
image = Scalr.resize(image, Scalr.Method.SPEED, image.getWidth() + 10, image.getHeight() + 10);
|
||||
} else {
|
||||
image = Scalr.resize(image, Scalr.Method.SPEED, image.getWidth() - 10, image.getHeight() - 10);
|
||||
}
|
||||
panel2.removeAll();
|
||||
JLabel label = new JLabel("", new ImageIcon(image), JLabel.CENTER);
|
||||
panel2.add( label, BorderLayout.CENTER );
|
||||
panel2.updateUI();
|
||||
}
|
||||
|
||||
});
|
||||
return;
|
||||
} catch(Exception e) {
|
||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||
|
@ -340,4 +362,18 @@ public class FileViewer extends JPanel {
|
|||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void refresh(JButton src) {
|
||||
panel2.removeAll();
|
||||
try {
|
||||
image = ImageIO.read(new ByteArrayInputStream(contents));
|
||||
} catch (IOException e) {
|
||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||
}
|
||||
JLabel label = new JLabel("", new ImageIcon(image), JLabel.CENTER);
|
||||
panel2.add( label, BorderLayout.CENTER );
|
||||
panel2.updateUI();
|
||||
|
||||
src.setEnabled(true);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -385,45 +385,11 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
private class Test implements KeyEventDispatcher {
|
||||
@Override
|
||||
public boolean dispatchKeyEvent(KeyEvent e) {
|
||||
checkKey(e);
|
||||
BytecodeViewer.checkHotKey(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);
|
||||
}
|
||||
}
|
||||
|
||||
private final JMenuItem mntmSaveAsApk = new JMenuItem("Save As DEX..");
|
||||
private final JMenuItem mntmCodeSequenceDiagram = new JMenuItem("Code Sequence Diagram");
|
||||
private final JSeparator separator_7 = new JSeparator();
|
||||
|
@ -476,7 +442,6 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
|
||||
public MainViewerGUI() {
|
||||
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new Test());
|
||||
mnNewMenu_5.setVisible(true);
|
||||
this.addWindowStateListener(new WindowAdapter() {
|
||||
public void windowStateChanged(WindowEvent evt) {
|
||||
int oldState = evt.getOldState();
|
||||
|
@ -527,7 +492,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
@Override
|
||||
public void actionPerformed(ActionEvent arg0) {
|
||||
if(refreshOnChange.isSelected()) {
|
||||
if(workPane.getCurrentClass() == null)
|
||||
if(workPane.getCurrentViewer() == null)
|
||||
return;
|
||||
|
||||
workPane.refreshClass.doClick();
|
||||
|
@ -923,13 +888,13 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
|||
});
|
||||
mntmNewMenuItem_12.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent arg0) {
|
||||
if(workPane.getCurrentClass() == null) {
|
||||
if(workPane.getCurrentViewer() == null) {
|
||||
BytecodeViewer.showMessage("First open a class, jar, zip, apk or dex file.");
|
||||
return;
|
||||
}
|
||||
if(autoCompileSmali.isSelected() && !BytecodeViewer.compile(false))
|
||||
return;
|
||||
final String s = workPane.getCurrentClass().name;
|
||||
final String s = workPane.getCurrentViewer().name;
|
||||
|
||||
JFileChooser fc = new JFileChooser();
|
||||
fc.setFileFilter(new JavaFileFilter());
|
||||
|
|
|
@ -164,8 +164,7 @@ public class SearchingPane extends VisibleComponent {
|
|||
.showMessage("You currently have a search performing in the background, please wait for that to finish.");
|
||||
}
|
||||
} else if (radius == SearchRadius.Current_Class) {
|
||||
final ClassViewer cv = MainViewerGUI.getComponent(
|
||||
WorkPane.class).getCurrentClass();
|
||||
final Viewer cv = MainViewerGUI.getComponent(WorkPane.class).getCurrentViewer();
|
||||
if (cv != null) {
|
||||
searchType.details.search(cv.cn, srn,
|
||||
exact.isSelected());
|
||||
|
|
|
@ -59,7 +59,7 @@ public class SystemErrConsole extends JFrame {
|
|||
field.requestFocus();
|
||||
}
|
||||
|
||||
BytecodeViewer.viewer.checkKey(e);
|
||||
BytecodeViewer.checkHotKey(e);
|
||||
}
|
||||
@Override public void keyReleased(KeyEvent arg0) { }
|
||||
@Override public void keyTyped(KeyEvent arg0) { }
|
||||
|
|
13
src/the/bytecode/club/bytecodeviewer/gui/Viewer.java
Normal file
13
src/the/bytecode/club/bytecodeviewer/gui/Viewer.java
Normal file
|
@ -0,0 +1,13 @@
|
|||
package the.bytecode.club.bytecodeviewer.gui;
|
||||
|
||||
import javax.swing.JPanel;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
|
||||
public abstract class Viewer extends JPanel {
|
||||
|
||||
public ClassNode cn;
|
||||
public String name;
|
||||
|
||||
private static final long serialVersionUID = -2965538493489119191L;
|
||||
|
||||
}
|
|
@ -33,7 +33,7 @@ public class WorkPane extends VisibleComponent implements ActionListener {
|
|||
private static final long serialVersionUID = 6542337997679487946L;
|
||||
|
||||
FileChangeNotifier fcn;
|
||||
JTabbedPane tabs;
|
||||
public JTabbedPane tabs;
|
||||
|
||||
JPanel buttonPanel;
|
||||
JButton refreshClass;
|
||||
|
@ -55,7 +55,7 @@ public class WorkPane extends VisibleComponent implements ActionListener {
|
|||
|
||||
buttonPanel = new JPanel(new FlowLayout());
|
||||
|
||||
refreshClass = new JButton("Refresh Class");
|
||||
refreshClass = new JButton("Refresh");
|
||||
refreshClass.addActionListener(this);
|
||||
|
||||
buttonPanel.add(refreshClass);
|
||||
|
@ -133,8 +133,8 @@ public class WorkPane extends VisibleComponent implements ActionListener {
|
|||
addFile(name, content);
|
||||
}
|
||||
|
||||
public ClassViewer getCurrentClass() {
|
||||
return (ClassViewer) tabs.getSelectedComponent();
|
||||
public Viewer getCurrentViewer() {
|
||||
return (Viewer) tabs.getSelectedComponent();
|
||||
}
|
||||
|
||||
public java.awt.Component[] getLoadedViewers() {
|
||||
|
@ -153,11 +153,18 @@ public class WorkPane extends VisibleComponent implements ActionListener {
|
|||
final JButton src = (JButton) arg0.getSource();
|
||||
if (src == refreshClass) {
|
||||
final Component tabComp = tabs.getSelectedComponent();
|
||||
if (tabComp != null && tabComp instanceof ClassViewer) {
|
||||
src.setEnabled(false);
|
||||
BytecodeViewer.viewer.setIcon(true);
|
||||
((ClassViewer) tabComp).startPaneUpdater(src);
|
||||
BytecodeViewer.viewer.setIcon(false);
|
||||
if (tabComp != null) {
|
||||
if(tabComp instanceof ClassViewer) {
|
||||
src.setEnabled(false);
|
||||
BytecodeViewer.viewer.setIcon(true);
|
||||
((ClassViewer) tabComp).startPaneUpdater(src);
|
||||
BytecodeViewer.viewer.setIcon(false);
|
||||
} else if(tabComp instanceof FileViewer) {
|
||||
src.setEnabled(false);
|
||||
BytecodeViewer.viewer.setIcon(true);
|
||||
((FileViewer) tabComp).refresh(src);
|
||||
BytecodeViewer.viewer.setIcon(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
package the.bytecode.club.bytecodeviewer.obfuscators;
|
||||
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
|
||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||
import the.bytecode.club.bytecodeviewer.api.ASMUtil_OLD;
|
||||
|
||||
/**
|
||||
* Rename classes.
|
||||
*
|
||||
* @author Konloch
|
||||
*
|
||||
*/
|
||||
|
||||
public class RenameClasses extends JavaObfuscator {
|
||||
|
||||
@Override
|
||||
public void obfuscate() {
|
||||
int stringLength = getStringLength();
|
||||
|
||||
System.out.println("Obfuscating class names...");
|
||||
for (ClassNode c : BytecodeViewer.getLoadedClasses()) {
|
||||
String newName = generateUniqueName(stringLength);
|
||||
ASMUtil_OLD.renameClassNode(c.name, newName);
|
||||
c.name = newName;
|
||||
}
|
||||
|
||||
System.out.println("Obfuscated class names.");
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
package the.bytecode.club.bytecodeviewer.obfuscators;
|
||||
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
import org.objectweb.asm.tree.FieldNode;
|
||||
|
||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||
import the.bytecode.club.bytecodeviewer.api.ASMUtil_OLD;
|
||||
|
||||
/**
|
||||
* Rename fields.
|
||||
*
|
||||
* @author Konloch
|
||||
*
|
||||
*/
|
||||
|
||||
public class RenameFields extends JavaObfuscator {
|
||||
|
||||
@Override
|
||||
public void obfuscate() {
|
||||
int stringLength = getStringLength();
|
||||
|
||||
System.out.println("Obfuscating fields names...");
|
||||
for (ClassNode c : BytecodeViewer.getLoadedClasses()) {
|
||||
for (Object o : c.fields.toArray()) {
|
||||
FieldNode f = (FieldNode) o;
|
||||
String newName = generateUniqueName(stringLength);
|
||||
ASMUtil_OLD.renameFieldNode(c.name, f.name, f.desc, null,
|
||||
newName, null);
|
||||
f.name = newName;
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("Obfuscated field names.");
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
package the.bytecode.club.bytecodeviewer.obfuscators;
|
||||
|
||||
import org.objectweb.asm.Opcodes;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
import org.objectweb.asm.tree.MethodNode;
|
||||
|
||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||
import the.bytecode.club.bytecodeviewer.api.ASMUtil_OLD;
|
||||
|
||||
/**
|
||||
* Rename methods.
|
||||
*
|
||||
* @author Konloch
|
||||
*
|
||||
*/
|
||||
|
||||
public class RenameMethods extends JavaObfuscator {
|
||||
|
||||
@Override
|
||||
public void obfuscate() {
|
||||
int stringLength = getStringLength();
|
||||
|
||||
System.out.println("Obfuscating method names...");
|
||||
for (ClassNode c : BytecodeViewer.getLoadedClasses()) {
|
||||
for (Object o : c.methods.toArray()) {
|
||||
MethodNode m = (MethodNode) o;
|
||||
if (m.access != Opcodes.ACC_ABSTRACT
|
||||
&& m.access != Opcodes.ACC_ABSTRACT
|
||||
+ Opcodes.ACC_STATIC
|
||||
&& m.access != Opcodes.ACC_ABSTRACT
|
||||
+ Opcodes.ACC_STATIC + Opcodes.ACC_PUBLIC
|
||||
&& m.access != Opcodes.ACC_ABSTRACT
|
||||
+ Opcodes.ACC_STATIC + Opcodes.ACC_PRIVATE
|
||||
&& m.access != Opcodes.ACC_ABSTRACT
|
||||
+ Opcodes.ACC_STATIC + Opcodes.ACC_PROTECTED
|
||||
&& m.access != Opcodes.ACC_ABSTRACT
|
||||
+ Opcodes.ACC_PUBLIC
|
||||
&& m.access != Opcodes.ACC_ABSTRACT
|
||||
+ Opcodes.ACC_PRIVATE
|
||||
&& m.access != Opcodes.ACC_ABSTRACT
|
||||
+ Opcodes.ACC_PROTECTED) {
|
||||
if (!m.name.equals("main") && !m.name.equals("<init>")
|
||||
&& !m.name.equals("<clinit>")) {
|
||||
String newName = generateUniqueName(stringLength);
|
||||
ASMUtil_OLD.renameMethodNode(c.name, m.name, m.desc,
|
||||
null, newName, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("Obfuscated method names.");
|
||||
}
|
||||
|
||||
}
|
|
@ -1,11 +1,10 @@
|
|||
package the.bytecode.club.bytecodeviewer.obfuscators.rename;
|
||||
|
||||
import org.objectweb.asm.Opcodes;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
import org.objectweb.asm.tree.FieldNode;
|
||||
import org.objectweb.asm.tree.MethodNode;
|
||||
|
||||
import com.sun.xml.internal.ws.org.objectweb.asm.Opcodes;
|
||||
|
||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||
import the.bytecode.club.bytecodeviewer.api.ASMUtil_OLD;
|
||||
import the.bytecode.club.bytecodeviewer.obfuscators.JavaObfuscator;
|
||||
|
|
|
@ -3,10 +3,7 @@ package the.bytecode.club.bytecodeviewer.obfuscators.rename;
|
|||
import org.objectweb.asm.tree.ClassNode;
|
||||
import org.objectweb.asm.tree.FieldNode;
|
||||
|
||||
import com.sun.xml.internal.ws.org.objectweb.asm.Opcodes;
|
||||
|
||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||
import the.bytecode.club.bytecodeviewer.api.ASMUtil_OLD;
|
||||
import the.bytecode.club.bytecodeviewer.obfuscators.JavaObfuscator;
|
||||
import the.bytecode.club.bytecodeviewer.obfuscators.mapping.data.FieldMappingData;
|
||||
import the.bytecode.club.bytecodeviewer.obfuscators.mapping.data.MappingData;
|
||||
|
|
|
@ -19,6 +19,7 @@ import com.mxgraph.view.mxGraph;
|
|||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||
import the.bytecode.club.bytecodeviewer.Resources;
|
||||
import the.bytecode.club.bytecodeviewer.api.Plugin;
|
||||
import the.bytecode.club.bytecodeviewer.gui.ClassViewer;
|
||||
|
||||
/**
|
||||
* A simple code sequence diagram.
|
||||
|
@ -32,11 +33,11 @@ public class CodeSequenceDiagram extends Plugin {
|
|||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public void execute(ArrayList<ClassNode> classNodeList) {
|
||||
if(BytecodeViewer.viewer.workPane.getCurrentClass() == null) {
|
||||
if(BytecodeViewer.viewer.workPane.getCurrentViewer() == null || !(BytecodeViewer.viewer.workPane.getCurrentViewer() instanceof ClassViewer)) {
|
||||
BytecodeViewer.showMessage("First open a class file.");
|
||||
return;
|
||||
}
|
||||
ClassNode c = BytecodeViewer.viewer.workPane.getCurrentClass().cn;
|
||||
ClassNode c = BytecodeViewer.viewer.workPane.getCurrentViewer().cn;
|
||||
JFrame frame = new JFrame("Code Sequence Diagram - " +c.name);
|
||||
frame.setIconImages(Resources.iconList);
|
||||
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
|
||||
|
|
Loading…
Reference in New Issue
Block a user