diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..4e801a74 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/bin/ +.classpath +.project \ No newline at end of file diff --git a/libs/cfr_0_95.jar b/libs/cfr_0_97.jar similarity index 83% rename from libs/cfr_0_95.jar rename to libs/cfr_0_97.jar index 65dfe2de..0b6f8c1e 100644 Binary files a/libs/cfr_0_95.jar and b/libs/cfr_0_97.jar differ diff --git a/plugins/Skeleton.java b/plugins/Skeleton.java index b9153270..b3e8d3b8 100644 --- a/plugins/Skeleton.java +++ b/plugins/Skeleton.java @@ -8,6 +8,6 @@ public class Skeleton extends Plugin { public void execute(ArrayList classNodesList) { PluginConsole gui = new PluginConsole("Skeleton"); gui.setVisible(true); - gui.appendText("exceuted skeleton"); + gui.appendText("executed skeleton"); } } \ No newline at end of file diff --git a/src/the/bytecode/club/bytecodeviewer/BytecodeViewer.java b/src/the/bytecode/club/bytecodeviewer/BytecodeViewer.java index 4817d33e..29dd5a43 100644 --- a/src/the/bytecode/club/bytecodeviewer/BytecodeViewer.java +++ b/src/the/bytecode/club/bytecodeviewer/BytecodeViewer.java @@ -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 krakatau = new ArrayList(); - - /* 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()); + } + } } diff --git a/src/the/bytecode/club/bytecodeviewer/api/PluginConsole.java b/src/the/bytecode/club/bytecodeviewer/api/PluginConsole.java index 791acfd0..0076cf4a 100644 --- a/src/the/bytecode/club/bytecodeviewer/api/PluginConsole.java +++ b/src/the/bytecode/club/bytecodeviewer/api/PluginConsole.java @@ -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) { } diff --git a/src/the/bytecode/club/bytecodeviewer/decompilers/CFRDecompiler.java b/src/the/bytecode/club/bytecodeviewer/decompilers/CFRDecompiler.java index 955b5cd1..004e7594 100644 --- a/src/the/bytecode/club/bytecodeviewer/decompilers/CFRDecompiler.java +++ b/src/the/bytecode/club/bytecodeviewer/decompilers/CFRDecompiler.java @@ -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) { diff --git a/src/the/bytecode/club/bytecodeviewer/decompilers/Decompiler.java b/src/the/bytecode/club/bytecodeviewer/decompilers/Decompiler.java index 4fce7570..4124ba2d 100644 --- a/src/the/bytecode/club/bytecodeviewer/decompilers/Decompiler.java +++ b/src/the/bytecode/club/bytecodeviewer/decompilers/Decompiler.java @@ -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); diff --git a/src/the/bytecode/club/bytecodeviewer/decompilers/FernFlowerDecompiler.java b/src/the/bytecode/club/bytecodeviewer/decompilers/FernFlowerDecompiler.java index 8cb05aff..899dc178 100644 --- a/src/the/bytecode/club/bytecodeviewer/decompilers/FernFlowerDecompiler.java +++ b/src/the/bytecode/club/bytecodeviewer/decompilers/FernFlowerDecompiler.java @@ -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) { diff --git a/src/the/bytecode/club/bytecodeviewer/decompilers/KrakatauDecompiler.java b/src/the/bytecode/club/bytecodeviewer/decompilers/KrakatauDecompiler.java index 81b6d17d..a6e60ac6 100644 --- a/src/the/bytecode/club/bytecodeviewer/decompilers/KrakatauDecompiler.java +++ b/src/the/bytecode/club/bytecodeviewer/decompilers/KrakatauDecompiler.java @@ -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."); diff --git a/src/the/bytecode/club/bytecodeviewer/decompilers/KrakatauDisassembler.java b/src/the/bytecode/club/bytecodeviewer/decompilers/KrakatauDisassembler.java index 25f6ae57..2f2cdf29 100644 --- a/src/the/bytecode/club/bytecodeviewer/decompilers/KrakatauDisassembler.java +++ b/src/the/bytecode/club/bytecodeviewer/decompilers/KrakatauDisassembler.java @@ -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(); diff --git a/src/the/bytecode/club/bytecodeviewer/decompilers/ProcyonDecompiler.java b/src/the/bytecode/club/bytecodeviewer/decompilers/ProcyonDecompiler.java index a57a270b..5a3d9225 100644 --- a/src/the/bytecode/club/bytecodeviewer/decompilers/ProcyonDecompiler.java +++ b/src/the/bytecode/club/bytecodeviewer/decompilers/ProcyonDecompiler.java @@ -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) { diff --git a/src/the/bytecode/club/bytecodeviewer/decompilers/SmaliDisassembler.java b/src/the/bytecode/club/bytecodeviewer/decompilers/SmaliDisassembler.java index f04d16a1..aca9890a 100644 --- a/src/the/bytecode/club/bytecodeviewer/decompilers/SmaliDisassembler.java +++ b/src/the/bytecode/club/bytecodeviewer/decompilers/SmaliDisassembler.java @@ -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) { diff --git a/src/the/bytecode/club/bytecodeviewer/decompilers/bytecode/ClassNodeDecompiler.java b/src/the/bytecode/club/bytecodeviewer/decompilers/bytecode/ClassNodeDecompiler.java index 22a98113..41813809 100644 --- a/src/the/bytecode/club/bytecodeviewer/decompilers/bytecode/ClassNodeDecompiler.java +++ b/src/the/bytecode/club/bytecodeviewer/decompilers/bytecode/ClassNodeDecompiler.java @@ -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(), cn).toString(); } diff --git a/src/the/bytecode/club/bytecodeviewer/gui/ClassViewer.java b/src/the/bytecode/club/bytecodeviewer/gui/ClassViewer.java index 352a0972..80199386 100644 --- a/src/the/bytecode/club/bytecodeviewer/gui/ClassViewer.java +++ b/src/the/bytecode/club/bytecodeviewer/gui/ClassViewer.java @@ -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) { } diff --git a/src/the/bytecode/club/bytecodeviewer/gui/FileViewer.java b/src/the/bytecode/club/bytecodeviewer/gui/FileViewer.java index f25eaaf6..50091658 100644 --- a/src/the/bytecode/club/bytecodeviewer/gui/FileViewer.java +++ b/src/the/bytecode/club/bytecodeviewer/gui/FileViewer.java @@ -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); + } } diff --git a/src/the/bytecode/club/bytecodeviewer/gui/MainViewerGUI.java b/src/the/bytecode/club/bytecodeviewer/gui/MainViewerGUI.java index 301c918c..d876fb21 100644 --- a/src/the/bytecode/club/bytecodeviewer/gui/MainViewerGUI.java +++ b/src/the/bytecode/club/bytecodeviewer/gui/MainViewerGUI.java @@ -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()); diff --git a/src/the/bytecode/club/bytecodeviewer/gui/SearchingPane.java b/src/the/bytecode/club/bytecodeviewer/gui/SearchingPane.java index 6e295916..2d1bc5a8 100644 --- a/src/the/bytecode/club/bytecodeviewer/gui/SearchingPane.java +++ b/src/the/bytecode/club/bytecodeviewer/gui/SearchingPane.java @@ -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()); diff --git a/src/the/bytecode/club/bytecodeviewer/gui/SystemErrConsole.java b/src/the/bytecode/club/bytecodeviewer/gui/SystemErrConsole.java index be85e0ee..723417fb 100644 --- a/src/the/bytecode/club/bytecodeviewer/gui/SystemErrConsole.java +++ b/src/the/bytecode/club/bytecodeviewer/gui/SystemErrConsole.java @@ -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) { } diff --git a/src/the/bytecode/club/bytecodeviewer/gui/Viewer.java b/src/the/bytecode/club/bytecodeviewer/gui/Viewer.java new file mode 100644 index 00000000..5672aac9 --- /dev/null +++ b/src/the/bytecode/club/bytecodeviewer/gui/Viewer.java @@ -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; + +} diff --git a/src/the/bytecode/club/bytecodeviewer/gui/WorkPane.java b/src/the/bytecode/club/bytecodeviewer/gui/WorkPane.java index 7860c2db..447418b1 100644 --- a/src/the/bytecode/club/bytecodeviewer/gui/WorkPane.java +++ b/src/the/bytecode/club/bytecodeviewer/gui/WorkPane.java @@ -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); + } } } } diff --git a/src/the/bytecode/club/bytecodeviewer/obfuscators/RenameClasses.java b/src/the/bytecode/club/bytecodeviewer/obfuscators/RenameClasses.java new file mode 100644 index 00000000..23ca59c1 --- /dev/null +++ b/src/the/bytecode/club/bytecodeviewer/obfuscators/RenameClasses.java @@ -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."); + } + +} diff --git a/src/the/bytecode/club/bytecodeviewer/obfuscators/RenameFields.java b/src/the/bytecode/club/bytecodeviewer/obfuscators/RenameFields.java new file mode 100644 index 00000000..5be456ae --- /dev/null +++ b/src/the/bytecode/club/bytecodeviewer/obfuscators/RenameFields.java @@ -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."); + } + +} diff --git a/src/the/bytecode/club/bytecodeviewer/obfuscators/RenameMethods.java b/src/the/bytecode/club/bytecodeviewer/obfuscators/RenameMethods.java new file mode 100644 index 00000000..cd4d01e4 --- /dev/null +++ b/src/the/bytecode/club/bytecodeviewer/obfuscators/RenameMethods.java @@ -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("") + && !m.name.equals("")) { + String newName = generateUniqueName(stringLength); + ASMUtil_OLD.renameMethodNode(c.name, m.name, m.desc, + null, newName, null); + } + } + } + } + + System.out.println("Obfuscated method names."); + } + +} diff --git a/src/the/bytecode/club/bytecodeviewer/obfuscators/rename/RenameClasses.java b/src/the/bytecode/club/bytecodeviewer/obfuscators/rename/RenameClasses.java index e5aa29ab..0691a8e2 100644 --- a/src/the/bytecode/club/bytecodeviewer/obfuscators/rename/RenameClasses.java +++ b/src/the/bytecode/club/bytecodeviewer/obfuscators/rename/RenameClasses.java @@ -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; diff --git a/src/the/bytecode/club/bytecodeviewer/obfuscators/rename/RenameFields.java b/src/the/bytecode/club/bytecodeviewer/obfuscators/rename/RenameFields.java index 62b7066b..e648735b 100644 --- a/src/the/bytecode/club/bytecodeviewer/obfuscators/rename/RenameFields.java +++ b/src/the/bytecode/club/bytecodeviewer/obfuscators/rename/RenameFields.java @@ -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; diff --git a/src/the/bytecode/club/bytecodeviewer/plugins/CodeSequenceDiagram.java b/src/the/bytecode/club/bytecodeviewer/plugins/CodeSequenceDiagram.java index 4d56d842..3654cc65 100644 --- a/src/the/bytecode/club/bytecodeviewer/plugins/CodeSequenceDiagram.java +++ b/src/the/bytecode/club/bytecodeviewer/plugins/CodeSequenceDiagram.java @@ -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 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);