2018-01-31 15:03:53 +00:00
package the.bytecode.club.bytecodeviewer.gui ;
import java.awt.Component ;
import java.awt.Cursor ;
import java.awt.Dimension ;
import java.awt.Frame ;
import java.awt.KeyEventDispatcher ;
import java.awt.KeyboardFocusManager ;
import java.awt.event.ActionEvent ;
import java.awt.event.ActionListener ;
import java.awt.event.KeyEvent ;
import java.awt.event.WindowAdapter ;
import java.awt.event.WindowEvent ;
import java.io.File ;
import java.util.ArrayList ;
import javax.swing.BoxLayout ;
import javax.swing.ButtonGroup ;
import javax.swing.JCheckBoxMenuItem ;
import javax.swing.JDialog ;
import javax.swing.JFileChooser ;
import javax.swing.JFrame ;
import javax.swing.JMenu ;
import javax.swing.JMenuBar ;
import javax.swing.JMenuItem ;
import javax.swing.JOptionPane ;
import javax.swing.JRadioButtonMenuItem ;
import javax.swing.JSeparator ;
import javax.swing.JSplitPane ;
import javax.swing.SwingUtilities ;
import javax.swing.filechooser.FileFilter ;
import me.konloch.kontainer.io.DiskWriter ;
import org.objectweb.asm.ClassWriter ;
import org.objectweb.asm.tree.ClassNode ;
import the.bytecode.club.bytecodeviewer.BytecodeViewer ;
import the.bytecode.club.bytecodeviewer.Dex2Jar ;
import the.bytecode.club.bytecodeviewer.FileChangeNotifier ;
import the.bytecode.club.bytecodeviewer.FileContainer ;
import the.bytecode.club.bytecodeviewer.JarUtils ;
import the.bytecode.club.bytecodeviewer.MiscUtils ;
import the.bytecode.club.bytecodeviewer.Resources ;
import the.bytecode.club.bytecodeviewer.decompilers.Decompiler ;
import the.bytecode.club.bytecodeviewer.obfuscators.rename.RenameClasses ;
import the.bytecode.club.bytecodeviewer.obfuscators.rename.RenameFields ;
import the.bytecode.club.bytecodeviewer.obfuscators.rename.RenameMethods ;
import the.bytecode.club.bytecodeviewer.plugin.PluginManager ;
import the.bytecode.club.bytecodeviewer.plugin.preinstalled.CodeSequenceDiagram ;
import the.bytecode.club.bytecodeviewer.plugin.preinstalled.AllatoriStringDecrypter ;
import the.bytecode.club.bytecodeviewer.plugin.preinstalled.ShowAllStrings ;
import the.bytecode.club.bytecodeviewer.plugin.preinstalled.ShowMainMethods ;
import the.bytecode.club.bytecodeviewer.plugin.preinstalled.ZKMStringDecrypter ;
import the.bytecode.club.bytecodeviewer.plugin.preinstalled.ZStringArrayDecrypter ;
import javax.swing.JSpinner ;
import javax.swing.SpinnerNumberModel ;
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Bytecode Viewer ( BCV ) - Java & Android Reverse Engineering Suite *
* Copyright ( C ) 2014 Kalen ' Konloch ' Kinloch - http : //bytecodeviewer.com *
* *
* This program is free software : you can redistribute it and / or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation , either version 3 of the License , or *
* ( at your option ) any later version . *
* *
* This program is distributed in the hope that it will be useful , *
* but WITHOUT ANY WARRANTY ; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the *
* GNU General Public License for more details . *
* *
* You should have received a copy of the GNU General Public License *
* along with this program . If not , see < http : //www.gnu.org/licenses/>. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/ * *
* The main file for the GUI . n
*
2018-01-31 15:41:24 +00:00
* @author Konloch
2018-01-31 15:03:53 +00:00
* /
public class MainViewerGUI extends JFrame implements FileChangeNotifier {
2018-01-31 15:41:24 +00:00
public void pythonC ( ) {
JFileChooser fc = new JFileChooser ( ) ;
fc . setFileFilter ( new FileFilter ( ) {
@Override
public boolean accept ( File f ) {
return true ;
}
@Override
public String getDescription ( ) {
return " Python (Or PyPy for speed) 2.7 Executable " ;
}
} ) ;
fc . setFileHidingEnabled ( false ) ;
fc . setAcceptAllFileFilterUsed ( false ) ;
int returnVal = fc . showOpenDialog ( BytecodeViewer . viewer ) ;
if ( returnVal = = JFileChooser . APPROVE_OPTION )
try {
BytecodeViewer . python = fc . getSelectedFile ( ) . getAbsolutePath ( ) ;
} catch ( Exception e1 ) {
new the . bytecode . club . bytecodeviewer . api . ExceptionUI ( e1 ) ;
}
}
public void javac ( ) {
JFileChooser fc = new JFileChooser ( ) ;
fc . setFileFilter ( new FileFilter ( ) {
@Override
public boolean accept ( File f ) {
return true ;
}
@Override
public String getDescription ( ) {
return " Javac Executable (Requires JDK 'C:/programfiles/Java/JRE_xx/bin/javac.exe) " ;
}
} ) ;
fc . setFileHidingEnabled ( false ) ;
fc . setAcceptAllFileFilterUsed ( false ) ;
int returnVal = fc . showOpenDialog ( BytecodeViewer . viewer ) ;
if ( returnVal = = JFileChooser . APPROVE_OPTION )
try {
BytecodeViewer . javac = fc . getSelectedFile ( ) . getAbsolutePath ( ) ;
} catch ( Exception e1 ) {
new the . bytecode . club . bytecodeviewer . api . ExceptionUI ( e1 ) ;
}
}
public void java ( ) {
JFileChooser fc = new JFileChooser ( ) ;
fc . setFileFilter ( new FileFilter ( ) {
@Override
public boolean accept ( File f ) {
return true ;
}
@Override
public String getDescription ( ) {
return " Java Executable (Inside Of JRE/JDK 'C:/programfiles/Java/JRE_xx/bin/java.exe') " ;
}
} ) ;
fc . setFileHidingEnabled ( false ) ;
fc . setAcceptAllFileFilterUsed ( false ) ;
int returnVal = fc . showOpenDialog ( BytecodeViewer . viewer ) ;
if ( returnVal = = JFileChooser . APPROVE_OPTION )
try {
BytecodeViewer . java = fc . getSelectedFile ( ) . getAbsolutePath ( ) ;
} catch ( Exception e1 ) {
new the . bytecode . club . bytecodeviewer . api . ExceptionUI ( e1 ) ;
}
}
public void pythonC3 ( ) {
JFileChooser fc = new JFileChooser ( ) ;
fc . setFileFilter ( new FileFilter ( ) {
@Override
public boolean accept ( File f ) {
return true ;
}
@Override
public String getDescription ( ) {
return " Python (Or PyPy for speed) 3.x Executable " ;
}
} ) ;
fc . setFileHidingEnabled ( false ) ;
fc . setAcceptAllFileFilterUsed ( false ) ;
int returnVal = fc . showOpenDialog ( BytecodeViewer . viewer ) ;
if ( returnVal = = JFileChooser . APPROVE_OPTION )
try {
BytecodeViewer . python3 = fc . getSelectedFile ( ) . getAbsolutePath ( ) ;
} catch ( Exception e1 ) {
new the . bytecode . club . bytecodeviewer . api . ExceptionUI ( e1 ) ;
}
}
public void library ( ) {
JFileChooser fc = new JFileChooser ( ) ;
fc . setFileFilter ( new FileFilter ( ) {
@Override
public boolean accept ( File f ) {
return f . isDirectory ( ) ;
}
@Override
public String getDescription ( ) {
return " Optional Library Folder " ;
}
} ) ;
fc . setFileSelectionMode ( JFileChooser . DIRECTORIES_ONLY ) ;
fc . setFileHidingEnabled ( false ) ;
fc . setAcceptAllFileFilterUsed ( false ) ;
int returnVal = fc . showOpenDialog ( BytecodeViewer . viewer ) ;
if ( returnVal = = JFileChooser . APPROVE_OPTION )
try {
BytecodeViewer . library = fc . getSelectedFile ( ) . getAbsolutePath ( ) ;
} catch ( Exception e1 ) {
new the . bytecode . club . bytecodeviewer . api . ExceptionUI ( e1 ) ;
}
}
public void rtC ( ) {
JFileChooser fc = new JFileChooser ( ) ;
fc . setFileFilter ( new FileFilter ( ) {
@Override
public boolean accept ( File f ) {
return true ;
}
@Override
public String getDescription ( ) {
return " JRE RT Library " ;
}
} ) ;
fc . setFileHidingEnabled ( false ) ;
fc . setAcceptAllFileFilterUsed ( false ) ;
int returnVal = fc . showOpenDialog ( BytecodeViewer . viewer ) ;
if ( returnVal = = JFileChooser . APPROVE_OPTION )
try {
BytecodeViewer . rt = fc . getSelectedFile ( ) . getAbsolutePath ( ) ;
} catch ( Exception e1 ) {
new the . bytecode . club . bytecodeviewer . api . ExceptionUI ( e1 ) ;
}
}
public static final long serialVersionUID = 1851409230530948543L ;
public JCheckBoxMenuItem debugHelpers = new JCheckBoxMenuItem ( " Debug Helpers " ) ;
public JSplitPane sp1 ;
public JSplitPane sp2 ;
static ArrayList < VisibleComponent > rfComps = new ArrayList < VisibleComponent > ( ) ;
public JCheckBoxMenuItem rbr = new JCheckBoxMenuItem ( " Hide bridge methods " ) ;
public JCheckBoxMenuItem rsy = new JCheckBoxMenuItem (
" Hide synthetic class members " ) ;
public JCheckBoxMenuItem din = new JCheckBoxMenuItem (
" Decompile inner classes " ) ;
public JCheckBoxMenuItem dc4 = new JCheckBoxMenuItem (
" Collapse 1.4 class references " ) ;
public JCheckBoxMenuItem das = new JCheckBoxMenuItem ( " Decompile assertions " ) ;
public JCheckBoxMenuItem hes = new JCheckBoxMenuItem (
" Hide empty super invocation " ) ;
public JCheckBoxMenuItem hdc = new JCheckBoxMenuItem (
" Hide empty default constructor " ) ;
public JCheckBoxMenuItem dgs = new JCheckBoxMenuItem (
" Decompile generic signatures " ) ;
public JCheckBoxMenuItem ner = new JCheckBoxMenuItem (
" Assume return not throwing exceptions " ) ;
public JCheckBoxMenuItem den = new JCheckBoxMenuItem (
" Decompile enumerations " ) ;
public JCheckBoxMenuItem rgn = new JCheckBoxMenuItem (
" Remove getClass() invocation " ) ;
public JCheckBoxMenuItem bto = new JCheckBoxMenuItem (
" Interpret int 1 as boolean true " ) ;
public JCheckBoxMenuItem nns = new JCheckBoxMenuItem (
" Allow for not set synthetic attribute " ) ;
public JCheckBoxMenuItem uto = new JCheckBoxMenuItem (
" Consider nameless types as java.lang.Object " ) ;
public JCheckBoxMenuItem udv = new JCheckBoxMenuItem (
" Reconstruct variable names from debug info " ) ;
public JCheckBoxMenuItem rer = new JCheckBoxMenuItem (
" Remove empty exception ranges " ) ;
public JCheckBoxMenuItem fdi = new JCheckBoxMenuItem (
" Deinline finally structures " ) ;
public JCheckBoxMenuItem asc = new JCheckBoxMenuItem (
" Allow only ASCII characters in strings " ) ;
public final JMenuItem mntmNewWorkspace = new JMenuItem ( " New Workspace " ) ;
public JMenu mnRecentFiles = new JMenu ( " Recent Files " ) ;
public final JMenuItem mntmNewMenuItem = new JMenuItem (
" Decompile & Save All Classes.. " ) ;
public final JMenuItem mntmAbout = new JMenuItem ( " About " ) ;
public final JSeparator separator_3 = new JSeparator ( ) ;
public final JMenu mnNewMenu_1 = new JMenu ( " Plugins " ) ;
public final JMenuItem mntmStartExternalPlugin = new JMenuItem (
" Open Plugin.. " ) ;
public final JSeparator separator_4 = new JSeparator ( ) ;
public JMenu mnRecentPlugins = new JMenu ( " Recent Plugins " ) ;
public final JSeparator separator_5 = new JSeparator ( ) ;
public final JMenuItem mntmStartZkmString = new JMenuItem (
" ZKM String Decrypter " ) ;
public final JMenuItem mntmNewMenuItem_1 = new JMenuItem (
" Malicious Code Scanner " ) ;
public final JMenuItem mntmNewMenuItem_2 = new JMenuItem (
" Allatori String Decrypter " ) ;
public final JMenuItem mntmShowAllStrings = new JMenuItem (
" Show All Strings " ) ;
public final JMenuItem mntmShowMainMethods = new JMenuItem (
" Show Main Methods " ) ;
public final JMenuItem mntmNewMenuItem_3 = new JMenuItem ( " Save As Runnable Jar.. " ) ;
public JMenuBar menuBar = new JMenuBar ( ) ;
public final JMenuItem mntmReplaceStrings = new JMenuItem (
" Replace Strings " ) ;
public final JMenuItem mntmNewMenuItem_4 = new JMenuItem ( " " ) ;
public final JMenu mnNewMenu_3 = new JMenu ( " CFR " ) ;
public final JMenu mnNewMenu_4 = new JMenu ( " Procyon " ) ;
public final JCheckBoxMenuItem decodeenumswitch = new JCheckBoxMenuItem (
" Decode Enum Switch " ) ;
public final JCheckBoxMenuItem sugarenums = new JCheckBoxMenuItem (
" SugarEnums " ) ;
public final JCheckBoxMenuItem decodestringswitch = new JCheckBoxMenuItem (
" Decode String Switch " ) ;
public final JCheckBoxMenuItem arrayiter = new JCheckBoxMenuItem (
" Arrayiter " ) ;
public final JCheckBoxMenuItem collectioniter = new JCheckBoxMenuItem (
" Collectioniter " ) ;
public final JCheckBoxMenuItem innerclasses = new JCheckBoxMenuItem (
" Inner Classes " ) ;
public final JCheckBoxMenuItem removeboilerplate = new JCheckBoxMenuItem (
" Remove Boiler Plate " ) ;
public final JCheckBoxMenuItem removeinnerclasssynthetics = new JCheckBoxMenuItem (
" Remove Inner Class Synthetics " ) ;
public final JCheckBoxMenuItem decodelambdas = new JCheckBoxMenuItem (
" Decode Lambdas " ) ;
public final JCheckBoxMenuItem hidebridgemethods = new JCheckBoxMenuItem (
" Hide Bridge Methods " ) ;
public final JCheckBoxMenuItem liftconstructorinit = new JCheckBoxMenuItem (
" Lift Constructor Init " ) ;
public final JCheckBoxMenuItem removedeadmethods = new JCheckBoxMenuItem (
" Remove Dead Methods " ) ;
public final JCheckBoxMenuItem removebadgenerics = new JCheckBoxMenuItem (
" Remove Bad Generics " ) ;
public final JCheckBoxMenuItem sugarasserts = new JCheckBoxMenuItem (
" Sugar Asserts " ) ;
public final JCheckBoxMenuItem sugarboxing = new JCheckBoxMenuItem (
" Sugar Boxing " ) ;
public final JCheckBoxMenuItem showversion = new JCheckBoxMenuItem (
" Show Version " ) ;
public final JCheckBoxMenuItem decodefinally = new JCheckBoxMenuItem (
" Decode Finally " ) ;
public final JCheckBoxMenuItem tidymonitors = new JCheckBoxMenuItem (
" Tidy Monitors " ) ;
public final JCheckBoxMenuItem lenient = new JCheckBoxMenuItem ( " Lenient " ) ;
public final JCheckBoxMenuItem dumpclasspath = new JCheckBoxMenuItem (
" Dump Classpath " ) ;
public final JCheckBoxMenuItem comments = new JCheckBoxMenuItem ( " Comments " ) ;
public final JCheckBoxMenuItem forcetopsort = new JCheckBoxMenuItem (
" Force Top Sort " ) ;
public final JCheckBoxMenuItem forcetopsortaggress = new JCheckBoxMenuItem (
" Force Top Sort Aggress " ) ;
public final JCheckBoxMenuItem stringbuffer = new JCheckBoxMenuItem (
" String Buffer " ) ;
public final JCheckBoxMenuItem stringbuilder = new JCheckBoxMenuItem (
" String Builder " ) ;
public final JCheckBoxMenuItem silent = new JCheckBoxMenuItem ( " Silent " ) ;
public final JCheckBoxMenuItem recover = new JCheckBoxMenuItem ( " Recover " ) ;
public final JCheckBoxMenuItem eclipse = new JCheckBoxMenuItem ( " Eclipse " ) ;
public final JCheckBoxMenuItem override = new JCheckBoxMenuItem ( " Override " ) ;
public final JCheckBoxMenuItem showinferrable = new JCheckBoxMenuItem (
" Show Inferrable " ) ;
public final JCheckBoxMenuItem aexagg = new JCheckBoxMenuItem ( " Aexagg " ) ;
public final JCheckBoxMenuItem forcecondpropagate = new JCheckBoxMenuItem (
" Force Cond Propagate " ) ;
public final JCheckBoxMenuItem hideutf = new JCheckBoxMenuItem ( " Hide UTF " ) ;
public final JCheckBoxMenuItem hidelongstrings = new JCheckBoxMenuItem (
" Hide Long Strings " ) ;
public final JCheckBoxMenuItem commentmonitor = new JCheckBoxMenuItem (
" Comment Monitors " ) ;
public final JCheckBoxMenuItem allowcorrecting = new JCheckBoxMenuItem (
" Allow Correcting " ) ;
public final JCheckBoxMenuItem labelledblocks = new JCheckBoxMenuItem (
" Labelled Blocks " ) ;
public final JCheckBoxMenuItem j14classobj = new JCheckBoxMenuItem (
" J14ClassOBJ " ) ;
public final JCheckBoxMenuItem hidelangimports = new JCheckBoxMenuItem (
" Hide Lang Imports " ) ;
public final JCheckBoxMenuItem recoverytypeclash = new JCheckBoxMenuItem (
" Recover Type Clash " ) ;
public final JCheckBoxMenuItem recoverytypehints = new JCheckBoxMenuItem (
" Recover Type Hints " ) ;
public final JCheckBoxMenuItem forceturningifs = new JCheckBoxMenuItem (
" Force Returning IFs " ) ;
public final JCheckBoxMenuItem forloopaggcapture = new JCheckBoxMenuItem (
" For Loop AGG Capture " ) ;
public final JCheckBoxMenuItem forceexceptionprune = new JCheckBoxMenuItem (
" Force Exception Prune " ) ;
public final JCheckBoxMenuItem chckbxmntmShowDebugLine = new JCheckBoxMenuItem (
" Show Debug Line Numbers " ) ;
public final JCheckBoxMenuItem chckbxmntmSimplifyMemberReferences = new JCheckBoxMenuItem (
" Simplify Member References " ) ;
public final JCheckBoxMenuItem mnMergeVariables = new JCheckBoxMenuItem (
" Merge Variables " ) ;
public final JCheckBoxMenuItem chckbxmntmNewCheckItem_1 = new JCheckBoxMenuItem (
" Unicode Output Enabled " ) ;
public final JCheckBoxMenuItem chckbxmntmNewCheckItem_2 = new JCheckBoxMenuItem (
" Retain Pointless Switches " ) ;
public final JCheckBoxMenuItem chckbxmntmNewCheckItem_3 = new JCheckBoxMenuItem (
" Include Line Numbers In Bytecode " ) ;
public final JCheckBoxMenuItem chckbxmntmNewCheckItem_4 = new JCheckBoxMenuItem (
" Include Error Diagnostics " ) ;
public final JCheckBoxMenuItem chckbxmntmNewCheckItem_5 = new JCheckBoxMenuItem (
" Retain Redundant Casts " ) ;
public final JCheckBoxMenuItem chckbxmntmNewCheckItem_6 = new JCheckBoxMenuItem (
" Always Generate Exception Variable For Catch Blocks " ) ;
public final JCheckBoxMenuItem chckbxmntmNewCheckItem_7 = new JCheckBoxMenuItem (
" Show Synthetic Members " ) ;
public final JCheckBoxMenuItem chckbxmntmNewCheckItem_8 = new JCheckBoxMenuItem (
" Force Explicit Type Arguments " ) ;
public final JCheckBoxMenuItem chckbxmntmNewCheckItem_9 = new JCheckBoxMenuItem (
" Force Explicit Imports " ) ;
public final JCheckBoxMenuItem chckbxmntmNewCheckItem_10 = new JCheckBoxMenuItem (
" Flatten Switch Blocks " ) ;
public final JCheckBoxMenuItem chckbxmntmNewCheckItem_11 = new JCheckBoxMenuItem (
" Exclude Nested Types " ) ;
public final JCheckBoxMenuItem chckbxmntmAppendBrackets = new JCheckBoxMenuItem (
" Append Brackets To Labels " ) ;
public final JCheckBoxMenuItem chckbxmntmNewCheckItem_12 = new JCheckBoxMenuItem (
" Update Check " ) ;
public final JMenu mnNewMenu_5 = new JMenu ( " Obfuscate " ) ;
public final JMenuItem mntmNewMenuItem_6 = new JMenuItem ( " Rename Fields " ) ;
public final JMenuItem mntmNewMenuItem_7 = new JMenuItem ( " Rename Methods " ) ;
public final JMenuItem mntmNewMenuItem_8 = new JMenuItem (
" Move All Classes Into Root Package " ) ;
public final JMenuItem mntmNewMenuItem_9 = new JMenuItem ( " Control Flow " ) ;
public final JMenuItem mntmNewMenuItem_10 = new JMenuItem ( " Junk Code " ) ;
public final ButtonGroup obfuscatorGroup = new ButtonGroup ( ) ;
public final JRadioButtonMenuItem strongObf = new JRadioButtonMenuItem (
" Strong Obfuscation " ) ;
public final JRadioButtonMenuItem lightObf = new JRadioButtonMenuItem (
" Light Obfuscation " ) ;
public final JMenuItem mntmNewMenuItem_11 = new JMenuItem ( " Rename Classes " ) ;
public final JSeparator separator_2 = new JSeparator ( ) ;
public final JMenu mnNewMenu_6 = new JMenu ( " View " ) ;
public final JMenu mnNewMenu_7 = new JMenu ( " Pane 1 " ) ;
public final JRadioButtonMenuItem panel1None = new JRadioButtonMenuItem (
" None " ) ;
public final JRadioButtonMenuItem panel1Hexcode = new JRadioButtonMenuItem (
" Hexcode " ) ;
public final JRadioButtonMenuItem panel1Bytecode = new JRadioButtonMenuItem (
" Bytecode " ) ;
public final JRadioButtonMenuItem panel1Fern = new JRadioButtonMenuItem (
" Java " ) ;
public final JRadioButtonMenuItem panel1CFR = new JRadioButtonMenuItem (
" Java " ) ;
public final JRadioButtonMenuItem panel1Proc = new JRadioButtonMenuItem (
" Java " ) ;
public final JMenuItem mntmNewMenuItem_12 = new JMenuItem ( " Decompile & Save Opened Class.. " ) ;
public WorkPane workPane = new WorkPane ( this ) ;
public final JMenu mnSettings = new JMenu ( " Settings " ) ;
public final JSeparator separator_6 = new JSeparator ( ) ;
public final JCheckBoxMenuItem refreshOnChange = new JCheckBoxMenuItem ( " Refresh On View Change " ) ;
public AboutWindow aboutWindow = new AboutWindow ( ) ;
public FileNavigationPane cn = new FileNavigationPane ( this ) ;
public boolean isMaximized = false ;
public void removed ( boolean busy ) {
if ( busy ) {
this . setCursor ( Cursor . getPredefinedCursor ( Cursor . WAIT_CURSOR ) ) ;
for ( Component c : this . getComponents ( ) )
c . setCursor ( Cursor . getPredefinedCursor ( Cursor . WAIT_CURSOR ) ) ;
sp1 . setCursor ( Cursor . getPredefinedCursor ( Cursor . WAIT_CURSOR ) ) ;
sp2 . setCursor ( Cursor . getPredefinedCursor ( Cursor . WAIT_CURSOR ) ) ;
for ( VisibleComponent c : rfComps ) {
c . setCursor ( Cursor . getPredefinedCursor ( Cursor . WAIT_CURSOR ) ) ;
if ( c instanceof WorkPane ) {
WorkPane w = ( WorkPane ) c ;
for ( Component c2 : w . tabs . getComponents ( ) )
c2 . setCursor ( Cursor
. getPredefinedCursor ( Cursor . WAIT_CURSOR ) ) ;
}
}
} else {
this . setCursor ( Cursor . getPredefinedCursor ( Cursor . DEFAULT_CURSOR ) ) ;
for ( Component c : this . getComponents ( ) )
c . setCursor ( Cursor . getPredefinedCursor ( Cursor . DEFAULT_CURSOR ) ) ;
sp1 . setCursor ( Cursor . getPredefinedCursor ( Cursor . DEFAULT_CURSOR ) ) ;
sp2 . setCursor ( Cursor . getPredefinedCursor ( Cursor . DEFAULT_CURSOR ) ) ;
for ( VisibleComponent c : rfComps ) {
c . setCursor ( Cursor . getPredefinedCursor ( Cursor . DEFAULT_CURSOR ) ) ;
if ( c instanceof WorkPane ) {
WorkPane w = ( WorkPane ) c ;
for ( Component c2 : w . tabs . getComponents ( ) )
c2 . setCursor ( Cursor
. getPredefinedCursor ( Cursor . DEFAULT_CURSOR ) ) ;
}
}
}
}
2018-01-31 15:03:53 +00:00
public class Test implements KeyEventDispatcher {
@Override
public boolean dispatchKeyEvent ( KeyEvent e ) {
2018-01-31 15:41:24 +00:00
BytecodeViewer . checkHotKey ( e ) ;
2018-01-31 15:03:53 +00:00
return false ;
}
}
public final JMenuItem mntmSaveAsApk = new JMenuItem ( " Save As DEX.. " ) ;
2018-01-31 15:41:24 +00:00
public final JMenuItem mntmCodeSequenceDiagram = new JMenuItem ( " Code Sequence Diagram " ) ;
public final JSeparator separator_7 = new JSeparator ( ) ;
public final JSeparator separator_8 = new JSeparator ( ) ;
public final JRadioButtonMenuItem panel1Smali = new JRadioButtonMenuItem ( " Smali/DEX " ) ;
public final JCheckBoxMenuItem autoCompileSmali = new JCheckBoxMenuItem ( " Compile On Save " ) ;
public final JMenuItem mntmNewMenuItem_13 = new JMenuItem ( " Compile " ) ;
public final JCheckBoxMenuItem autoCompileOnRefresh = new JCheckBoxMenuItem ( " Compile On Refresh " ) ;
public final JMenuItem mntmSetPythonDirectory = new JMenuItem ( " Set Python 2.7 Executable " ) ;
public final JSeparator separator_13 = new JSeparator ( ) ;
public final JRadioButtonMenuItem panel1Krakatau = new JRadioButtonMenuItem ( " Java " ) ;
public final JRadioButtonMenuItem panel1KrakatauBytecode = new JRadioButtonMenuItem ( " Bytecode " ) ;
public final JMenuItem mntmSetJreRt = new JMenuItem ( " Set JRE RT Library " ) ;
public final JMenuItem mntmZstringarrayDecrypter = new JMenuItem ( " ZStringArray Decrypter " ) ;
public final JSeparator separator_15 = new JSeparator ( ) ;
public final JMenuItem mntmRun = new JMenuItem ( " Run " ) ;
public final JSeparator separator_18 = new JSeparator ( ) ;
public final JCheckBoxMenuItem decodeAPKResources = new JCheckBoxMenuItem ( " Decode APK Resources " ) ;
public final JMenu mnProcyon = new JMenu ( " Procyon " ) ;
public final JCheckBoxMenuItem panel1Proc_E = new JCheckBoxMenuItem ( " Editable " ) ;
public final JSeparator separator_14 = new JSeparator ( ) ;
public final JMenu mnCfr = new JMenu ( " CFR " ) ;
public final JSeparator separator_19 = new JSeparator ( ) ;
public final JCheckBoxMenuItem panel1CFR_E = new JCheckBoxMenuItem ( " Editable " ) ;
public final JMenu mnFernflower = new JMenu ( " FernFlower " ) ;
public final JSeparator separator_20 = new JSeparator ( ) ;
public final JCheckBoxMenuItem panel1Fern_E = new JCheckBoxMenuItem ( " Editable " ) ;
public final JMenu mnKrakatau = new JMenu ( " Krakatau " ) ;
public final JSeparator separator_21 = new JSeparator ( ) ;
public final JCheckBoxMenuItem panel1Krakatau_E = new JCheckBoxMenuItem ( " Editable " ) ;
public final JMenu mnSmalidex = new JMenu ( " Smali/DEX " ) ;
public final JSeparator separator_22 = new JSeparator ( ) ;
public final JCheckBoxMenuItem panel1Smali_E = new JCheckBoxMenuItem ( " Editable " ) ;
public final JMenu mnPane = new JMenu ( " Pane 2 " ) ;
public final JRadioButtonMenuItem panel2None = new JRadioButtonMenuItem ( " None " ) ;
public final JSeparator separator_9 = new JSeparator ( ) ;
public final JMenu menu_1 = new JMenu ( " Procyon " ) ;
public final JRadioButtonMenuItem panel2Proc = new JRadioButtonMenuItem ( " Java " ) ;
public final JSeparator separator_10 = new JSeparator ( ) ;
public final JCheckBoxMenuItem panel2Proc_E = new JCheckBoxMenuItem ( " Editable " ) ;
public final JMenu menu_2 = new JMenu ( " CFR " ) ;
public final JRadioButtonMenuItem panel2CFR = new JRadioButtonMenuItem ( " Java " ) ;
public final JSeparator separator_11 = new JSeparator ( ) ;
public final JCheckBoxMenuItem panel2CFR_E = new JCheckBoxMenuItem ( " Editable " ) ;
public final JMenu menu_3 = new JMenu ( " FernFlower " ) ;
public final JRadioButtonMenuItem panel2Fern = new JRadioButtonMenuItem ( " Java " ) ;
public final JSeparator separator_12 = new JSeparator ( ) ;
public final JCheckBoxMenuItem panel2Fern_E = new JCheckBoxMenuItem ( " Editable " ) ;
public final JMenu menu_4 = new JMenu ( " Krakatau " ) ;
public final JRadioButtonMenuItem panel2Krakatau = new JRadioButtonMenuItem ( " Java " ) ;
public final JRadioButtonMenuItem panel2KrakatauBytecode = new JRadioButtonMenuItem ( " Bytecode " ) ;
public final JSeparator separator_16 = new JSeparator ( ) ;
public final JCheckBoxMenuItem panel2Krakatau_E = new JCheckBoxMenuItem ( " Editable " ) ;
public final JSeparator separator_17 = new JSeparator ( ) ;
public final JMenu menu_5 = new JMenu ( " Smali/DEX " ) ;
public final JRadioButtonMenuItem panel2Smali = new JRadioButtonMenuItem ( " Smali/DEX " ) ;
public final JSeparator separator_23 = new JSeparator ( ) ;
public final JCheckBoxMenuItem panel2Smali_E = new JCheckBoxMenuItem ( " Editable " ) ;
public final JSeparator separator_24 = new JSeparator ( ) ;
public final JRadioButtonMenuItem panel2Bytecode = new JRadioButtonMenuItem ( " Bytecode " ) ;
public final JRadioButtonMenuItem panel2Hexcode = new JRadioButtonMenuItem ( " Hexcode " ) ;
public final JMenu mnPane_1 = new JMenu ( " Pane 3 " ) ;
public final JRadioButtonMenuItem panel3None = new JRadioButtonMenuItem ( " None " ) ;
public final JSeparator separator_25 = new JSeparator ( ) ;
public final JMenu menu_7 = new JMenu ( " Procyon " ) ;
public final JRadioButtonMenuItem panel3Proc = new JRadioButtonMenuItem ( " Java " ) ;
public final JSeparator separator_26 = new JSeparator ( ) ;
public final JCheckBoxMenuItem panel3Proc_E = new JCheckBoxMenuItem ( " Editable " ) ;
public final JMenu menu_8 = new JMenu ( " CFR " ) ;
public final JRadioButtonMenuItem panel3CFR = new JRadioButtonMenuItem ( " Java " ) ;
public final JSeparator separator_27 = new JSeparator ( ) ;
public final JCheckBoxMenuItem panel3CFR_E = new JCheckBoxMenuItem ( " Editable " ) ;
public final JMenu menu_9 = new JMenu ( " FernFlower " ) ;
public final JRadioButtonMenuItem panel3Fern = new JRadioButtonMenuItem ( " Java " ) ;
public final JSeparator separator_28 = new JSeparator ( ) ;
public final JCheckBoxMenuItem panel3Fern_E = new JCheckBoxMenuItem ( " Editable " ) ;
public final JMenu menu_10 = new JMenu ( " Krakatau " ) ;
public final JRadioButtonMenuItem panel3Krakatau = new JRadioButtonMenuItem ( " Java " ) ;
public final JRadioButtonMenuItem panel3KrakatauBytecode = new JRadioButtonMenuItem ( " Bytecode " ) ;
public final JSeparator separator_29 = new JSeparator ( ) ;
public final JCheckBoxMenuItem panel3Krakatau_E = new JCheckBoxMenuItem ( " Editable " ) ;
public final JSeparator separator_30 = new JSeparator ( ) ;
public final JMenu menu_11 = new JMenu ( " Smali/DEX " ) ;
public final JRadioButtonMenuItem panel3Smali = new JRadioButtonMenuItem ( " Smali/DEX " ) ;
public final JSeparator separator_31 = new JSeparator ( ) ;
public final JCheckBoxMenuItem panel3Smali_E = new JCheckBoxMenuItem ( " Editable " ) ;
public final JSeparator separator_32 = new JSeparator ( ) ;
public final JRadioButtonMenuItem panel3Bytecode = new JRadioButtonMenuItem ( " Bytecode " ) ;
public final JRadioButtonMenuItem panel3Hexcode = new JRadioButtonMenuItem ( " Hexcode " ) ;
public void setIcon ( final boolean busy ) {
SwingUtilities . invokeLater ( new Runnable ( ) {
@Override
public void run ( ) {
if ( busy ) {
try {
mntmNewMenuItem_4 . setIcon ( Resources . busyIcon ) ;
} catch ( NullPointerException e ) {
mntmNewMenuItem_4 . setIcon ( Resources . busyB64Icon ) ;
}
} else
mntmNewMenuItem_4 . setIcon ( null ) ;
mntmNewMenuItem_4 . updateUI ( ) ;
}
} ) ;
}
public final ButtonGroup panelGroup1 = new ButtonGroup ( ) ;
public final ButtonGroup panelGroup2 = new ButtonGroup ( ) ;
public final ButtonGroup panelGroup3 = new ButtonGroup ( ) ;
private final JMenuItem mntmSetOpitonalLibrary = new JMenuItem ( " Set Optional Library Folder " ) ;
private final JMenuItem mntmPingback = new JMenuItem ( " Pingback " ) ;
private final JMenu mnJdgui = new JMenu ( " JD-GUI " ) ;
public final JRadioButtonMenuItem panel3JDGUI = new JRadioButtonMenuItem ( " Java " ) ;
private final JSeparator separator_33 = new JSeparator ( ) ;
public final JCheckBoxMenuItem panel3JDGUI_E = new JCheckBoxMenuItem ( " Editable " ) ;
private final JMenu menu = new JMenu ( " JD-GUI " ) ;
public final JRadioButtonMenuItem panel2JDGUI = new JRadioButtonMenuItem ( " Java " ) ;
private final JSeparator separator_34 = new JSeparator ( ) ;
public final JCheckBoxMenuItem panel2JDGUI_E = new JCheckBoxMenuItem ( " Editable " ) ;
private final JMenu menu_6 = new JMenu ( " JD-GUI " ) ;
public final JRadioButtonMenuItem panel1JDGUI = new JRadioButtonMenuItem ( " Java " ) ;
private final JSeparator separator_35 = new JSeparator ( ) ;
public final JCheckBoxMenuItem panel1JDGUI_E = new JCheckBoxMenuItem ( " Editable " ) ;
private final JMenu mnFontSize = new JMenu ( " Font Size " ) ;
public final JSpinner fontSpinner = new JSpinner ( ) ;
private final JSeparator separator_36 = new JSeparator ( ) ;
private final JCheckBoxMenuItem chckbxmntmDeleteForiegnoutdatedLibs = new JCheckBoxMenuItem ( " Delete Foriegn/Outdated Libs " ) ;
private final JSeparator separator_37 = new JSeparator ( ) ;
private final JSeparator separator_38 = new JSeparator ( ) ;
private final JMenu mnApkConversion = new JMenu ( " APK Conversion " ) ;
public final ButtonGroup apkConversionGroup = new ButtonGroup ( ) ;
public final JRadioButtonMenuItem apkConversionDex = new JRadioButtonMenuItem ( " Dex2Jar " ) ;
public final JRadioButtonMenuItem apkConversionEnjarify = new JRadioButtonMenuItem ( " Enjarify " ) ;
private final JMenuItem mntmSetPythonx = new JMenuItem ( " Set Python 3.X Executable " ) ;
private final JMenuItem mntmReloadResources = new JMenuItem ( " Reload Resources " ) ;
private final JSeparator separator_39 = new JSeparator ( ) ;
private final JSeparator separator_40 = new JSeparator ( ) ;
private final JMenuItem mntmSetJavacExecutable = new JMenuItem ( " Set Javac Executable " ) ;
public void calledAfterLoad ( ) {
chckbxmntmDeleteForiegnoutdatedLibs . setSelected ( BytecodeViewer . deleteForiegnLibraries ) ;
}
public MainViewerGUI ( ) {
mnNewMenu_5 . setVisible ( false ) ;
KeyboardFocusManager . getCurrentKeyboardFocusManager ( ) . addKeyEventDispatcher ( new Test ( ) ) ;
this . addWindowStateListener ( new WindowAdapter ( ) {
@Override
public void windowStateChanged ( WindowEvent evt ) {
int oldState = evt . getOldState ( ) ;
int newState = evt . getNewState ( ) ;
if ( ( oldState & Frame . ICONIFIED ) = = 0 & & ( newState & Frame . ICONIFIED ) ! = 0 ) {
//System.out.println("Frame was iconized");
} else if ( ( oldState & Frame . ICONIFIED ) ! = 0 & & ( newState & Frame . ICONIFIED ) = = 0 ) {
//System.out.println("Frame was deiconized");
}
if ( ( oldState & Frame . MAXIMIZED_BOTH ) = = 0 & & ( newState & Frame . MAXIMIZED_BOTH ) ! = 0 ) {
isMaximized = true ;
} else if ( ( oldState & Frame . MAXIMIZED_BOTH ) ! = 0 & & ( newState & Frame . MAXIMIZED_BOTH ) = = 0 ) {
isMaximized = false ;
}
}
} ) ;
this . setIconImages ( Resources . iconList ) ;
ActionListener listener = new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent arg0 ) {
if ( refreshOnChange . isSelected ( ) ) {
if ( workPane . getCurrentViewer ( ) = = null )
return ;
workPane . refreshClass . doClick ( ) ;
}
}
} ;
panel1None . addActionListener ( listener ) ;
panel1Hexcode . addActionListener ( listener ) ;
obfuscatorGroup . add ( strongObf ) ;
obfuscatorGroup . add ( lightObf ) ;
obfuscatorGroup . setSelected ( strongObf . getModel ( ) , true ) ;
setDefaultCloseOperation ( JFrame . EXIT_ON_CLOSE ) ;
// procyon
/* none */
setJMenuBar ( menuBar ) ;
JMenu mnNewMenu = new JMenu ( " File " ) ;
menuBar . add ( mnNewMenu ) ;
mntmNewWorkspace . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent arg0 ) {
BytecodeViewer . resetWorkSpace ( true ) ;
}
} ) ;
JMenuItem mntmLoadJar = new JMenuItem ( " Add.. " ) ;
mntmLoadJar . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent e ) {
JFileChooser fc = new JFileChooser ( ) ;
try {
File f = new File ( BytecodeViewer . lastDirectory ) ;
if ( f . exists ( ) )
fc . setSelectedFile ( f ) ;
} catch ( Exception e2 ) {
}
fc . setFileFilter ( new FileFilter ( ) {
@Override
public boolean accept ( File f ) {
if ( f . isDirectory ( ) )
return true ;
String extension = MiscUtils . extension ( f . getAbsolutePath ( ) ) ;
if ( extension ! = null )
if ( extension . equals ( " jar " ) | | extension . equals ( " zip " )
| | extension . equals ( " class " ) | | extension . equals ( " apk " )
| | extension . equals ( " dex " ) )
return true ;
return false ;
}
@Override
public String getDescription ( ) {
return " APKs, DEX, Class Files or Zip/Jar Archives " ;
}
} ) ;
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 ) ;
}
}
}
} ) ;
mnNewMenu . add ( mntmLoadJar ) ;
mnNewMenu . add ( separator_40 ) ;
mnNewMenu . add ( mntmNewWorkspace ) ;
JMenuItem mntmSave = new JMenuItem ( " Save As Zip.. " ) ;
mntmSave . setActionCommand ( " " ) ;
mntmSave . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent arg0 ) {
if ( BytecodeViewer . getLoadedClasses ( ) . isEmpty ( ) ) {
BytecodeViewer . showMessage ( " First open a class, jar, zip, apk or dex file. " ) ;
return ;
}
Thread t = new Thread ( ) {
public void run ( ) {
if ( autoCompileSmali . isSelected ( ) & & ! BytecodeViewer . compile ( false ) )
return ;
JFileChooser fc = new JFileChooser ( ) ;
fc . setFileFilter ( new FileFilter ( ) {
@Override
public boolean accept ( File f ) {
return f . isDirectory ( ) | | MiscUtils . extension ( f . getAbsolutePath ( ) ) . equals ( " zip " ) ;
}
@Override
public String getDescription ( ) {
return " Zip Archives " ;
}
} ) ;
fc . setFileHidingEnabled ( false ) ;
fc . setAcceptAllFileFilterUsed ( false ) ;
int returnVal = fc . showSaveDialog ( MainViewerGUI . this ) ;
if ( returnVal = = JFileChooser . APPROVE_OPTION ) {
File file = fc . getSelectedFile ( ) ;
if ( ! file . getAbsolutePath ( ) . endsWith ( " .zip " ) )
file = new File ( file . getAbsolutePath ( ) + " .zip " ) ;
if ( file . exists ( ) ) {
JOptionPane pane = new JOptionPane (
" Are you sure you wish to overwrite this existing file? " ) ;
Object [ ] options = new String [ ] { " Yes " , " No " } ;
pane . setOptions ( options ) ;
JDialog dialog = pane . createDialog ( BytecodeViewer . viewer ,
" Bytecode Viewer - Overwrite File " ) ;
dialog . setVisible ( true ) ;
Object obj = pane . getValue ( ) ;
int result = - 1 ;
for ( int k = 0 ; k < options . length ; k + + )
if ( options [ k ] . equals ( obj ) )
result = k ;
if ( result = = 0 ) {
file . delete ( ) ;
} else {
return ;
}
}
final File file2 = file ;
BytecodeViewer . viewer . setIcon ( true ) ;
Thread t = new Thread ( ) {
@Override
public void run ( ) {
JarUtils . saveAsJar ( BytecodeViewer . getLoadedClasses ( ) ,
file2 . getAbsolutePath ( ) ) ;
BytecodeViewer . viewer . setIcon ( false ) ;
}
} ;
t . start ( ) ;
}
}
} ;
t . start ( ) ;
}
} ) ;
mnNewMenu . add ( separator_39 ) ;
mntmReloadResources . addActionListener ( new ActionListener ( ) {
public void actionPerformed ( ActionEvent arg0 ) {
JOptionPane pane = new JOptionPane ( " Are you sure you wish to reload the resources? " ) ;
Object [ ] options = new String [ ] { " Yes " , " No " } ;
pane . setOptions ( options ) ;
JDialog dialog = pane . createDialog ( BytecodeViewer . viewer , " Bytecode Viewer - Reload Resources " ) ;
dialog . setVisible ( true ) ;
Object obj = pane . getValue ( ) ;
int result = - 1 ;
for ( int k = 0 ; k < options . length ; k + + )
if ( options [ k ] . equals ( obj ) )
result = k ;
if ( result = = 0 ) {
ArrayList < File > reopen = new ArrayList < File > ( ) ;
for ( FileContainer container : BytecodeViewer . files )
reopen . add ( container . file ) ;
BytecodeViewer . files . clear ( ) ;
BytecodeViewer . openFiles ( reopen . toArray ( new File [ reopen . size ( ) ] ) , false ) ;
//refresh panes
}
}
} ) ;
mnNewMenu . add ( mntmReloadResources ) ;
mnNewMenu . add ( separator_3 ) ;
mntmNewMenuItem_3 . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent e ) {
if ( BytecodeViewer . getLoadedClasses ( ) . isEmpty ( ) ) {
BytecodeViewer . showMessage ( " First open a class, jar, zip, apk or dex file. " ) ;
return ;
}
Thread t = new Thread ( ) {
public void run ( ) {
if ( autoCompileSmali . isSelected ( ) & & ! BytecodeViewer . compile ( false ) )
return ;
JFileChooser fc = new JFileChooser ( ) ;
fc . setFileFilter ( new FileFilter ( ) {
@Override
public boolean accept ( File f ) {
return f . isDirectory ( ) | | MiscUtils . extension ( f . getAbsolutePath ( ) ) . equals ( " zip " ) ;
}
@Override
public String getDescription ( ) {
return " Zip Archives " ;
}
} ) ;
fc . setFileHidingEnabled ( false ) ;
fc . setAcceptAllFileFilterUsed ( false ) ;
int returnVal = fc . showSaveDialog ( MainViewerGUI . this ) ;
if ( returnVal = = JFileChooser . APPROVE_OPTION ) {
File file = fc . getSelectedFile ( ) ;
String path = file . getAbsolutePath ( ) ;
if ( ! path . endsWith ( " .jar " ) )
path = path + " .jar " ;
if ( new File ( path ) . exists ( ) ) {
JOptionPane pane = new JOptionPane (
" Are you sure you wish to overwrite this existing file? " ) ;
Object [ ] options = new String [ ] { " Yes " , " No " } ;
pane . setOptions ( options ) ;
JDialog dialog = pane . createDialog ( BytecodeViewer . viewer ,
" Bytecode Viewer - Overwrite File " ) ;
dialog . setVisible ( true ) ;
Object obj = pane . getValue ( ) ;
int result = - 1 ;
for ( int k = 0 ; k < options . length ; k + + )
if ( options [ k ] . equals ( obj ) )
result = k ;
if ( result = = 0 ) {
file . delete ( ) ;
} else {
return ;
}
}
new ExportJar ( path ) . setVisible ( true ) ;
}
}
} ;
t . start ( ) ;
}
} ) ;
mntmNewMenuItem_13 . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent arg0 ) {
Thread t = new Thread ( ) {
public void run ( ) {
BytecodeViewer . compile ( true ) ;
}
} ;
t . start ( ) ;
}
} ) ;
mntmRun . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent e ) {
if ( BytecodeViewer . getLoadedClasses ( ) . isEmpty ( ) ) {
BytecodeViewer . showMessage ( " First open a class, jar, zip, apk or dex file. " ) ;
return ;
}
new RunOptions ( ) . setVisible ( true ) ;
}
} ) ;
mnNewMenu . add ( mntmRun ) ;
mnNewMenu . add ( mntmNewMenuItem_13 ) ;
mnNewMenu . add ( separator_18 ) ;
mnNewMenu . add ( mntmNewMenuItem_3 ) ;
mntmSaveAsApk . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent arg0 ) {
if ( BytecodeViewer . getLoadedClasses ( ) . isEmpty ( ) ) {
BytecodeViewer . showMessage ( " First open a class, jar, zip, apk or dex file. " ) ;
return ;
}
Thread t = new Thread ( ) {
public void run ( ) {
if ( autoCompileSmali . isSelected ( ) & & ! BytecodeViewer . compile ( false ) )
return ;
JFileChooser fc = new JFileChooser ( ) ;
fc . setFileFilter ( new FileFilter ( ) {
@Override
public boolean accept ( File f ) {
return f . isDirectory ( ) | | MiscUtils . extension ( f . getAbsolutePath ( ) ) . equals ( " dex " ) ;
}
@Override
public String getDescription ( ) {
return " Android DEX Files " ;
}
} ) ;
fc . setFileHidingEnabled ( false ) ;
fc . setAcceptAllFileFilterUsed ( false ) ;
int returnVal = fc . showSaveDialog ( MainViewerGUI . this ) ;
if ( returnVal = = JFileChooser . APPROVE_OPTION ) {
final File file = fc . getSelectedFile ( ) ;
String output = file . getAbsolutePath ( ) ;
if ( ! output . endsWith ( " .dex " ) )
output = output + " .dex " ;
final File file2 = new File ( output ) ;
if ( file2 . exists ( ) ) {
JOptionPane pane = new JOptionPane (
" Are you sure you wish to overwrite this existing file? " ) ;
Object [ ] options = new String [ ] { " Yes " , " No " } ;
pane . setOptions ( options ) ;
JDialog dialog = pane . createDialog ( BytecodeViewer . viewer ,
" Bytecode Viewer - Overwrite File " ) ;
dialog . setVisible ( true ) ;
Object obj = pane . getValue ( ) ;
int result = - 1 ;
for ( int k = 0 ; k < options . length ; k + + )
if ( options [ k ] . equals ( obj ) )
result = k ;
if ( result = = 0 ) {
file . delete ( ) ;
} else {
return ;
}
}
Thread t = new Thread ( ) {
@Override
public void run ( ) {
BytecodeViewer . viewer . setIcon ( true ) ;
final String input = BytecodeViewer . tempDirectory + BytecodeViewer . fs + BytecodeViewer . getRandomizedName ( ) + " .jar " ;
JarUtils . saveAsJar ( BytecodeViewer . getLoadedClasses ( ) , input ) ;
Thread t = new Thread ( ) {
@Override
public void run ( ) {
Dex2Jar . saveAsDex ( new File ( input ) , file2 ) ;
BytecodeViewer . viewer . setIcon ( false ) ;
}
} ;
t . start ( ) ;
}
} ;
t . start ( ) ;
}
}
} ;
t . start ( ) ;
}
} ) ;
mnNewMenu . add ( mntmSaveAsApk ) ;
mnNewMenu . add ( mntmSave ) ;
mntmNewMenuItem . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent arg0 ) {
if ( BytecodeViewer . getLoadedClasses ( ) . isEmpty ( ) ) {
BytecodeViewer . showMessage ( " First open a class, jar, zip, apk or dex file. " ) ;
return ;
}
Thread t = new Thread ( ) {
public void run ( ) {
if ( autoCompileSmali . isSelected ( ) & & ! BytecodeViewer . compile ( false ) )
return ;
JFileChooser fc = new JFileChooser ( ) ;
fc . setFileFilter ( new FileFilter ( ) {
@Override
public boolean accept ( File f ) {
return f . isDirectory ( ) | | MiscUtils . extension ( f . getAbsolutePath ( ) ) . equals ( " zip " ) ;
}
@Override
public String getDescription ( ) {
return " Zip Archives " ;
}
} ) ;
fc . setFileHidingEnabled ( false ) ;
fc . setAcceptAllFileFilterUsed ( false ) ;
int returnVal = fc . showSaveDialog ( MainViewerGUI . this ) ;
if ( returnVal = = JFileChooser . APPROVE_OPTION ) {
File file = fc . getSelectedFile ( ) ;
if ( ! file . getAbsolutePath ( ) . endsWith ( " .zip " ) )
file = new File ( file . getAbsolutePath ( ) + " .zip " ) ;
if ( file . exists ( ) ) {
JOptionPane pane = new JOptionPane (
" Are you sure you wish to overwrite this existing file? " ) ;
Object [ ] options = new String [ ] { " Yes " , " No " } ;
pane . setOptions ( options ) ;
JDialog dialog = pane . createDialog ( BytecodeViewer . viewer ,
" Bytecode Viewer - Overwrite File " ) ;
dialog . setVisible ( true ) ;
Object obj = pane . getValue ( ) ;
int result = - 1 ;
for ( int k = 0 ; k < options . length ; k + + )
if ( options [ k ] . equals ( obj ) )
result = k ;
if ( result = = 0 ) {
file . delete ( ) ;
} else {
return ;
}
}
BytecodeViewer . viewer . setIcon ( true ) ;
final String path = MiscUtils . append ( file , " .zip " ) ; // cheap hax cause
// string is final
JOptionPane pane = new JOptionPane (
" What decompiler will you use? " ) ;
Object [ ] options = new String [ ] { " Procyon " , " CFR " ,
" Fernflower " , " Krakatau " , " Cancel " } ;
pane . setOptions ( options ) ;
JDialog dialog = pane . createDialog ( BytecodeViewer . viewer ,
" Bytecode Viewer - Select Decompiler " ) ;
dialog . setVisible ( true ) ;
Object obj = pane . getValue ( ) ;
int result = - 1 ;
for ( int k = 0 ; k < options . length ; k + + )
if ( options [ k ] . equals ( obj ) )
result = k ;
if ( result = = 0 ) {
Thread t = new Thread ( ) {
@Override
public void run ( ) {
try {
Decompiler . procyon . decompileToZip ( path ) ;
BytecodeViewer . viewer . setIcon ( false ) ;
} catch ( Exception e ) {
new the . bytecode . club . bytecodeviewer . api . ExceptionUI ( e ) ;
}
}
} ;
t . start ( ) ;
}
if ( result = = 1 ) {
Thread t = new Thread ( ) {
@Override
public void run ( ) {
try {
Decompiler . cfr . decompileToZip ( path ) ;
BytecodeViewer . viewer . setIcon ( false ) ;
} catch ( Exception e ) {
new the . bytecode . club . bytecodeviewer . api . ExceptionUI ( e ) ;
}
}
} ;
t . start ( ) ;
}
if ( result = = 2 ) {
Thread t = new Thread ( ) {
@Override
public void run ( ) {
try {
Decompiler . fernflower . decompileToZip ( path ) ;
BytecodeViewer . viewer . setIcon ( false ) ;
} catch ( Exception e ) {
new the . bytecode . club . bytecodeviewer . api . ExceptionUI ( e ) ;
}
}
} ;
t . start ( ) ;
}
if ( result = = 3 ) {
Thread t = new Thread ( ) {
@Override
public void run ( ) {
try {
Decompiler . krakatau . decompileToZip ( path ) ;
BytecodeViewer . viewer . setIcon ( false ) ;
} catch ( Exception e ) {
new the . bytecode . club . bytecodeviewer . api . ExceptionUI ( e ) ;
}
}
} ;
t . start ( ) ;
}
if ( result = = 4 ) {
BytecodeViewer . viewer . setIcon ( false ) ;
}
}
}
} ;
t . start ( ) ;
}
} ) ;
mntmNewMenuItem_12 . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent arg0 ) {
if ( workPane . getCurrentViewer ( ) = = null ) {
BytecodeViewer . showMessage ( " First open a class, jar, zip, apk or dex file. " ) ;
return ;
}
Thread t = new Thread ( ) {
public void run ( ) {
if ( autoCompileSmali . isSelected ( ) & & ! BytecodeViewer . compile ( false ) )
return ;
final String s = workPane . getCurrentViewer ( ) . name ;
JFileChooser fc = new JFileChooser ( ) ;
fc . setFileFilter ( new FileFilter ( ) {
@Override
public boolean accept ( File f ) {
return f . isDirectory ( ) | | MiscUtils . extension ( f . getAbsolutePath ( ) ) . equals ( " java " ) ;
}
@Override
public String getDescription ( ) {
return " Java Source Files " ;
}
} ) ;
fc . setFileHidingEnabled ( false ) ;
fc . setAcceptAllFileFilterUsed ( false ) ;
int returnVal = fc . showSaveDialog ( MainViewerGUI . this ) ;
if ( returnVal = = JFileChooser . APPROVE_OPTION ) {
File file = fc . getSelectedFile ( ) ;
BytecodeViewer . viewer . setIcon ( true ) ;
final String path = MiscUtils . append ( file , " .java " ) ; // cheap hax cause
// string is final
if ( new File ( path ) . exists ( ) ) {
JOptionPane pane = new JOptionPane (
" Are you sure you wish to overwrite this existing file? " ) ;
Object [ ] options = new String [ ] { " Yes " , " No " } ;
pane . setOptions ( options ) ;
JDialog dialog = pane . createDialog ( BytecodeViewer . viewer ,
" Bytecode Viewer - Overwrite File " ) ;
dialog . setVisible ( true ) ;
Object obj = pane . getValue ( ) ;
int result = - 1 ;
for ( int k = 0 ; k < options . length ; k + + )
if ( options [ k ] . equals ( obj ) )
result = k ;
if ( result = = 0 ) {
file . delete ( ) ;
} else {
return ;
}
}
JOptionPane pane = new JOptionPane (
" What decompiler will you use? " ) ;
Object [ ] options = new String [ ] { " Procyon " , " CFR " ,
" Fernflower " , " Krakatau " , " Cancel " } ;
pane . setOptions ( options ) ;
JDialog dialog = pane . createDialog ( BytecodeViewer . viewer ,
" Bytecode Viewer - Select Decompiler " ) ;
dialog . setVisible ( true ) ;
Object obj = pane . getValue ( ) ;
int result = - 1 ;
for ( int k = 0 ; k < options . length ; k + + )
if ( options [ k ] . equals ( obj ) )
result = k ;
if ( result = = 0 ) {
Thread t = new Thread ( ) {
@Override
public void run ( ) {
try {
ClassNode cn = BytecodeViewer . getClassNode ( s ) ;
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 = Decompiler . procyon . decompileClassNode ( cn , cw . toByteArray ( ) ) ;
DiskWriter . replaceFile ( path , contents , false ) ;
BytecodeViewer . viewer . setIcon ( false ) ;
} catch ( Exception e ) {
new the . bytecode . club . bytecodeviewer . api . ExceptionUI (
e ) ;
}
}
} ;
t . start ( ) ;
}
if ( result = = 1 ) {
Thread t = new Thread ( ) {
@Override
public void run ( ) {
try {
ClassNode cn = BytecodeViewer . getClassNode ( s ) ;
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 = Decompiler . cfr . decompileClassNode ( cn , cw . toByteArray ( ) ) ;
DiskWriter . replaceFile ( path , contents , false ) ;
BytecodeViewer . viewer . setIcon ( false ) ;
} catch ( Exception e ) {
new the . bytecode . club . bytecodeviewer . api . ExceptionUI (
e ) ;
}
}
} ;
t . start ( ) ;
}
if ( result = = 2 ) {
Thread t = new Thread ( ) {
@Override
public void run ( ) {
try {
ClassNode cn = BytecodeViewer . getClassNode ( s ) ;
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 = Decompiler . fernflower . decompileClassNode ( cn , cw . toByteArray ( ) ) ;
DiskWriter . replaceFile ( path , contents , false ) ;
BytecodeViewer . viewer . setIcon ( false ) ;
} catch ( Exception e ) {
new the . bytecode . club . bytecodeviewer . api . ExceptionUI (
e ) ;
}
}
} ;
t . start ( ) ;
}
if ( result = = 3 ) {
Thread t = new Thread ( ) {
@Override
public void run ( ) {
try {
ClassNode cn = BytecodeViewer . getClassNode ( s ) ;
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 = Decompiler . krakatau . decompileClassNode ( cn , cw . toByteArray ( ) ) ;
DiskWriter . replaceFile ( path , contents , false ) ;
BytecodeViewer . viewer . setIcon ( false ) ;
} catch ( Exception e ) {
new the . bytecode . club . bytecodeviewer . api . ExceptionUI (
e ) ;
}
}
} ;
t . start ( ) ;
}
if ( result = = 4 ) {
BytecodeViewer . viewer . setIcon ( false ) ;
}
}
}
} ;
t . start ( ) ;
}
} ) ;
mnNewMenu . add ( mntmNewMenuItem_12 ) ;
mnNewMenu . add ( mntmNewMenuItem ) ;
JSeparator separator = new JSeparator ( ) ;
mnNewMenu . add ( separator ) ;
mnNewMenu . add ( mnRecentFiles ) ;
JSeparator separator_1 = new JSeparator ( ) ;
mnNewMenu . add ( separator_1 ) ;
mntmAbout . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent arg0 ) {
aboutWindow . setVisible ( true ) ;
}
} ) ;
mnNewMenu . add ( mntmAbout ) ;
JMenuItem mntmExit = new JMenuItem ( " Exit " ) ;
mntmExit . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent arg0 ) {
JOptionPane pane = new JOptionPane (
" Are you sure you want to exit? " ) ;
Object [ ] options = new String [ ] { " Yes " , " No " } ;
pane . setOptions ( options ) ;
JDialog dialog = pane . createDialog ( BytecodeViewer . viewer ,
" Bytecode Viewer - Exit " ) ;
dialog . setVisible ( true ) ;
Object obj = pane . getValue ( ) ;
int result = - 1 ;
for ( int k = 0 ; k < options . length ; k + + )
if ( options [ k ] . equals ( obj ) )
result = k ;
if ( result = = 0 ) {
System . exit ( 0 ) ;
}
}
} ) ;
mntmPingback . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent arg0 ) {
BytecodeViewer . pingback ( ) ;
}
} ) ;
mnNewMenu . add ( mntmPingback ) ;
mnNewMenu . add ( mntmExit ) ;
menuBar . add ( mnNewMenu_6 ) ;
mnNewMenu_6 . add ( mnNewMenu_7 ) ;
mnNewMenu_7 . add ( panel1None ) ;
mnNewMenu_7 . add ( separator_7 ) ;
mnNewMenu_7 . add ( mnProcyon ) ;
mnProcyon . add ( panel1Proc ) ;
mnProcyon . add ( separator_14 ) ;
mnProcyon . add ( panel1Proc_E ) ;
panel1Proc . addActionListener ( listener ) ;
mnNewMenu_7 . add ( mnCfr ) ;
mnCfr . add ( panel1CFR ) ;
panel1CFR . addActionListener ( listener ) ;
mnCfr . add ( separator_19 ) ;
mnCfr . add ( panel1CFR_E ) ;
mnNewMenu_7 . add ( menu_6 ) ;
menu_6 . add ( panel1JDGUI ) ;
menu_6 . add ( separator_35 ) ;
menu_6 . add ( panel1JDGUI_E ) ;
mnNewMenu_7 . add ( mnFernflower ) ;
mnFernflower . add ( panel1Fern ) ;
panel1Fern . addActionListener ( listener ) ;
mnFernflower . add ( separator_20 ) ;
mnFernflower . add ( panel1Fern_E ) ;
mnNewMenu_7 . add ( mnKrakatau ) ;
mnKrakatau . add ( panel1Krakatau ) ;
panel1Krakatau . addActionListener ( listener ) ;
mnKrakatau . add ( panel1KrakatauBytecode ) ;
panel1KrakatauBytecode . addActionListener ( listener ) ;
mnKrakatau . add ( separator_21 ) ;
mnKrakatau . add ( panel1Krakatau_E ) ;
mnNewMenu_7 . add ( separator_8 ) ;
mnNewMenu_7 . add ( mnSmalidex ) ;
mnSmalidex . add ( panel1Smali ) ;
panel1Smali . addActionListener ( listener ) ;
mnSmalidex . add ( separator_22 ) ;
mnSmalidex . add ( panel1Smali_E ) ;
panel1Bytecode . addActionListener ( listener ) ;
mnNewMenu_7 . add ( separator_15 ) ;
mnNewMenu_7 . add ( panel1Bytecode ) ;
mnNewMenu_7 . add ( panel1Hexcode ) ;
mnNewMenu_6 . add ( mnPane ) ;
mnPane . add ( panel2None ) ;
mnPane . add ( separator_9 ) ;
mnPane . add ( menu_1 ) ;
menu_1 . add ( panel2Proc ) ;
menu_1 . add ( separator_10 ) ;
menu_1 . add ( panel2Proc_E ) ;
mnPane . add ( menu_2 ) ;
menu_2 . add ( panel2CFR ) ;
menu_2 . add ( separator_11 ) ;
menu_2 . add ( panel2CFR_E ) ;
mnPane . add ( menu ) ;
menu . add ( panel2JDGUI ) ;
menu . add ( separator_34 ) ;
menu . add ( panel2JDGUI_E ) ;
mnPane . add ( menu_3 ) ;
menu_3 . add ( panel2Fern ) ;
menu_3 . add ( separator_12 ) ;
menu_3 . add ( panel2Fern_E ) ;
mnPane . add ( menu_4 ) ;
menu_4 . add ( panel2Krakatau ) ;
menu_4 . add ( panel2KrakatauBytecode ) ;
menu_4 . add ( separator_16 ) ;
menu_4 . add ( panel2Krakatau_E ) ;
mnPane . add ( separator_17 ) ;
mnPane . add ( menu_5 ) ;
menu_5 . add ( panel2Smali ) ;
menu_5 . add ( separator_23 ) ;
menu_5 . add ( panel2Smali_E ) ;
mnPane . add ( separator_24 ) ;
mnPane . add ( panel2Bytecode ) ;
mnPane . add ( panel2Hexcode ) ;
mnNewMenu_6 . add ( mnPane_1 ) ;
mnPane_1 . add ( panel3None ) ;
mnPane_1 . add ( separator_25 ) ;
mnPane_1 . add ( menu_7 ) ;
menu_7 . add ( panel3Proc ) ;
menu_7 . add ( separator_26 ) ;
menu_7 . add ( panel3Proc_E ) ;
mnPane_1 . add ( menu_8 ) ;
menu_8 . add ( panel3CFR ) ;
menu_8 . add ( separator_27 ) ;
2018-01-31 15:03:53 +00:00
2018-01-31 15:41:24 +00:00
menu_8 . add ( panel3CFR_E ) ;
2018-01-31 15:03:53 +00:00
2018-01-31 15:41:24 +00:00
mnPane_1 . add ( mnJdgui ) ;
2018-01-31 15:03:53 +00:00
2018-01-31 15:41:24 +00:00
mnJdgui . add ( panel3JDGUI ) ;
2018-01-31 15:03:53 +00:00
2018-01-31 15:41:24 +00:00
mnJdgui . add ( separator_33 ) ;
2018-01-31 15:03:53 +00:00
2018-01-31 15:41:24 +00:00
mnJdgui . add ( panel3JDGUI_E ) ;
2018-01-31 15:03:53 +00:00
2018-01-31 15:41:24 +00:00
mnPane_1 . add ( menu_9 ) ;
2018-01-31 15:03:53 +00:00
2018-01-31 15:41:24 +00:00
menu_9 . add ( panel3Fern ) ;
2018-01-31 15:03:53 +00:00
2018-01-31 15:41:24 +00:00
menu_9 . add ( separator_28 ) ;
2018-01-31 15:03:53 +00:00
2018-01-31 15:41:24 +00:00
menu_9 . add ( panel3Fern_E ) ;
2018-01-31 15:03:53 +00:00
2018-01-31 15:41:24 +00:00
mnPane_1 . add ( menu_10 ) ;
2018-01-31 15:03:53 +00:00
2018-01-31 15:41:24 +00:00
menu_10 . add ( panel3Krakatau ) ;
2018-01-31 15:03:53 +00:00
2018-01-31 15:41:24 +00:00
menu_10 . add ( panel3KrakatauBytecode ) ;
2018-01-31 15:03:53 +00:00
2018-01-31 15:41:24 +00:00
menu_10 . add ( separator_29 ) ;
2018-01-31 15:03:53 +00:00
2018-01-31 15:41:24 +00:00
menu_10 . add ( panel3Krakatau_E ) ;
2018-01-31 15:03:53 +00:00
2018-01-31 15:41:24 +00:00
mnPane_1 . add ( separator_30 ) ;
2018-01-31 15:03:53 +00:00
2018-01-31 15:41:24 +00:00
mnPane_1 . add ( menu_11 ) ;
2018-01-31 15:03:53 +00:00
2018-01-31 15:41:24 +00:00
menu_11 . add ( panel3Smali ) ;
2018-01-31 15:03:53 +00:00
2018-01-31 15:41:24 +00:00
menu_11 . add ( separator_31 ) ;
menu_11 . add ( panel3Smali_E ) ;
mnPane_1 . add ( separator_32 ) ;
mnPane_1 . add ( panel3Bytecode ) ;
mnPane_1 . add ( panel3Hexcode ) ;
menuBar . add ( mnSettings ) ;
autoCompileSmali . setSelected ( true ) ;
mnSettings . add ( autoCompileSmali ) ;
autoCompileOnRefresh . setSelected ( true ) ;
mnSettings . add ( autoCompileOnRefresh ) ;
mnSettings . add ( refreshOnChange ) ;
mnSettings . add ( separator_38 ) ;
decodeAPKResources . setSelected ( true ) ;
mnSettings . add ( decodeAPKResources ) ;
mnSettings . add ( mnApkConversion ) ;
mnApkConversion . add ( apkConversionDex ) ;
mnApkConversion . add ( apkConversionEnjarify ) ;
mnSettings . add ( separator_37 ) ;
chckbxmntmNewCheckItem_12 . setSelected ( true ) ;
mnSettings . add ( chckbxmntmNewCheckItem_12 ) ;
chckbxmntmDeleteForiegnoutdatedLibs . addActionListener ( new ActionListener ( ) {
public void actionPerformed ( ActionEvent arg0 ) {
if ( ! chckbxmntmDeleteForiegnoutdatedLibs . isSelected ( ) ) {
BytecodeViewer . showMessage ( " WARNING: With this being toggled off outdated libraries will NOT be removed. It's also a security issue. ONLY TURN IT OFF IF YOU KNOW WHAT YOU'RE DOING. " ) ;
}
BytecodeViewer . deleteForiegnLibraries = chckbxmntmDeleteForiegnoutdatedLibs . isSelected ( ) ;
}
} ) ;
chckbxmntmDeleteForiegnoutdatedLibs . setSelected ( true ) ;
mnSettings . add ( chckbxmntmDeleteForiegnoutdatedLibs ) ;
mnSettings . add ( separator_36 ) ;
mntmSetPythonDirectory . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent arg0 ) {
pythonC ( ) ;
}
} ) ;
mnSettings . add ( mntmSetPythonDirectory ) ;
mntmSetJreRt . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent arg0 ) {
rtC ( ) ;
}
} ) ;
mntmSetPythonx . addActionListener ( new ActionListener ( ) {
public void actionPerformed ( ActionEvent arg0 ) {
pythonC3 ( ) ;
}
} ) ;
mnSettings . add ( mntmSetPythonx ) ;
mnSettings . add ( mntmSetJreRt ) ;
mntmSetOpitonalLibrary . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent arg0 ) {
library ( ) ;
}
} ) ;
mnSettings . add ( mntmSetOpitonalLibrary ) ;
mntmSetJavacExecutable . addActionListener ( new ActionListener ( ) {
public void actionPerformed ( ActionEvent arg0 ) {
javac ( ) ;
}
} ) ;
mnSettings . add ( mntmSetJavacExecutable ) ;
mnSettings . add ( separator_6 ) ;
mnSettings . add ( mnNewMenu_4 ) ;
mnNewMenu_4 . add ( chckbxmntmNewCheckItem_6 ) ;
mnNewMenu_4 . add ( chckbxmntmNewCheckItem_11 ) ;
mnNewMenu_4 . add ( chckbxmntmShowDebugLine ) ;
mnNewMenu_4 . add ( chckbxmntmNewCheckItem_3 ) ;
mnNewMenu_4 . add ( chckbxmntmNewCheckItem_4 ) ;
mnNewMenu_4 . add ( chckbxmntmNewCheckItem_7 ) ;
mnNewMenu_4 . add ( chckbxmntmSimplifyMemberReferences ) ;
mnNewMenu_4 . add ( mnMergeVariables ) ;
mnNewMenu_4 . add ( chckbxmntmNewCheckItem_8 ) ;
mnNewMenu_4 . add ( chckbxmntmNewCheckItem_9 ) ;
mnNewMenu_4 . add ( chckbxmntmNewCheckItem_10 ) ;
mnNewMenu_4 . add ( chckbxmntmNewCheckItem_2 ) ;
mnNewMenu_4 . add ( chckbxmntmNewCheckItem_5 ) ;
mnNewMenu_4 . add ( chckbxmntmNewCheckItem_1 ) ;
// cfr
decodeenumswitch . setSelected ( true ) ;
sugarenums . setSelected ( true ) ;
decodestringswitch . setSelected ( true ) ;
arrayiter . setSelected ( true ) ;
collectioniter . setSelected ( true ) ;
innerclasses . setSelected ( true ) ;
removeboilerplate . setSelected ( true ) ;
removeinnerclasssynthetics . setSelected ( true ) ;
decodelambdas . setSelected ( true ) ;
hidebridgemethods . setSelected ( true ) ;
liftconstructorinit . setSelected ( true ) ;
removedeadmethods . setSelected ( true ) ;
removebadgenerics . setSelected ( true ) ;
sugarasserts . setSelected ( true ) ;
sugarboxing . setSelected ( true ) ;
showversion . setSelected ( true ) ;
decodefinally . setSelected ( true ) ;
tidymonitors . setSelected ( true ) ;
lenient . setSelected ( false ) ;
dumpclasspath . setSelected ( false ) ;
comments . setSelected ( true ) ;
forcetopsort . setSelected ( true ) ;
forcetopsortaggress . setSelected ( true ) ;
forceexceptionprune . setSelected ( true ) ;
stringbuffer . setSelected ( false ) ;
stringbuilder . setSelected ( true ) ;
silent . setSelected ( true ) ;
recover . setSelected ( true ) ;
eclipse . setSelected ( true ) ;
override . setSelected ( true ) ;
showinferrable . setSelected ( true ) ;
aexagg . setSelected ( true ) ;
forcecondpropagate . setSelected ( true ) ;
hideutf . setSelected ( true ) ;
hidelongstrings . setSelected ( false ) ;
commentmonitor . setSelected ( false ) ;
allowcorrecting . setSelected ( true ) ;
labelledblocks . setSelected ( true ) ;
j14classobj . setSelected ( false ) ;
hidelangimports . setSelected ( true ) ;
recoverytypeclash . setSelected ( true ) ;
recoverytypehints . setSelected ( true ) ;
forceturningifs . setSelected ( true ) ;
forloopaggcapture . setSelected ( true ) ;
mnSettings . add ( mnNewMenu_3 ) ;
mnNewMenu_3 . add ( decodeenumswitch ) ;
mnNewMenu_3 . add ( sugarenums ) ;
mnNewMenu_3 . add ( decodestringswitch ) ;
mnNewMenu_3 . add ( arrayiter ) ;
mnNewMenu_3 . add ( collectioniter ) ;
mnNewMenu_3 . add ( innerclasses ) ;
mnNewMenu_3 . add ( removeboilerplate ) ;
mnNewMenu_3 . add ( removeinnerclasssynthetics ) ;
mnNewMenu_3 . add ( decodelambdas ) ;
mnNewMenu_3 . add ( hidebridgemethods ) ;
mnNewMenu_3 . add ( liftconstructorinit ) ;
mnNewMenu_3 . add ( removedeadmethods ) ;
mnNewMenu_3 . add ( removebadgenerics ) ;
mnNewMenu_3 . add ( sugarasserts ) ;
mnNewMenu_3 . add ( sugarboxing ) ;
mnNewMenu_3 . add ( showversion ) ;
mnNewMenu_3 . add ( decodefinally ) ;
mnNewMenu_3 . add ( tidymonitors ) ;
mnNewMenu_3 . add ( lenient ) ;
mnNewMenu_3 . add ( dumpclasspath ) ;
mnNewMenu_3 . add ( comments ) ;
mnNewMenu_3 . add ( forcetopsort ) ;
mnNewMenu_3 . add ( forcetopsortaggress ) ;
mnNewMenu_3 . add ( forceexceptionprune ) ;
mnNewMenu_3 . add ( stringbuffer ) ;
mnNewMenu_3 . add ( stringbuilder ) ;
mnNewMenu_3 . add ( silent ) ;
mnNewMenu_3 . add ( recover ) ;
mnNewMenu_3 . add ( eclipse ) ;
mnNewMenu_3 . add ( override ) ;
mnNewMenu_3 . add ( showinferrable ) ;
mnNewMenu_3 . add ( aexagg ) ;
mnNewMenu_3 . add ( forcecondpropagate ) ;
mnNewMenu_3 . add ( hideutf ) ;
mnNewMenu_3 . add ( hidelongstrings ) ;
mnNewMenu_3 . add ( commentmonitor ) ;
mnNewMenu_3 . add ( allowcorrecting ) ;
mnNewMenu_3 . add ( labelledblocks ) ;
mnNewMenu_3 . add ( j14classobj ) ;
mnNewMenu_3 . add ( hidelangimports ) ;
mnNewMenu_3 . add ( recoverytypeclash ) ;
mnNewMenu_3 . add ( recoverytypehints ) ;
mnNewMenu_3 . add ( forceturningifs ) ;
mnNewMenu_3 . add ( forloopaggcapture ) ;
// fernflower
rbr . setSelected ( true ) ;
rsy . setSelected ( false ) ;
din . setSelected ( true ) ;
das . setSelected ( true ) ;
dgs . setSelected ( false ) ;
den . setSelected ( true ) ;
uto . setSelected ( true ) ;
udv . setSelected ( true ) ;
fdi . setSelected ( true ) ;
asc . setSelected ( false ) ;
JMenu mnDecompilerSettings = new JMenu ( " FernFlower " ) ;
mnSettings . add ( mnDecompilerSettings ) ;
dc4 . setSelected ( true ) ;
mnDecompilerSettings . add ( dc4 ) ;
nns . setSelected ( true ) ;
mnDecompilerSettings . add ( nns ) ;
ner . setSelected ( true ) ;
mnDecompilerSettings . add ( ner ) ;
bto . setSelected ( true ) ;
mnDecompilerSettings . add ( bto ) ;
rgn . setSelected ( true ) ;
mnDecompilerSettings . add ( rgn ) ;
rer . setSelected ( true ) ;
mnDecompilerSettings . add ( rer ) ;
mnDecompilerSettings . add ( rbr ) ;
mnDecompilerSettings . add ( rsy ) ;
hes . setSelected ( true ) ;
mnDecompilerSettings . add ( hes ) ;
hdc . setSelected ( true ) ;
mnDecompilerSettings . add ( hdc ) ;
mnDecompilerSettings . add ( din ) ;
mnDecompilerSettings . add ( das ) ;
mnDecompilerSettings . add ( dgs ) ;
mnDecompilerSettings . add ( den ) ;
mnDecompilerSettings . add ( uto ) ;
mnDecompilerSettings . add ( udv ) ;
mnDecompilerSettings . add ( fdi ) ;
mnDecompilerSettings . add ( asc ) ;
debugHelpers . setSelected ( true ) ;
// other
chckbxmntmAppendBrackets . setSelected ( true ) ;
JMenu mnBytecodeDecompilerSettings = new JMenu ( " Bytecode Decompiler " ) ;
mnSettings . add ( mnBytecodeDecompilerSettings ) ;
mnBytecodeDecompilerSettings . add ( debugHelpers ) ;
mnBytecodeDecompilerSettings . add ( chckbxmntmAppendBrackets ) ;
menuBar . add ( mnNewMenu_5 ) ;
mntmNewMenuItem_6 . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent arg0 ) {
if ( BytecodeViewer . runningObfuscation ) {
BytecodeViewer . showMessage ( " You're currently running an obfuscation task, wait for this to finish. " ) ;
return ;
}
new RenameFields ( ) . start ( ) ;
workPane . refreshClass . doClick ( ) ;
cn . tree . updateUI ( ) ;
}
} ) ;
mnNewMenu_5 . add ( strongObf ) ;
mnNewMenu_5 . add ( lightObf ) ;
mnNewMenu_5 . add ( separator_2 ) ;
mntmNewMenuItem_8 . setEnabled ( false ) ;
mnNewMenu_5 . add ( mntmNewMenuItem_8 ) ;
mnNewMenu_5 . add ( mntmNewMenuItem_6 ) ;
mntmNewMenuItem_7 . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent arg0 ) {
if ( BytecodeViewer . runningObfuscation ) {
BytecodeViewer . showMessage ( " You're currently running an obfuscation task, wait for this to finish. " ) ;
return ;
}
new RenameMethods ( ) . start ( ) ;
workPane . refreshClass . doClick ( ) ;
cn . tree . updateUI ( ) ;
}
} ) ;
mnNewMenu_5 . add ( mntmNewMenuItem_7 ) ;
mntmNewMenuItem_11 . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent arg0 ) {
if ( BytecodeViewer . runningObfuscation ) {
BytecodeViewer . showMessage ( " You're currently running an obfuscation task, wait for this to finish. " ) ;
return ;
}
new RenameClasses ( ) . start ( ) ;
workPane . refreshClass . doClick ( ) ;
cn . tree . updateUI ( ) ;
}
} ) ;
mnNewMenu_5 . add ( mntmNewMenuItem_11 ) ;
mntmNewMenuItem_9 . setEnabled ( false ) ;
mnNewMenu_5 . add ( mntmNewMenuItem_9 ) ;
mntmNewMenuItem_10 . setEnabled ( false ) ;
mnNewMenu_5 . add ( mntmNewMenuItem_10 ) ;
menuBar . add ( mnNewMenu_1 ) ;
mnNewMenu_1 . add ( mntmStartExternalPlugin ) ;
mnNewMenu_1 . add ( separator_4 ) ;
mnNewMenu_1 . add ( mnRecentPlugins ) ;
mnNewMenu_1 . add ( separator_5 ) ;
mntmCodeSequenceDiagram . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent arg0 ) {
if ( BytecodeViewer . getLoadedClasses ( ) . isEmpty ( ) ) {
BytecodeViewer . showMessage ( " First open a class, jar, zip, apk or dex file. " ) ;
return ;
}
PluginManager . runPlugin ( new CodeSequenceDiagram ( ) ) ;
}
} ) ;
mnNewMenu_1 . add ( mntmCodeSequenceDiagram ) ;
mnNewMenu_1 . add ( mntmNewMenuItem_1 ) ;
mnNewMenu_1 . add ( mntmShowMainMethods ) ;
mnNewMenu_1 . add ( mntmShowAllStrings ) ;
mntmReplaceStrings . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent arg0 ) {
if ( BytecodeViewer . getLoadedClasses ( ) . isEmpty ( ) ) {
BytecodeViewer . showMessage ( " First open a class, jar, zip, apk or dex file. " ) ;
return ;
}
new ReplaceStringsOptions ( ) . setVisible ( true ) ;
}
} ) ;
mnNewMenu_1 . add ( mntmReplaceStrings ) ;
mnNewMenu_1 . add ( mntmNewMenuItem_2 ) ;
mnNewMenu_1 . add ( mntmStartZkmString ) ;
mntmZstringarrayDecrypter . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent arg0 ) {
PluginManager . runPlugin ( new ZStringArrayDecrypter ( ) ) ;
}
} ) ;
mnNewMenu_1 . add ( mntmZstringarrayDecrypter ) ;
menuBar . add ( mntmNewMenuItem_4 ) ;
mntmStartExternalPlugin . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent arg0 ) {
JFileChooser fc = new JFileChooser ( ) ;
fc . setFileFilter ( PluginManager . fileFilter ( ) ) ;
fc . setFileHidingEnabled ( false ) ;
fc . setAcceptAllFileFilterUsed ( false ) ;
int returnVal = fc . showOpenDialog ( BytecodeViewer . viewer ) ;
if ( returnVal = = JFileChooser . APPROVE_OPTION )
try {
BytecodeViewer . viewer . setIcon ( true ) ;
BytecodeViewer . startPlugin ( fc . getSelectedFile ( ) ) ;
BytecodeViewer . viewer . setIcon ( false ) ;
} catch ( Exception e1 ) {
new the . bytecode . club . bytecodeviewer . api . ExceptionUI ( e1 ) ;
}
}
} ) ;
mntmStartZkmString . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent e ) {
PluginManager . runPlugin ( new ZKMStringDecrypter ( ) ) ;
}
} ) ;
mntmNewMenuItem_2 . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent e ) {
PluginManager . runPlugin ( new AllatoriStringDecrypter ( ) ) ;
}
} ) ;
mntmNewMenuItem_1 . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent e ) {
if ( BytecodeViewer . getLoadedClasses ( ) . isEmpty ( ) ) {
BytecodeViewer . showMessage ( " First open a class, jar, zip, apk or dex file. " ) ;
return ;
}
new MaliciousCodeScannerOptions ( ) . setVisible ( true ) ;
}
} ) ;
mntmShowAllStrings . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent e ) {
PluginManager . runPlugin ( new ShowAllStrings ( ) ) ;
}
} ) ;
mntmShowMainMethods . addActionListener ( new ActionListener ( ) {
@Override
public void actionPerformed ( ActionEvent e ) {
PluginManager . runPlugin ( new ShowMainMethods ( ) ) ;
}
} ) ;
setSize ( new Dimension ( 800 , 400 ) ) ;
if ( BytecodeViewer . previewCopy )
setTitle ( " Bytecode Viewer " + BytecodeViewer . version + " Preview - https://bytecodeviewer.com | https://the.bytecode.club - @Konloch " ) ;
else
setTitle ( " Bytecode Viewer " + BytecodeViewer . version + " - https://bytecodeviewer.com | https://the.bytecode.club - @Konloch " ) ;
getContentPane ( ) . setLayout (
new BoxLayout ( getContentPane ( ) , BoxLayout . X_AXIS ) ) ;
// scrollPane.setViewportView(tree);
cn . setMinimumSize ( new Dimension ( 200 , 50 ) ) ;
// panel.add(cn);
SearchingPane s = new SearchingPane ( this ) ;
s . setPreferredSize ( new Dimension ( 200 , 50 ) ) ;
s . setMinimumSize ( new Dimension ( 200 , 50 ) ) ;
s . setMaximumSize ( new Dimension ( 200 , 2147483647 ) ) ;
// panel.add(s);
sp1 = new JSplitPane ( JSplitPane . VERTICAL_SPLIT , cn , s ) ;
// panel.add(sp1);
cn . setPreferredSize ( new Dimension ( 200 , 50 ) ) ;
cn . setMaximumSize ( new Dimension ( 200 , 2147483647 ) ) ;
sp2 = new JSplitPane ( JSplitPane . HORIZONTAL_SPLIT , sp1 , workPane ) ;
getContentPane ( ) . add ( sp2 ) ;
sp2 . setResizeWeight ( 0 . 05 ) ;
sp1 . setResizeWeight ( 0 . 5 ) ;
rfComps . add ( cn ) ;
rfComps . add ( s ) ;
rfComps . add ( workPane ) ;
apkConversionGroup . add ( apkConversionDex ) ;
apkConversionGroup . add ( apkConversionEnjarify ) ;
apkConversionGroup . setSelected ( apkConversionDex . getModel ( ) , true ) ;
panelGroup1 . add ( panel1None ) ;
panelGroup1 . add ( panel1Proc ) ;
panelGroup1 . add ( panel1CFR ) ;
panelGroup1 . add ( panel1JDGUI ) ;
panelGroup1 . add ( panel1Fern ) ;
panelGroup1 . add ( panel1Krakatau ) ;
panelGroup1 . add ( panel1KrakatauBytecode ) ;
panelGroup1 . add ( panel1Smali ) ;
panelGroup1 . add ( panel1Bytecode ) ;
panelGroup1 . add ( panel1Hexcode ) ;
panelGroup2 . add ( panel2None ) ;
panelGroup2 . add ( panel2Proc ) ;
panelGroup2 . add ( panel2CFR ) ;
panelGroup2 . add ( panel2JDGUI ) ;
panelGroup2 . add ( panel2Fern ) ;
panelGroup2 . add ( panel2Krakatau ) ;
panelGroup2 . add ( panel2KrakatauBytecode ) ;
panelGroup2 . add ( panel2Smali ) ;
panelGroup2 . add ( panel2Bytecode ) ;
panelGroup2 . add ( panel2Hexcode ) ;
panelGroup3 . add ( panel3None ) ;
panelGroup3 . add ( panel3Proc ) ;
panelGroup3 . add ( panel3CFR ) ;
panelGroup3 . add ( panel3JDGUI ) ;
panelGroup3 . add ( panel3Fern ) ;
panelGroup3 . add ( panel3Krakatau ) ;
panelGroup3 . add ( panel3KrakatauBytecode ) ;
panelGroup3 . add ( panel3Smali ) ;
panelGroup3 . add ( panel3Bytecode ) ;
panelGroup3 . add ( panel3Hexcode ) ;
mnNewMenu_6 . add ( separator_13 ) ;
fontSpinner . setPreferredSize ( new Dimension ( 42 , 20 ) ) ;
fontSpinner . setSize ( new Dimension ( 42 , 20 ) ) ;
fontSpinner . setModel ( new SpinnerNumberModel ( new Integer ( 12 ) , new Integer ( 1 ) , null , new Integer ( 1 ) ) ) ;
mnNewMenu_6 . add ( mnFontSize ) ;
mnFontSize . add ( fontSpinner ) ;
panelGroup1 . setSelected ( panel1JDGUI . getModel ( ) , true ) ;
panelGroup2 . setSelected ( panel2Bytecode . getModel ( ) , true ) ;
panelGroup3 . setSelected ( panel3None . getModel ( ) , true ) ;
this . setLocationRelativeTo ( null ) ;
}
@Override
public void openClassFile ( final String name , final ClassNode cn ) {
for ( final VisibleComponent vc : rfComps ) {
vc . openClassFile ( name , cn ) ;
}
}
@Override
public void openFile ( final String name , byte [ ] content ) {
for ( final VisibleComponent vc : rfComps ) {
vc . openFile ( name , content ) ;
}
}
@SuppressWarnings ( " unchecked " )
public static < T > T getComponent ( final Class < T > clazz ) {
for ( final VisibleComponent vc : rfComps ) {
if ( vc . getClass ( ) = = clazz )
return ( T ) vc ;
}
return null ;
}
2018-01-31 15:03:53 +00:00
}