Translations & Better About Window

This commit is contained in:
Konloch 2021-07-07 02:00:14 -07:00
parent f3c7c1881a
commit bd636f2125
30 changed files with 607 additions and 195 deletions

View File

@ -56,18 +56,12 @@ public class Boot {
private static final List<String> libsFileList = new ArrayList<>(); private static final List<String> libsFileList = new ArrayList<>();
private static final List<String> urlList = new ArrayList<>(); private static final List<String> urlList = new ArrayList<>();
static {
try {
screen = new InitialBootScreen();
} catch (Exception e) {
BytecodeViewer.handleException(e);
}
}
public static void boot(String[] args, boolean CLI) throws Exception { public static void boot(String[] args, boolean CLI) throws Exception {
bootstrap(); bootstrap();
ILoader<?> loader = findLoader(); ILoader<?> loader = findLoader();
screen = new InitialBootScreen();
if (!CLI) if (!CLI)
SwingUtilities.invokeLater(() -> screen.setVisible(true)); SwingUtilities.invokeLater(() -> screen.setVisible(true));

View File

@ -16,6 +16,9 @@ import javax.swing.text.html.HTMLEditorKit;
import the.bytecode.club.bytecodeviewer.BytecodeViewer; import the.bytecode.club.bytecodeviewer.BytecodeViewer;
import the.bytecode.club.bytecodeviewer.Configuration; import the.bytecode.club.bytecodeviewer.Configuration;
import the.bytecode.club.bytecodeviewer.Resources; import the.bytecode.club.bytecodeviewer.Resources;
import the.bytecode.club.bytecodeviewer.gui.components.HTMLPane;
import static the.bytecode.club.bytecodeviewer.Configuration.language;
/*************************************************************************** /***************************************************************************
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite * * Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
@ -40,12 +43,12 @@ import the.bytecode.club.bytecodeviewer.Resources;
* @author Bibl (don't ban me pls) * @author Bibl (don't ban me pls)
* @created 19 Jul 2015 04:12:21 * @created 19 Jul 2015 04:12:21
*/ */
public class InitialBootScreen extends JFrame { public class InitialBootScreen extends JFrame
private static final long serialVersionUID = -1098467609722393444L; {
private final JProgressBar progressBar = new JProgressBar(); private final JProgressBar progressBar = new JProgressBar();
public InitialBootScreen() throws IOException { public InitialBootScreen() throws IOException
{
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() { addWindowListener(new WindowAdapter() {
@Override @Override
@ -56,24 +59,14 @@ public class InitialBootScreen extends JFrame {
}); });
this.setIconImages(Resources.iconList); this.setIconImages(Resources.iconList);
int i = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight(); setSize(getSafeSize());
if (i >= 840)
setSize(new Dimension(600, 800));
else if (i >= 640)
setSize(new Dimension(500, 600));
else if (i >= 440)
setSize(new Dimension(400, 400));
else
setSize(Toolkit.getDefaultToolkit().getScreenSize());
setTitle("Bytecode Viewer Boot Screen - Starting Up"); setTitle("Bytecode Viewer Boot Screen - Starting Up");
GridBagLayout gridBagLayout = new GridBagLayout(); GridBagLayout gridBagLayout = new GridBagLayout();
gridBagLayout.columnWidths = new int[]{0, 0}; gridBagLayout.columnWidths = new int[]{0, 0};
gridBagLayout.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, gridBagLayout.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
0, 0};
gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE}; gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE};
gridBagLayout.rowWeights = new double[]{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, gridBagLayout.rowWeights = new double[]{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
getContentPane().setLayout(gridBagLayout); getContentPane().setLayout(gridBagLayout);
JScrollPane scrollPane = new JScrollPane(); JScrollPane scrollPane = new JScrollPane();
@ -84,14 +77,8 @@ public class InitialBootScreen extends JFrame {
gbc_scrollPane.gridx = 0; gbc_scrollPane.gridx = 0;
gbc_scrollPane.gridy = 0; gbc_scrollPane.gridy = 0;
getContentPane().add(scrollPane, gbc_scrollPane); getContentPane().add(scrollPane, gbc_scrollPane);
JEditorPane editorPane = new JEditorPane(); scrollPane.setViewportView(HTMLPane.fromResource(language.getHTMLPath("intro")));
editorPane.setEditorKit(new HTMLEditorKit());
editorPane.setText(convertStreamToString(InitialBootScreen.class.getClassLoader().getResourceAsStream("intro"
+ ".html")));
scrollPane.setViewportView(editorPane);
GridBagConstraints gbc_progressBar = new GridBagConstraints(); GridBagConstraints gbc_progressBar = new GridBagConstraints();
gbc_progressBar.fill = GridBagConstraints.HORIZONTAL; gbc_progressBar.fill = GridBagConstraints.HORIZONTAL;
@ -100,17 +87,23 @@ public class InitialBootScreen extends JFrame {
getContentPane().add(progressBar, gbc_progressBar); getContentPane().add(progressBar, gbc_progressBar);
this.setLocationRelativeTo(null); this.setLocationRelativeTo(null);
} }
static String convertStreamToString(java.io.InputStream is) throws IOException { public static Dimension getSafeSize()
@SuppressWarnings("resource") {
java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A"); int i = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
String string = s.hasNext() ? s.next() : ""; if (i >= 840)
is.close(); return new Dimension(600, 800);
s.close(); else if (i >= 640)
return string; return new Dimension(500, 600);
else if (i >= 440)
return new Dimension(400, 400);
else
return Toolkit.getDefaultToolkit().getScreenSize();
} }
public JProgressBar getProgressBar() { public JProgressBar getProgressBar() {
return progressBar; return progressBar;
} }
private static final long serialVersionUID = -1098467609722393444L;
} }

View File

@ -22,7 +22,7 @@ public class GlobalHotKeys
*/ */
public static void keyPressed(KeyEvent e) public static void keyPressed(KeyEvent e)
{ {
if (System.currentTimeMillis() - Configuration.lastHotKeyExecuted <= (4000)) if (System.currentTimeMillis() - Configuration.lastHotKeyExecuted <= (600))
return; return;
//CTRL + O //CTRL + O

View File

@ -20,9 +20,11 @@ import org.objectweb.asm.tree.ClassNode;
import the.bytecode.club.bytecodeviewer.BytecodeViewer; import the.bytecode.club.bytecodeviewer.BytecodeViewer;
import the.bytecode.club.bytecodeviewer.api.ExceptionUI; import the.bytecode.club.bytecodeviewer.api.ExceptionUI;
import the.bytecode.club.bytecodeviewer.decompilers.InternalDecompiler; import the.bytecode.club.bytecodeviewer.decompilers.InternalDecompiler;
import the.bytecode.club.bytecodeviewer.translation.TranslatedStrings;
import the.bytecode.club.bytecodeviewer.util.MiscUtils; import the.bytecode.club.bytecodeviewer.util.MiscUtils;
import static the.bytecode.club.bytecodeviewer.Constants.*; import static the.bytecode.club.bytecodeviewer.Constants.*;
import static the.bytecode.club.bytecodeviewer.translation.TranslatedStrings.*;
/*************************************************************************** /***************************************************************************
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite * * Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
@ -143,8 +145,9 @@ public class CFRDecompiler extends InternalDecompiler
if (file.exists()) if (file.exists())
return findFile(Objects.requireNonNull(file.listFiles())); return findFile(Objects.requireNonNull(file.listFiles()));
return "CFR error! " + ExceptionUI.SEND_STACKTRACE_TO + return CFR + " " + ERROR + "! " + ExceptionUI.SEND_STACKTRACE_TO +
nl + nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler." + nl + nl + exception; nl + nl + TranslatedStrings.SUGGESTED_FIX_DECOMPILER_ERROR +
nl + nl + exception;
} }
Random r = new Random(); Random r = new Random();
@ -171,10 +174,10 @@ public class CFRDecompiler extends InternalDecompiler
e.printStackTrace(new PrintWriter(sw)); e.printStackTrace(new PrintWriter(sw));
e.printStackTrace(); e.printStackTrace();
String exception = String exception = "Bytecode Viewer Version: " + VERSION + nl + nl + sw;
"Bytecode Viewer Version: " + VERSION + nl + nl + sw;
return "CFR error! " + ExceptionUI.SEND_STACKTRACE_TO + return CFR + " " + ERROR + "! " + ExceptionUI.SEND_STACKTRACE_TO +
nl + nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler." + nl + nl + TranslatedStrings.SUGGESTED_FIX_DECOMPILER_ERROR +
nl + nl + exception; nl + nl + exception;
} }
@ -183,7 +186,7 @@ public class CFRDecompiler extends InternalDecompiler
} }
return "CFR error!" + return "CFR error!" +
nl + nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler."; nl + nl + TranslatedStrings.SUGGESTED_FIX_DECOMPILER_ERROR;
} }
public String[] generateMainMethod(String filePath, String outputPath) { public String[] generateMainMethod(String filePath, String outputPath) {

View File

@ -12,9 +12,11 @@ import the.bytecode.club.bytecodeviewer.BytecodeViewer;
import the.bytecode.club.bytecodeviewer.Resources; import the.bytecode.club.bytecodeviewer.Resources;
import the.bytecode.club.bytecodeviewer.api.ExceptionUI; import the.bytecode.club.bytecodeviewer.api.ExceptionUI;
import the.bytecode.club.bytecodeviewer.decompilers.InternalDecompiler; import the.bytecode.club.bytecodeviewer.decompilers.InternalDecompiler;
import the.bytecode.club.bytecodeviewer.translation.TranslatedStrings;
import the.bytecode.club.bytecodeviewer.util.MiscUtils; import the.bytecode.club.bytecodeviewer.util.MiscUtils;
import static the.bytecode.club.bytecodeviewer.Constants.*; import static the.bytecode.club.bytecodeviewer.Constants.*;
import static the.bytecode.club.bytecodeviewer.translation.TranslatedStrings.*;
/*************************************************************************** /***************************************************************************
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite * * Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
@ -130,9 +132,10 @@ public class FernFlowerDecompiler extends InternalDecompiler
exception += nl + nl + sw; exception += nl + nl + sw;
} }
} }
return "FernFlower error! " + ExceptionUI.SEND_STACKTRACE_TO
+ nl + nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler." return FERNFLOWER + " " + ERROR + "! " + ExceptionUI.SEND_STACKTRACE_TO +
+ nl + nl + exception; nl + nl + TranslatedStrings.SUGGESTED_FIX_DECOMPILER_ERROR +
nl + nl + exception;
} }
private String[] generateMainMethod(String className, String folder) { private String[] generateMainMethod(String className, String folder) {

View File

@ -14,9 +14,11 @@ import org.objectweb.asm.tree.ClassNode;
import the.bytecode.club.bytecodeviewer.BytecodeViewer; import the.bytecode.club.bytecodeviewer.BytecodeViewer;
import the.bytecode.club.bytecodeviewer.api.ExceptionUI; import the.bytecode.club.bytecodeviewer.api.ExceptionUI;
import the.bytecode.club.bytecodeviewer.decompilers.InternalDecompiler; import the.bytecode.club.bytecodeviewer.decompilers.InternalDecompiler;
import the.bytecode.club.bytecodeviewer.translation.TranslatedStrings;
import the.bytecode.club.bytecodeviewer.util.MiscUtils; import the.bytecode.club.bytecodeviewer.util.MiscUtils;
import static the.bytecode.club.bytecodeviewer.Constants.*; import static the.bytecode.club.bytecodeviewer.Constants.*;
import static the.bytecode.club.bytecodeviewer.translation.TranslatedStrings.*;
/*************************************************************************** /***************************************************************************
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite * * Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
@ -86,9 +88,9 @@ public class JADXDecompiler extends InternalDecompiler
if(exception.isEmpty()) if(exception.isEmpty())
exception = "Decompiled source file not found!"; exception = "Decompiled source file not found!";
return "JADX error! " + ExceptionUI.SEND_STACKTRACE_TO return JADX + " " + ERROR + "! " + ExceptionUI.SEND_STACKTRACE_TO +
+ nl + nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler." nl + nl + TranslatedStrings.SUGGESTED_FIX_DECOMPILER_ERROR +
+ nl + nl + exception; nl + nl + exception;
} }
Random r = new Random(); Random r = new Random();
@ -116,15 +118,16 @@ public class JADXDecompiler extends InternalDecompiler
e.printStackTrace(); e.printStackTrace();
String exception = "Bytecode Viewer Version: " + VERSION + nl + nl + sw; String exception = "Bytecode Viewer Version: " + VERSION + nl + nl + sw;
return "JADX error! " + ExceptionUI.SEND_STACKTRACE_TO + return JADX + " " + ERROR + "! " + ExceptionUI.SEND_STACKTRACE_TO +
nl + nl + "Suggested Fix: Click refresh class, " + nl + nl + TranslatedStrings.SUGGESTED_FIX_DECOMPILER_ERROR +
"if it fails again try another decompiler." + nl + nl + exception; nl + nl + exception;
} }
return s; return s;
} }
} }
return "JADX error!" + nl + nl + "Suggested Fix: Click refresh class, if it "
+ "fails again try another decompiler."; return "JADX error!" +
nl + nl + TranslatedStrings.SUGGESTED_FIX_DECOMPILER_ERROR;
} }
@Override @Override

View File

@ -18,9 +18,11 @@ import me.konloch.kontainer.io.DiskReader;
import org.jd.core.v1.ClassFileToJavaSourceDecompiler; import org.jd.core.v1.ClassFileToJavaSourceDecompiler;
import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.ClassNode;
import the.bytecode.club.bytecodeviewer.Constants; import the.bytecode.club.bytecodeviewer.Constants;
import the.bytecode.club.bytecodeviewer.translation.TranslatedStrings;
import the.bytecode.club.bytecodeviewer.util.MiscUtils; import the.bytecode.club.bytecodeviewer.util.MiscUtils;
import static the.bytecode.club.bytecodeviewer.Constants.*; import static the.bytecode.club.bytecodeviewer.Constants.*;
import static the.bytecode.club.bytecodeviewer.translation.TranslatedStrings.*;
/*************************************************************************** /***************************************************************************
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite * * Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
@ -118,9 +120,9 @@ public class JDGUIDecompiler extends InternalDecompiler
"Bytecode Viewer Version: " + VERSION + nl + nl + sw; "Bytecode Viewer Version: " + VERSION + nl + nl + sw;
} }
return "JD-GUI error! " + ExceptionUI.SEND_STACKTRACE_TO return JDGUI + " " + ERROR + "! " + ExceptionUI.SEND_STACKTRACE_TO +
+ nl + nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler." nl + nl + TranslatedStrings.SUGGESTED_FIX_DECOMPILER_ERROR +
+ nl + nl + exception; nl + nl + exception;
} }
@Override @Override

View File

@ -34,10 +34,12 @@ import org.objectweb.asm.tree.ClassNode;
import the.bytecode.club.bytecodeviewer.BytecodeViewer; import the.bytecode.club.bytecodeviewer.BytecodeViewer;
import the.bytecode.club.bytecodeviewer.api.ExceptionUI; import the.bytecode.club.bytecodeviewer.api.ExceptionUI;
import the.bytecode.club.bytecodeviewer.decompilers.InternalDecompiler; import the.bytecode.club.bytecodeviewer.decompilers.InternalDecompiler;
import the.bytecode.club.bytecodeviewer.translation.TranslatedStrings;
import the.bytecode.club.bytecodeviewer.util.EncodeUtils; import the.bytecode.club.bytecodeviewer.util.EncodeUtils;
import the.bytecode.club.bytecodeviewer.util.MiscUtils; import the.bytecode.club.bytecodeviewer.util.MiscUtils;
import static the.bytecode.club.bytecodeviewer.Constants.*; import static the.bytecode.club.bytecodeviewer.Constants.*;
import static the.bytecode.club.bytecodeviewer.translation.TranslatedStrings.*;
/*************************************************************************** /***************************************************************************
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite * * Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
@ -115,9 +117,8 @@ public class ProcyonDecompiler extends InternalDecompiler
decompilationOptions.setFullDecompilation(true); decompilationOptions.setFullDecompilation(true);
TypeDefinition resolvedType; TypeDefinition resolvedType;
if (type == null || ((resolvedType = type.resolve()) == null)) { if (type == null || ((resolvedType = type.resolve()) == null))
throw new Exception("Unable to resolve type."); throw new Exception("Unable to resolve type.");
}
StringWriter stringwriter = new StringWriter(); StringWriter stringwriter = new StringWriter();
settings.getLanguage().decompileType(resolvedType, new PlainTextOutput(stringwriter), decompilationOptions); settings.getLanguage().decompileType(resolvedType, new PlainTextOutput(stringwriter), decompilationOptions);
@ -130,9 +131,10 @@ public class ProcyonDecompiler extends InternalDecompiler
exception = "Bytecode Viewer Version: " + VERSION + nl + nl + sw; exception = "Bytecode Viewer Version: " + VERSION + nl + nl + sw;
} }
return "Procyon error! " + ExceptionUI.SEND_STACKTRACE_TO
+ nl + nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler." return PROCYON + " " + ERROR + "! " + ExceptionUI.SEND_STACKTRACE_TO +
+ nl + nl + exception; nl + nl + TranslatedStrings.SUGGESTED_FIX_DECOMPILER_ERROR +
nl + nl + exception;
} }
@Override @Override

View File

@ -12,11 +12,13 @@ import org.objectweb.asm.tree.ClassNode;
import the.bytecode.club.bytecodeviewer.BytecodeViewer; import the.bytecode.club.bytecodeviewer.BytecodeViewer;
import the.bytecode.club.bytecodeviewer.api.ExceptionUI; import the.bytecode.club.bytecodeviewer.api.ExceptionUI;
import the.bytecode.club.bytecodeviewer.decompilers.InternalDecompiler; import the.bytecode.club.bytecodeviewer.decompilers.InternalDecompiler;
import the.bytecode.club.bytecodeviewer.translation.TranslatedStrings;
import the.bytecode.club.bytecodeviewer.util.Dex2Jar; import the.bytecode.club.bytecodeviewer.util.Dex2Jar;
import the.bytecode.club.bytecodeviewer.util.FileContainer; import the.bytecode.club.bytecodeviewer.util.FileContainer;
import the.bytecode.club.bytecodeviewer.util.MiscUtils; import the.bytecode.club.bytecodeviewer.util.MiscUtils;
import static the.bytecode.club.bytecodeviewer.Constants.*; import static the.bytecode.club.bytecodeviewer.Constants.*;
import static the.bytecode.club.bytecodeviewer.translation.TranslatedStrings.*;
/*************************************************************************** /***************************************************************************
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite * * Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
@ -115,10 +117,10 @@ public class SmaliDisassembler extends InternalDecompiler
exception += "Bytecode Viewer Version: " + VERSION + nl + nl + sw; exception += "Bytecode Viewer Version: " + VERSION + nl + nl + sw;
} }
return "Smali Disassembler error! " + ExceptionUI.SEND_STACKTRACE_TO return SMALI + " " + DISASSEMBLER + " " + ERROR + "! " + ExceptionUI.SEND_STACKTRACE_TO +
+ nl + nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler." nl + nl + TranslatedStrings.SUGGESTED_FIX_DECOMPILER_ERROR +
+ nl + nl + exception; nl + nl + exception;
} }
@Override @Override

View File

@ -62,7 +62,6 @@ import static the.bytecode.club.bytecodeviewer.Constants.*;
*/ */
public class MainViewerGUI extends JFrame public class MainViewerGUI extends JFrame
{ {
public AboutWindow aboutWindow = new AboutWindow();
public boolean isMaximized; public boolean isMaximized;
public final List<JMenuItem> waitIcons = new ArrayList<>(); public final List<JMenuItem> waitIcons = new ArrayList<>();
@ -156,7 +155,7 @@ public class MainViewerGUI extends JFrame
public JCheckBoxMenuItem debugHelpers = new TranslatedJCheckBoxMenuItem("Debug Helpers", Translation.DEBUG_HELPERS); public JCheckBoxMenuItem debugHelpers = new TranslatedJCheckBoxMenuItem("Debug Helpers", Translation.DEBUG_HELPERS);
//FernFlower settings //FernFlower settings
public final JMenu fernFlowerSettingsSecondaryMenu = new JMenu("FernFlower"); public final JMenu fernFlowerSettingsSecondaryMenu = new TranslatedJMenu("FernFlower", Translation.FERNFLOWER);
public JCheckBoxMenuItem rbr = new JCheckBoxMenuItem("Hide bridge methods"); public JCheckBoxMenuItem rbr = new JCheckBoxMenuItem("Hide bridge methods");
public JCheckBoxMenuItem rsy = new JCheckBoxMenuItem("Hide synthetic class members"); public JCheckBoxMenuItem rsy = new JCheckBoxMenuItem("Hide synthetic class members");
public JCheckBoxMenuItem din = new JCheckBoxMenuItem("Decompile inner classes"); public JCheckBoxMenuItem din = new JCheckBoxMenuItem("Decompile inner classes");
@ -178,7 +177,7 @@ public class MainViewerGUI extends JFrame
public JCheckBoxMenuItem ren = new JCheckBoxMenuItem("Rename ambiguous classes and class elements"); public JCheckBoxMenuItem ren = new JCheckBoxMenuItem("Rename ambiguous classes and class elements");
//Proycon //Proycon
public final JMenu procyonSettingsSecondaryMenu = new JMenu("Procyon"); public final JMenu procyonSettingsSecondaryMenu = new TranslatedJMenu("Procyon", Translation.PROCYON);
public final JCheckBoxMenuItem alwaysGenerateExceptionVars = new JCheckBoxMenuItem("Always Generate Exception Variable For Catch Blocks"); public final JCheckBoxMenuItem alwaysGenerateExceptionVars = new JCheckBoxMenuItem("Always Generate Exception Variable For Catch Blocks");
public final JCheckBoxMenuItem excludeNestedTypes = new JCheckBoxMenuItem("Exclude Nested Types"); public final JCheckBoxMenuItem excludeNestedTypes = new JCheckBoxMenuItem("Exclude Nested Types");
public final JCheckBoxMenuItem showDebugLineNumbers = new JCheckBoxMenuItem("Show Debug Line Numbers"); public final JCheckBoxMenuItem showDebugLineNumbers = new JCheckBoxMenuItem("Show Debug Line Numbers");
@ -195,7 +194,7 @@ public class MainViewerGUI extends JFrame
public final JCheckBoxMenuItem unicodeOutputEnabled = new JCheckBoxMenuItem("Unicode Output Enabled"); public final JCheckBoxMenuItem unicodeOutputEnabled = new JCheckBoxMenuItem("Unicode Output Enabled");
//CFR //CFR
public final JMenu cfrSettingsSecondaryMenu = new JMenu("CFR"); public final JMenu cfrSettingsSecondaryMenu = new TranslatedJMenu("CFR", Translation.CFR);
public final JCheckBoxMenuItem decodeEnumSwitch = new JCheckBoxMenuItem("Decode Enum Switch"); public final JCheckBoxMenuItem decodeEnumSwitch = new JCheckBoxMenuItem("Decode Enum Switch");
public final JCheckBoxMenuItem sugarEnums = new JCheckBoxMenuItem("SugarEnums"); public final JCheckBoxMenuItem sugarEnums = new JCheckBoxMenuItem("SugarEnums");
public final JCheckBoxMenuItem decodeStringSwitch = new JCheckBoxMenuItem("Decode String Switch"); public final JCheckBoxMenuItem decodeStringSwitch = new JCheckBoxMenuItem("Decode String Switch");
@ -342,7 +341,7 @@ public class MainViewerGUI extends JFrame
saveAsZip.addActionListener(arg0 -> Export.ZIP.getExporter().promptForExport()); saveAsZip.addActionListener(arg0 -> Export.ZIP.getExporter().promptForExport());
decompileSaveAll.addActionListener(arg0 -> ResourceDecompiling.decompileSaveAll()); decompileSaveAll.addActionListener(arg0 -> ResourceDecompiling.decompileSaveAll());
decompileSaveOpened.addActionListener(arg0 -> ResourceDecompiling.decompileSaveOpenedOnly()); decompileSaveOpened.addActionListener(arg0 -> ResourceDecompiling.decompileSaveOpenedOnly());
about.addActionListener(arg0 -> aboutWindow.setVisible(true)); about.addActionListener(arg0 -> new AboutWindow().setVisible(true));
exit.addActionListener(arg0 -> askBeforeExiting()); exit.addActionListener(arg0 -> askBeforeExiting());
} }
@ -382,8 +381,8 @@ public class MainViewerGUI extends JFrame
settingsMainMenu.add(setOptionalLibrary); settingsMainMenu.add(setOptionalLibrary);
settingsMainMenu.add(setJavac); settingsMainMenu.add(setJavac);
settingsMainMenu.add(new JSeparator()); settingsMainMenu.add(new JSeparator());
fontSpinner.setPreferredSize(new Dimension(42, 20)); fontSpinner.setPreferredSize(new Dimension(60, 24));
fontSpinner.setSize(new Dimension(42, 20)); fontSpinner.setMinimumSize(new Dimension(60, 24));
fontSpinner.setModel(new SpinnerNumberModel(12, 1, null, 1)); fontSpinner.setModel(new SpinnerNumberModel(12, 1, null, 1));
fontSize.add(fontSpinner); fontSize.add(fontSpinner);

View File

@ -1,13 +1,14 @@
package the.bytecode.club.bytecodeviewer.gui.components; package the.bytecode.club.bytecodeviewer.gui.components;
import java.awt.CardLayout; import java.awt.*;
import java.awt.Color; import java.io.IOException;
import java.awt.Font;
import java.awt.Toolkit;
import javax.swing.JFrame; import javax.swing.JFrame;
import javax.swing.JScrollPane; import javax.swing.JScrollPane;
import javax.swing.JTextArea; import javax.swing.JTextArea;
import the.bytecode.club.bootloader.InitialBootScreen;
import the.bytecode.club.bytecodeviewer.BytecodeViewer; import the.bytecode.club.bytecodeviewer.BytecodeViewer;
import the.bytecode.club.bytecodeviewer.Configuration;
import the.bytecode.club.bytecodeviewer.Resources; import the.bytecode.club.bytecodeviewer.Resources;
import static the.bytecode.club.bytecodeviewer.Configuration.*; import static the.bytecode.club.bytecodeviewer.Configuration.*;
@ -32,80 +33,34 @@ import static the.bytecode.club.bytecodeviewer.Constants.*;
***************************************************************************/ ***************************************************************************/
/** /**
* The about frame. * The about frame
* *
* @author Konloch * @author Konloch
*/ */
public class AboutWindow extends JFrame public class AboutWindow extends JFrame
{ {
JTextArea textArea = new JTextArea();
public AboutWindow() public AboutWindow()
{ {
this.setIconImages(Resources.iconList); this.setIconImages(Resources.iconList);
setSize(Toolkit.getDefaultToolkit().getScreenSize()); setSize(InitialBootScreen.getSafeSize());
setType(Type.UTILITY);
setTitle("Bytecode Viewer - About - https://bytecodeviewer.com | https://the.bytecode.club"); setTitle("Bytecode Viewer - About - https://bytecodeviewer.com | https://the.bytecode.club");
getContentPane().setLayout(new CardLayout(0, 0)); getContentPane().setLayout(new CardLayout(0, 0));
JScrollPane scrollPane = new JScrollPane(); JScrollPane scrollPane = new JScrollPane();
getContentPane().add(scrollPane, "name_845520934713596"); getContentPane().add(scrollPane);
textArea.setWrapStyleWord(true);
textArea.setEnabled(false); try
textArea.setDisabledTextColor(Color.BLACK); {
scrollPane.setViewportView(textArea); scrollPane.setViewportView(HTMLPane.fromResource(language.getHTMLPath("intro")));
this.setResizable(false); }
catch (IOException e)
{
e.printStackTrace();
}
this.setLocationRelativeTo(null); this.setLocationRelativeTo(null);
} }
@Override
public void setVisible(boolean b)
{
super.setVisible(b);
textArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int) BytecodeViewer.viewer.fontSpinner.getValue()));
textArea.setText("Bytecode Viewer " + VERSION + " is an open source program developed and " +
"maintained by Konloch (konloch@gmail.com) 100% free and open sourced licensed under GPL v3 " +
"CopyLeft" + nl + nl +
"Settings:" + nl +
" Preview Copy: " + PREVIEW_COPY + nl +
" Fat Jar: " + FAT_JAR + nl +
" Java: " + java + nl +
" Javac: " + javac + nl +
" BCV Dir: " + getBCVDirectory() + nl +
" Python 2.7 (or PyPy): " + python + nl +
" Python 3.X (or PyPy): " + python3 + nl +
" RT.jar:" + rt + nl +
" Optional Lib: " + library + nl +
" BCV Krakatau: v" + krakatauVersion + nl +
" Krakatau Dir: " + krakatauWorkingDirectory + nl +
" BCV Enjarify: v" + enjarifyVersion + nl +
" Enjarify Dir: " + enjarifyWorkingDirectory + nl + nl +
"Command Line Input:" + nl +
" -help Displays the help menu" + nl +
" -list Displays the available decompilers" + nl +
" -decompiler <decompiler> Selects the decompiler, procyon by default" + nl +
" -i <input file> Selects the input file (Jar, Class, APK, ZIP, DEX all work " +
"automatically)" + nl +
" -o <output file> Selects the output file (Java or Java-Bytecode)" + nl +
" -t <target classname> Must either be the fully qualified classname or \"all\" to decompile" +
" all as zip" + nl +
" -nowait Doesn't wait for the user to read the CLI messages" + nl + nl +
"Keybinds:" + nl +
" CTRL + O: Open/add new jar/class/apk" + nl +
" CTLR + N: Reset the workspace" + nl +
" CTRL + W: Closes the currently opened tab" + nl +
" CTRL + T: Compile" + nl +
" CTRL + S: Save classes as zip" + nl +
" CTRL + R: Run (EZ-Inject) - dynamically load the classes and invoke a main class" +
"\r\n\r\nCode from various projects has been used, including but not limited to:\r\n J-RET by " +
"WaterWolf\r\n JHexPane by Sam Koivu\r\n RSynaxPane by Robert Futrell\r\n Commons IO by " +
"Apache\r\n ASM by OW2\r\n FernFlower by Stiver\r\n Procyon by Mstrobel\r\n CFR by Lee " +
"Benfield\r\n CFIDE by Bibl\r\n Smali by JesusFreke\r\n Dex2Jar by pxb1..?\r\n Krakatau by " +
"Storyyeller\r\n JD-GUI + JD-Core by The Java-Decompiler Team\r\n Enjarify by " +
"Storyyeller\r\n\r\nIf you're interested in Java Reverse Engineering, join The Bytecode Club - " +
"https://the.bytecode.club");
}
private static final long serialVersionUID = -8230501978224923296L; private static final long serialVersionUID = -8230501978224923296L;
} }

View File

@ -0,0 +1,61 @@
package the.bytecode.club.bytecodeviewer.gui.components;
import the.bytecode.club.bootloader.InitialBootScreen;
import the.bytecode.club.bytecodeviewer.Configuration;
import javax.swing.*;
import javax.swing.text.html.HTMLEditorKit;
import java.io.IOException;
import static the.bytecode.club.bytecodeviewer.Constants.*;
/**
* @author Konloch
* @since 7/7/2021
*/
public class HTMLPane extends JEditorPane
{
private HTMLPane()
{
setEditorKit(new HTMLEditorKit());
setEditable(false);
}
public static HTMLPane fromResource(String resourcePath) throws IOException
{
return fromString(convertStreamToString(InitialBootScreen.class.getClassLoader().getResourceAsStream(resourcePath)));
}
public static HTMLPane fromString(String text)
{
HTMLPane pane = new HTMLPane();
text = text.replace("{previewCopy}", String.valueOf(PREVIEW_COPY));
text = text.replace("{fatJar}", String.valueOf(FAT_JAR));
text = text.replace("{java}", Configuration.java);
text = text.replace("{javac}", Configuration.javac);
text = text.replace("{bcvDir}", BCVDir.getAbsolutePath());
text = text.replace("{python}", Configuration.python);
text = text.replace("{python3}", Configuration.python3);
text = text.replace("{rt}", Configuration.rt);
text = text.replace("{lib}", Configuration.library);
text = text.replace("{krakatauVersion}", krakatauVersion);
text = text.replace("{krakatauDir}", krakatauWorkingDirectory);
text = text.replace("{enjarifyVersion}", enjarifyVersion);
text = text.replace("{enjarifyDir}", enjarifyWorkingDirectory);
pane.setText(text);
pane.setCaretPosition(0);
return pane;
}
public static String convertStreamToString(java.io.InputStream is) throws IOException
{
java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
String string = s.hasNext() ? s.next() : "";
is.close();
s.close();
return string;
}
}

View File

@ -8,6 +8,7 @@ import the.bytecode.club.bytecodeviewer.gui.components.SearchableRSyntaxTextArea
import the.bytecode.club.bytecodeviewer.gui.components.SystemConsole; import the.bytecode.club.bytecodeviewer.gui.components.SystemConsole;
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.viewer.ClassViewer; import the.bytecode.club.bytecodeviewer.gui.resourceviewer.viewer.ClassViewer;
import the.bytecode.club.bytecodeviewer.gui.util.PaneUpdaterThread; import the.bytecode.club.bytecodeviewer.gui.util.PaneUpdaterThread;
import the.bytecode.club.bytecodeviewer.translation.TranslatedStrings;
import the.bytecode.club.bytecodeviewer.util.JarUtils; import the.bytecode.club.bytecodeviewer.util.JarUtils;
import javax.swing.*; import javax.swing.*;
@ -77,6 +78,7 @@ public class ResourceViewPanel
SystemConsole errConsole = new SystemConsole("Java Compile Issues"); SystemConsole errConsole = new SystemConsole("Java Compile Issues");
errConsole.setText("Error compiling class: " + viewer.cn.name + errConsole.setText("Error compiling class: " + viewer.cn.name +
nl + "Keep in mind most decompilers cannot produce compilable classes" + nl + "Keep in mind most decompilers cannot produce compilable classes" +
nl + nl + TranslatedStrings.SUGGESTED_FIX_COMPILER_ERROR +
nl + nl); nl + nl);
try try

View File

@ -39,17 +39,17 @@ import java.util.HashSet;
*/ */
public enum Language public enum Language
{ {
ARABIC("/translations/arabic.json", "عربى", "ab"), ARABIC("/translations/arabic.json", "عربى", "English", "ab"),
ENGLISH("/translations/english.json", "English", "en"), ENGLISH("/translations/english.json", "English", "English", "en"),
FRENCH("/translations/french.json", "Français", "fr"), FRENCH("/translations/french.json", "Français", "English", "fr"),
GERMAN("/translations/german.json", "Deutsch", "de"), GERMAN("/translations/german.json", "Deutsch", "German", "de"),
//HINDI("/translations/hindi.json", "हिंदी", "hi"), //HINDI("/translations/hindi.json", "हिंदी", "English", "hi"),
JAPANESE("/translations/japanese.json", "日本語", "ja"), JAPANESE("/translations/japanese.json", "日本語", "English", "ja"),
MALAY("/translations/malay.json", "Bahasa Melayu", "ms"), MALAY("/translations/malay.json", "Bahasa Melayu", "English", "ms"),
MANDARIN("/translations/mandarin.json", "普通话", "zh_cn", "zh"), MANDARIN("/translations/mandarin.json", "普通话", "Mandarin", "zh_cn", "zh"),
PORTUGUESE("/translations/portuguese.json", "Português", "pt"), PORTUGUESE("/translations/portuguese.json", "Português", "English", "pt"),
RUSSIAN("/translations/russian.json", "русский", "ru"), RUSSIAN("/translations/russian.json", "русский", "English", "ru"),
SPANISH("/translations/spanish.json", "Español", "es"), SPANISH("/translations/spanish.json", "Español", "English", "es"),
; ;
private static final HashedMap<String, Language> languageCodeLookup; private static final HashedMap<String, Language> languageCodeLookup;
@ -64,13 +64,15 @@ public enum Language
private final String resourcePath; private final String resourcePath;
private final String readableName; private final String readableName;
private final String htmlIdentifier;
private final HashSet<String> languageCode; private final HashSet<String> languageCode;
Language(String resourcePath, String readableName, String... languageCodes) Language(String resourcePath, String readableName, String htmlIdentifier, String... languageCodes)
{ {
this.resourcePath = resourcePath; this.resourcePath = resourcePath;
this.languageCode = new HashSet<>(Arrays.asList(languageCodes));
this.readableName = readableName; this.readableName = readableName;
this.htmlIdentifier = htmlIdentifier.toLowerCase();
this.languageCode = new HashSet<>(Arrays.asList(languageCodes));
} }
public void loadLanguage() throws IOException public void loadLanguage() throws IOException
@ -92,9 +94,16 @@ public enum Language
//update translation text value //update translation text value
text.value = translationMap.get(text.key); text.value = translationMap.get(text.key);
//translate constant strings
try {
TranslatedStrings str = TranslatedStrings.valueOf(text.key);
str.setText(text.value);
} catch (IllegalArgumentException e) { }
//check if translation key has been assigned to a component, //check if translation key has been assigned to a component,
//on fail print an error alerting the devs //on fail print an error alerting the devs
if(translation.getTranslatedComponent().runOnUpdate.isEmpty()) if(translation.getTranslatedComponent().runOnUpdate.isEmpty()
&& TranslatedStrings.nameSet.contains(translation.name()))
{ {
System.err.println("Translation Reference " + translation.name() + " is missing component attachment, skipping..."); System.err.println("Translation Reference " + translation.name() + " is missing component attachment, skipping...");
continue; continue;
@ -126,7 +135,7 @@ public enum Language
existingKeys.add(t.name()); existingKeys.add(t.name());
for(String key : translationMap.keySet()) for(String key : translationMap.keySet())
if(!existingKeys.contains(key) && !key.startsWith("TODO")) if(!existingKeys.contains(key))
System.err.println(key + ","); System.err.println(key + ",");
} }
@ -145,6 +154,11 @@ public enum Language
return readableName; return readableName;
} }
public String getHTMLPath(String identifier)
{
return "translations/html/" + identifier + "." + htmlIdentifier + ".html";
}
public static HashedMap<String, Language> getLanguageCodeLookup() public static HashedMap<String, Language> getLanguageCodeLookup()
{ {
return languageCodeLookup; return languageCodeLookup;

View File

@ -0,0 +1,60 @@
package the.bytecode.club.bytecodeviewer.translation;
import java.util.HashMap;
import java.util.HashSet;
/**
* Constant-like strings not associated with any specific JComponent
*
* @author Konloch
* @since 7/6/2021
*/
public enum TranslatedStrings
{
JAVA("Java"),
PROCYON("Procyon"),
CFR("CFR"),
FERNFLOWER("FernFlower"),
KRAKATAU("Krakatau"),
JDGUI("JD-GUI"),
JADX("JADX"),
SMALI("Smali"),
SMALI_DEX("Smali/DEX"),
HEXCODE("Hexcode"),
BYTECODE("Bytecode"),
ASM_TEXTIFY("ASM Textify"),
ERROR("Error"),
DISASSEMBLER("Disassembler"),
SUGGESTED_FIX_DECOMPILER_ERROR("Suggested Fix: Click refresh class, if it fails again try another decompiler."),
SUGGESTED_FIX_COMPILER_ERROR("Suggested Fix: Try View>Pane>Krakatau>Bytecode and enable Editable."),
;
public static final HashSet<String> nameSet = new HashSet<>();
static
{
for(TranslatedStrings s : values())
nameSet.add(s.name());
}
private String text;
TranslatedStrings(String text) {this.text = text;}
public void setText(String text)
{
this.text = text;
}
public String getText()
{
return text;
}
@Override
public String toString()
{
return getText();
}
}

View File

@ -114,14 +114,19 @@ public enum Translation
DEX_TO_JAR, DEX_TO_JAR,
ENJARIFY, ENJARIFY,
PROCYON, PROCYON,
CRF, CFR,
FERNFLOWER, FERNFLOWER,
KRAKATAU, KRAKATAU,
JDGUI, JDGUI,
JADX, JADX,
SMALI_DEX, SMALI_DEX,
SMALI,
DISASSEMBLER,
ERROR,
SUGGESTED_FIX_DECOMPILER_ERROR,
SUGGESTED_FIX_COMPILER_ERROR,
PROCYON_DECOMPILER, PROCYON_DECOMPILER,
CRF_DECOMPILER, CFR_DECOMPILER,
FERNFLOWER_DECOMPILER, FERNFLOWER_DECOMPILER,
JADX_DECOMPILER, JADX_DECOMPILER,
JD_DECOMPILER, JD_DECOMPILER,

View File

@ -58,7 +58,7 @@
"SET_JAVAC_EXECUTABLE": "تعيين Javac للتنفيذ", "SET_JAVAC_EXECUTABLE": "تعيين Javac للتنفيذ",
"JAVA": "جافا", "JAVA": "جافا",
"PROCYON": "بروسيون", "PROCYON": "بروسيون",
"CRF": "CFR", "CFR": "CFR",
"FERNFLOWER": "نبات السرخس", "FERNFLOWER": "نبات السرخس",
"KRAKATAU": "كراكاتاو", "KRAKATAU": "كراكاتاو",
"JDGUI": "JD-GUI", "JDGUI": "JD-GUI",
@ -83,7 +83,7 @@
"ALLATORI_STRING_DECRYPTER": "Allatori سلسلة ديكريبتر", "ALLATORI_STRING_DECRYPTER": "Allatori سلسلة ديكريبتر",
"ZSTRINGARRAY_DECRYPTER": "ZStringArray ديكريبتر", "ZSTRINGARRAY_DECRYPTER": "ZStringArray ديكريبتر",
"PROCYON_DECOMPILER": "Procyon Decompiler", "PROCYON_DECOMPILER": "Procyon Decompiler",
"CRF_DECOMPILER": "CFR Decompiler", "CFR_DECOMPILER": "CFR Decompiler",
"FERNFLOWER_DECOMPILER": "FernFlower Decompiler", "FERNFLOWER_DECOMPILER": "FernFlower Decompiler",
"JADX_DECOMPILER": "JADX Decompiler", "JADX_DECOMPILER": "JADX Decompiler",
"JD_DECOMPILER": "JD-GUI Decompiler", "JD_DECOMPILER": "JD-GUI Decompiler",

View File

@ -66,11 +66,12 @@
"JAVA": "Java", "JAVA": "Java",
"PROCYON": "Procyon", "PROCYON": "Procyon",
"CRF": "CFR", "CFR": "CFR",
"FERNFLOWER": "FernFlower", "FERNFLOWER": "FernFlower",
"KRAKATAU": "Krakatau", "KRAKATAU": "Krakatau",
"JDGUI": "JD-GUI", "JDGUI": "JD-GUI",
"JADX": "JADX", "JADX": "JADX",
"SMALI": "Smali",
"SMALI_DEX": "Smali/Dex", "SMALI_DEX": "Smali/Dex",
"HEXCODE": "Hexcode", "HEXCODE": "Hexcode",
"BYTECODE": "Bytecode", "BYTECODE": "Bytecode",
@ -96,11 +97,16 @@
"PROCYON_DECOMPILER": "Procyon Decompiler", "PROCYON_DECOMPILER": "Procyon Decompiler",
"CRF_DECOMPILER": "CFR Decompiler", "CFR_DECOMPILER": "CFR Decompiler",
"FERNFLOWER_DECOMPILER": "FernFlower Decompiler", "FERNFLOWER_DECOMPILER": "FernFlower Decompiler",
"JADX_DECOMPILER": "JADX Decompiler", "JADX_DECOMPILER": "JADX Decompiler",
"JD_DECOMPILER": "JD-GUI Decompiler", "JD_DECOMPILER": "JD-GUI Decompiler",
"BYTECODE_DISASSEMBLER": "Bytecode Disassembler", "BYTECODE_DISASSEMBLER": "Bytecode Disassembler",
"DISASSEMBLER": "Disassembler",
"ERROR": "Error",
"SUGGESTED_FIX_DECOMPILER_ERROR": "Suggested Fix: Click refresh class, if it fails again try another decompiler.",
"SUGGESTED_FIX_COMPILER_ERROR": "Suggested Fix: Try View>Pane>Krakatau>Bytecode and enable Editable.",
"FILES": "Files", "FILES": "Files",
"QUICK_FILE_SEARCH_NO_FILE_EXTENSION": "Quick file search (no file extension)", "QUICK_FILE_SEARCH_NO_FILE_EXTENSION": "Quick file search (no file extension)",

View File

@ -58,7 +58,7 @@
"SET_JAVAC_EXECUTABLE": "Définir l'exécutable Javac", "SET_JAVAC_EXECUTABLE": "Définir l'exécutable Javac",
"JAVA": "Java", "JAVA": "Java",
"PROCYON": "Procyon", "PROCYON": "Procyon",
"CRF": "CFR", "CFR": "CFR",
"FERNFLOWER": "FougèreFleur", "FERNFLOWER": "FougèreFleur",
"KRAKATAU": "Krakatau", "KRAKATAU": "Krakatau",
"JDGUI": "JD-GUI", "JDGUI": "JD-GUI",
@ -83,7 +83,7 @@
"ALLATORI_STRING_DECRYPTER": "Décrypteur de chaînes Allatori", "ALLATORI_STRING_DECRYPTER": "Décrypteur de chaînes Allatori",
"ZSTRINGARRAY_DECRYPTER": "Décrypteur ZStringArray", "ZSTRINGARRAY_DECRYPTER": "Décrypteur ZStringArray",
"PROCYON_DECOMPILER": "Décompilateur Procyon", "PROCYON_DECOMPILER": "Décompilateur Procyon",
"CRF_DECOMPILER": "Décompilateur CFR", "CFR_DECOMPILER": "Décompilateur CFR",
"FERNFLOWER_DECOMPILER": "Décompilateur FernFlower", "FERNFLOWER_DECOMPILER": "Décompilateur FernFlower",
"JADX_DECOMPILER": "Décompilateur JADX", "JADX_DECOMPILER": "Décompilateur JADX",
"JD_DECOMPILER": "Décompilateur JD-GUI", "JD_DECOMPILER": "Décompilateur JD-GUI",

View File

@ -86,7 +86,7 @@
"TODO5": "Diese existieren nur als Key/Value-Paare", "TODO5": "Diese existieren nur als Key/Value-Paare",
"PROCYON_DECOMPILER": "Procyon-Dekompilierer", "PROCYON_DECOMPILER": "Procyon-Dekompilierer",
"CRF_DECOMPILER": "CFR-Dekompilierer", "CFR_DECOMPILER": "CFR-Dekompilierer",
"FERNFLOWER_DECOMPILER": "FernFlower-Dekompilierer", "FERNFLOWER_DECOMPILER": "FernFlower-Dekompilierer",
"JADX_DECOMPILER": "JADX-Dekompilierer", "JADX_DECOMPILER": "JADX-Dekompilierer",
"JD_DECOMPILER": "JD-GUI-Dekompilierer", "JD_DECOMPILER": "JD-GUI-Dekompilierer",

View File

@ -58,7 +58,7 @@
"SET_JAVAC_EXECUTABLE": "जावैक निष्पादन योग्य सेट करें", "SET_JAVAC_EXECUTABLE": "जावैक निष्पादन योग्य सेट करें",
"JAVA": "जावा", "JAVA": "जावा",
"PROCYON": "प्रोसिओन", "PROCYON": "प्रोसिओन",
"CRF": "सीएफआर", "CFR": "सीएफआर",
"FERNFLOWER": "फर्नफ्लावर", "FERNFLOWER": "फर्नफ्लावर",
"KRAKATAU": "Krakatau", "KRAKATAU": "Krakatau",
"JDGUI": "जद-जीयूआई", "JDGUI": "जद-जीयूआई",
@ -83,7 +83,7 @@
"ALLATORI_STRING_DECRYPTER": "एलाटोरी स्ट्रिंग डिक्रिप्टर", "ALLATORI_STRING_DECRYPTER": "एलाटोरी स्ट्रिंग डिक्रिप्टर",
"ZSTRINGARRAY_DECRYPTER": "ZStringArray डिक्रिप्टर", "ZSTRINGARRAY_DECRYPTER": "ZStringArray डिक्रिप्टर",
"PROCYON_DECOMPILER": "प्रोसीओन डीकंपाइलर", "PROCYON_DECOMPILER": "प्रोसीओन डीकंपाइलर",
"CRF_DECOMPILER": "सीएफआर डीकंपाइलर", "CFR_DECOMPILER": "सीएफआर डीकंपाइलर",
"FERNFLOWER_DECOMPILER": "फर्नाफ्लावर डीकंपेलर", "FERNFLOWER_DECOMPILER": "फर्नाफ्लावर डीकंपेलर",
"JADX_DECOMPILER": "JADX डीकंपेलर", "JADX_DECOMPILER": "JADX डीकंपेलर",
"JD_DECOMPILER": "जद-जीयूआई डीकंपेलर", "JD_DECOMPILER": "जद-जीयूआई डीकंपेलर",

View File

@ -1,9 +1,29 @@
<html>Bytecode Viewer (BCV) was designed to be extremely user and beginner friendly, because of this almost everything <html>
is accessible through an interface, settings, tools, etc. This means if you give BCV a try you should get the gist of it <h2>About</h2>
can do, however for those who don't want to run BCV until they're convinced they should use it, below is a complete list
of features BCV has, and what they do.
<h2>Command Line Interface (CLI):</h2> Bytecode Viewer (BCV) was designed to be extremely user and beginner friendly, because of this almost everything
is accessible through an interface, settings, tools, etc.
<br><br>To start drag your Jar/APK/Class file into the resource list.
<h2>Settings</h2>
<ul>
<li>Preview Copy: {previewCopy}</li>
<li>Fat Jar: {farJar}</li>
<li>Java: {java}</li>
<li>Javac: {javac}</li>
<li>BCV Dir: {bcvDir}</li>
<li>Python 2.7 (or PyPy): {python}</li>
<li>Python 3.X (or PyPy): {python3}</li>
<li>RT.jar: {rt}</li>
<li>Optional Lib: {lib}</li>
<li>BCV Krakatau: v{krakatauVersion}</li>
<li>Krakatau Dir: {krakatauDir}</li>
<li>BCV Enjarify: v{enjarifyVersion}</li>
<li>Enjarify Dir: {enjarifyDir}</li>
</ul>
<h2>Command Line Interface (CLI)</h2>
<ul> <ul>
<li> -help Displays the help menu</li> <li> -help Displays the help menu</li>
<li> -list Displays the available decompilers</li> <li> -list Displays the available decompilers</li>
@ -14,7 +34,7 @@ of features BCV has, and what they do.
<li> -nowait Doesn't wait for the user to read the CLI messages</li> <li> -nowait Doesn't wait for the user to read the CLI messages</li>
</ul> </ul>
<h2>File:</h2> <h2>File</h2>
<ul> <ul>
<li>Add (Ctrl + O) - If you add a jar/zip BCV will unzip it, if you add an APK or DEX file, BCV will run dex2jar <li>Add (Ctrl + O) - If you add a jar/zip BCV will unzip it, if you add an APK or DEX file, BCV will run dex2jar
then run the jar input process. then run the jar input process.
@ -37,7 +57,7 @@ of features BCV has, and what they do.
<li>Exit - Closes BCV.</li> <li>Exit - Closes BCV.</li>
</ul> </ul>
<h2>View Panes:</h2> <h2>View Panes</h2>
<ul> <ul>
<li>Editable - Defines if that viewing pane will be editable.</li> <li>Editable - Defines if that viewing pane will be editable.</li>
<li>None - Nothing will be displayed.</li> <li>None - Nothing will be displayed.</li>
@ -52,7 +72,7 @@ of features BCV has, and what they do.
<li>Hexcode - Shows the classfile in a hex viewer. Not Editable.</li> <li>Hexcode - Shows the classfile in a hex viewer. Not Editable.</li>
</ul> </ul>
<h2>Settings:</h2> <h2>Settings</h2>
<ul> <ul>
<li>Compile On Save - If selected whenever you do one of the File>Save * functions it will try to compile before it <li>Compile On Save - If selected whenever you do one of the File>Save * functions it will try to compile before it
saves. saves.
@ -74,7 +94,7 @@ of features BCV has, and what they do.
<li>Set JRE RT Library - Set the JRE RT library for Krakatau decompiler.</li> <li>Set JRE RT Library - Set the JRE RT library for Krakatau decompiler.</li>
</ul> </ul>
<h2>Plugins:</h2> <h2>Plugins</h2>
<ul> <ul>
<li>Open Plugin - Open a .java plugin created for BCV.</li> <li>Open Plugin - Open a .java plugin created for BCV.</li>
<li>Recent Plugins - Last 25 plugins you've opened with BCV.</li> <li>Recent Plugins - Last 25 plugins you've opened with BCV.</li>
@ -82,20 +102,36 @@ of features BCV has, and what they do.
<li>Malicious Code Scanner - Allows you to define what to search for, and outputs what it found.</li> <li>Malicious Code Scanner - Allows you to define what to search for, and outputs what it found.</li>
<li>Show Main Methods - Detects and outputs all of the public static void main(String[]) functions.</li> <li>Show Main Methods - Detects and outputs all of the public static void main(String[]) functions.</li>
<li>Show All Strings - Grabs then outputs all of the strings in every classfile.</li> <li>Show All Strings - Grabs then outputs all of the strings in every classfile.</li>
<li>Replace Strings - Allows you to do a simple permanent .replace on the classfile strings, very useful for URL <li>Replace Strings - Allows you to do a simple permanent .replace on the classfile strings, very useful for URL swapping.</li>
swapping.
</li>
<li>Allatori String Decrypter - Decrypts the Allatori obfuscated/encrypted strings.</li> <li>Allatori String Decrypter - Decrypts the Allatori obfuscated/encrypted strings.</li>
<li>ZKM String Decrypter - Decrypts the ZKM obfuscated/encrypted strings.</li> <li>ZKM String Decrypter - Decrypts the ZKM obfuscated/encrypted strings.</li>
<li>ZStringArray String Decrypter - Decrypts the ZStringArray obfuscated/encrypted strings.</li> <li>ZStringArray String Decrypter - Decrypts the ZStringArray obfuscated/encrypted strings.</li>
</ul> </ul>
<h2>Notes:</h2> <h2>Code from various projects has been used, including but not limited to</h2>
<ul>
<li>J-RET by WaterWolf</li>
<li>JHexPane by Sam Koivu</li>
<li>RSynaxPane by Robert Futrell</li>
<li>Commons IO by Apache</li>
<li>ASM by OW2</li>
<li>FernFlower by Stiver</li>
<li>Procyon by Mstrobel</li>
<li>CFR by Lee Benfield</li>
<li>CFIDE by Bibl</li>
<li>Smali by JesusFreke</li>
<li>Dex2Jar by pxb1988</li>
<li>Krakatau by Storyyeller</li>
<li>JD-GUI + JD-Core by The Java-Decompiler Team</li>
<li>Enjarify by Storyyeller</li>
</ul>
<h2>Notes</h2>
<ul> <ul>
<li>If BCV fails to boot simply append -clean as an argument to clean the lib directory.</li> <li>If BCV fails to boot simply append -clean as an argument to clean the lib directory.</li>
<li>Relax and take notes, while I take tokes of the marijuana smoke.</li> <li>Relax and take notes, while I take tokes of the marijuana smoke.</li>
<li>BCV was created out of love for Java Reverse engineering.</li> <li>BCV was created out of love for Java Reverse engineering.</li>
<li>Bytecode Viewer's Homepage is <a href="http://bytecodeviewer.com">http://bytecodeviewer.com</a></li> <li>Bytecode Viewer's Homepage is <a href="https://bytecodeviewer.com">https://bytecodeviewer.com</a></li>
</ul> </ul>
</html> </html>

View File

@ -0,0 +1,137 @@
<html>
<h2>Über uns</h2>
Der Bytecode Viewer (BCV) wurde so konzipiert, dass er extrem benutzer- und einsteigerfreundlich ist, deshalb ist fast alles
ist über eine Schnittstelle zugänglich, Einstellungen, Werkzeuge, etc.
<br><br>Zum Starten ziehen Sie Ihre Jar/APK/Class-Datei in die Ressourcenliste.
<h2>Einstellungen</h2>
<ul>
<li>Preview Copy: {previewCopy}</li>
<li>Fat Jar: {farJar}</li>
<li>Java: {java}</li>
<li>Javac: {javac}</li>
<li>BCV Dir: {bcvDir}</li>
<li>Python 2.7 (oder PyPy): {python}</li>
<li>Python 3.X (oder PyPy): {python3}</li>
<li>RT.jar: {rt}</li>
<li>Optional Lib: {lib}</li>
<li>BCV Krakatau: v{krakatauVersion}</li>
<li>Krakatau Dir: {krakatauDir}</li>
<li>BCV Enjarify: v{enjarifyVersion}</li>
<li>Enjarify Dir: {enjarifyDir}</li>
</ul>
<h2>Befehlszeilenschnittstelle (CLI)</h2>
<ul>
<li> -help Zeigt das Hilfemenü an</li>
<li> -list Zeigt die verfügbaren Dekompilierer an</li>
<li> -decompiler [decompiler] Wählt den Decompiler aus, standardmäßig procyon</li>
<li> -i [input file] Wählt die Eingabedatei aus (Jar, Class, APK, ZIP, DEX funktionieren alle automatisch)</li>
<li> -o [Ausgabedatei] Wählt die Ausgabedatei aus (Java oder Java-Bytecode)</li>
<li> -t [target classname] Muss entweder der voll qualifizierte Klassenname sein oder "all", um alle als zip zu dekompilieren</li>
<li> -nowait Wartet nicht auf den Benutzer, um die CLI-Meldungen zu lesen</li>
</ul>
<h2>Datei</h2>
<ul>
<li>Hinzufügen (Strg + O) - Wenn Sie ein jar/zip hinzufügen, wird BCV es entpacken, wenn Sie eine APK- oder DEX-Datei hinzufügen, wird BCV dex2jar
und führt dann den Jar-Eingabeprozess aus.
</li>
<li>Neue Datei öffnen (Strg + L) - Öffnet die zuletzt geöffnete Datei erneut.</li>
<li>Neuer Arbeitsbereich (Strg + N) - Es löscht die geöffneten Jars/Ressourcen.</li>
<li>Ausführen (Strg + R) - Führt die Klassendateien, die Sie in BCV geladen haben, in einer sicheren, sandboxed JVM-Instanz aus, die Sie
vollständig debuggen können.
</li>
<li>Kompilieren (Strg + T) - Versucht, alle bearbeitbaren Bereiche, die Sie ausgewählt haben, zu kompilieren, wenn es sich um Java handelt, wird es mit
Ranino. Krakatau und *Smali verwenden ihre eigenen Assembler.
</li>
<li>Save As Jar - Exportiert die Klassendateien und geladenen Ressourcen als lauffähige Jar-Datei.</li>
<li>Speichern als DEX - Führen Sie jar2dex aus und exportieren Sie die Klassendateien als DEX.</li>
<li>Dateien speichern unter - Speichert alle Klassendateien und Ressourcen als Zip-Datei.</li>
<li>Java-Datei speichern unter - Speichert die aktuell geöffnete dekompilierte Klassendatei.</li>
<li>Java-Dateien speichern unter - Alle dekompilierten Klassendateien als Zip-Datei speichern.</li>
<li>Aktuelle Dateien - Die letzten 25 Dateien/Verzeichnisse, die Sie mit BCV geöffnet haben.</li>
<li>About - Ein kleines Informationsfenster über BCV.</li>
<li>Beenden - Schließt BCV.</li>
</ul>
<h2>Ansichtsfenster</h2>
<ul>
<li>Bearbeitbar - Legt fest, ob dieses Ansichtsfenster bearbeitet werden kann.</li>
<li>Keine - Es wird nichts angezeigt.</li>
<li>Procyon - Dekompiliert mit Procyon Decompiler.</li>
<li>CFR - Dekompiliert mit dem CFR-Decompiler.</li>
<li>FernFlower - Dekompiliert mit dem FernFlower-Decompiler.</li>
<li>JD-GUI - Dekompiliert mit dem JD-GUI-Decompiler.</li>
<li>Krakatau Java - Dekompiliert mit dem Krakatau Decompiler.</li>
<li>Krakatau Bytecode - Disassembliert mit Krakatau Disassembler.</li>
<li>Smali - Disassembliert mit Smali.</li>
<li>Bytecode - Dekompiliert den Bytecode mit CFIDE. Nicht editierbar.</li>
<li>Hexcode - Zeigt die Klassendatei in einem Hex-Viewer an. Nicht editierbar.</li>
</ul>
<h2>Einstellungen</h2>
<ul>
<li>Kompilieren beim Speichern - Wenn diese Option ausgewählt ist, wird jedes Mal, wenn Sie eine der Funktionen Datei>Speichern * ausführen, versucht, die Datei zu kompilieren, bevor sie
speichert.
</li>
<li>Beim Aktualisieren kompilieren - Wenn diese Option ausgewählt ist, wird bei jedem Aktualisieren kompiliert, bevor die Ressource/Klasse neu geladen wird.
</li>
<li>Aktualisierungsprüfung - Wenn ausgewählt, wird https://github.com/Konloch/bytecode-viewer abgefragt, um sicherzustellen, dass Sie die neueste Version haben.
Version haben.
</li>
<li>Auffrischen bei Ansichtsänderung - Wenn diese Option ausgewählt ist, werden bei jeder Änderung einer Option in den Ansichtsfenstern die
aktuell geöffneten Ressourcen/Klasse aktualisiert.
</li>
<li>APK-Ressourcen dekodieren - Wenn diese Option ausgewählt ist, wird beim Hinzufügen einer APK zuerst APKTool.jar ausgeführt, um die Ressourcen zu dekodieren.
Ressourcen zu dekodieren.
</li>
<li>Set Python 2.7 Executable - Setzen Sie das Python 2.7 Executable, wenn Sie möchten, dass Krakatau Decompiler/Disassembler/Assembler
funktionieren soll.
</li>
<li>Set JRE RT Library - Stellen Sie die JRE RT Library für Krakatau Decompiler ein.</li>
</ul>
<h2>Plugins</h2>
<ul>
<li>Plugin öffnen - Öffnen Sie ein für BCV erstelltes .java-Plugin.</li>
<li>Recent Plugins - Die letzten 25 Plugins, die Sie mit BCV geöffnet haben.</li>
<li>Codefolgediagramm - Erstellt ein grobes Codefolgediagramm für die aktuell geöffnete Klassendatei.</li>
<li>Scanner für bösartigen Code - Ermöglicht es Ihnen, zu definieren, wonach gesucht werden soll, und gibt aus, was gefunden wurde.</li>
<li>Hauptmethoden anzeigen - Erkennt und gibt alle öffentlichen statischen void main(String[]) Funktionen aus.</li>
<li>Alle Zeichenketten anzeigen - Erkennt alle Zeichenketten in jeder Klassendatei und gibt sie aus.</li>
<li>Strings ersetzen - Ermöglicht ein einfaches, permanentes Ersetzen der Strings in der Klassendatei, sehr nützlich für URL-Swapping.</li>
<li>Allatori String Decrypter - Entschlüsselt die mit Allatori verdeckten/verschlüsselten Strings.</li>
<li>ZKM String Decrypter - Entschlüsselt die ZKM-verschleierten/verschlüsselten Strings.</li>
<li>ZStringArray String Decrypter - Entschlüsselt die ZStringArray-verschleierten/verschlüsselten Strings.</li>
</ul>
<h2>Es wurde Code aus verschiedenen Projekten verwendet, einschließlich, aber nicht beschränkt auf</h2>
<ul>
<li>J-RET von WaterWolf</li>
<li>JHexPane von Sam Koivu</li>
<li>RSynaxPane von Robert Futrell</li>
<li>Commons IO von Apache</li>
<li>ASM von OW2</li>
<li>FernFlower von Stiver</li>
<li>Procyon von Mstrobel</li>
<li>CFR von Lee Benfield</li>
<li>CFIDE von Bibl</li>
<li>Smali von JesusFreke</li>
<li>Dex2Jar von pxb1988</li>
<li>Krakatau von Storyyeller</li>
<li>JD-GUI + JD-Core von The Java-Decompiler Team</li>
<li>Enjarify von Storyyeller</li>
</ul>
<h2>Hinweise</h2>
<ul>
<li>Wenn BCV nicht bootet, fügen Sie einfach -clean als Argument an, um das lib-Verzeichnis zu bereinigen.</li>
<li>Ruhen Sie sich aus und machen Sie sich Notizen, während ich einen Schluck Marihuanarauch nehme.</li>
<li>BCV wurde aus Liebe zum Java Reverse Engineering entwickelt.</li>
<li>Die Homepage von Bytecode Viewer ist <a href="https://bytecodeviewer.com">https://bytecodeviewer.com</a></li>
</ul>
</html>

View File

@ -0,0 +1,135 @@
<html>
<h2>关于 </h2>
Bytecode Viewer (BCV)被设计成对用户和初学者非常友好,因此,几乎所有的东西都可以通过一个界面访问。
都可以通过一个界面、设置、工具等进行访问。
<br><br>开始时将你的Jar/APK/Class文件拖到资源列表中。
<h2>设置</h2>
<ul>
<li>预览副本。{previewCopy}</li>
<li>Fat Jar。{farJar}</li>
<li>Java。{java}</li>
<li>Javac: {javac}</li>
<li>BCV Dir: {bcvDir}</li>
<li>Python 2.7 (或 PyPy): {python}</li>
<li>Python 3.X (or PyPy): {python3}</li>
<li>RT.jar。{rt}</li>
<li>可选的 Lib。{lib}</li>
<li>BCV Krakatau: v{krakatauVersion}</li>
<li>Krakatau Dir: {krakatauDir}</li>
<li>BCV Enjarify: v{enjarifyVersion}</li>
<li>Enjarify Dir: {enjarifyDir}</li>
</ul>
<h2>命令行界面CLI</h2>
<ul>
<li> -help 显示帮助菜单</li>
<li> -list 显示可用的反编译器</li>
<li> -decompiler [decompiler] 选择反编译器默认为procyon</li>
<li> -i [输入文件] 选择输入文件Jar、Class、APK、ZIP、DEX都能自动工作</li>
<li> -o [输出文件] 选择输出文件Java或Java-Bytecode</li>
<li> -t [目标类名] 必须是完全合格的类名,或者是 "全部"以便将所有的文件反编译为zip</li>
<li> -nowait 不等待用户阅读CLI信息</li>
</ul>
<h2>文件</h2>
<ul>
<li>添加 (Ctrl + O) - 如果你添加一个jar/zipBCV将解压它如果你添加一个APK或DEX文件BCV将运行dex2jar
然后运行jar的输入过程。
</li>
<li>重新打开最近的文件Ctrl + L--重新打开你最近打开的文件。
<li>新工作区Ctrl + N--它清除了已打开的 jars/资源。
<li>运行Ctrl + R--在一个安全的沙盒JVM实例中运行你已加载到BCV的类文件你可以
完全调试。
</li>
<li>编译 (Ctrl + T) - 尝试编译你选择的所有可编辑面板如果是Java它将用
拉尼诺。Krakatau和*Smali使用他们自己的汇编程序。
</li>
<li>Save As Jar - 将类文件和加载的资源导出为一个可运行的 Jar 文件。
<li>Save As DEX - 运行 jar2dex 并将类文件导出为 DEX。
<li>Save Files As - 将所有的 Classfiles 和资源保存为一个 zip 文件。
<li>Save Java File As - 保存当前打开的反编译Classfile。
<li>Save Java Files As - 将所有反编译的Classsfiles保存为一个zip文件。
<li>最近的文件 - 你用BCV打开的最后25个文件/目录。
<li>About - 关于BCV的一个小信息窗口。
<li>退出 - 关闭BCV.</li>
</ul>
<h2>查看面板</h2>
<ul>
<li>Editable - 定义该观察窗格是否可编辑。</li>
<li>None - 将不显示任何东西。</li>
<li>Procyon - 使用Procyon反编译器进行反编译。</li>
<li>CFR - 用CFR反编译器反编译。</li>
<li>FernFlower - 使用FernFlower反编译器进行反编译。</li>
<li>JD-GUI - 使用JD-GUI反编译器进行反编译.</li>
<li>Krakatau Java - 使用Krakatau反编译器进行反编译。</li>
<li>Krakatau Bytecode - 用Krakatau反汇编器进行反汇编。</li>
<li>Smali - 使用Smali进行反汇编。</li>
<li>Bytecode - 通过CFIDE对字节码进行反编译。不可编辑。</li>
<li>Hexcode - 在一个十六进制浏览器中显示类文件。不可编辑。</li>
</ul>
<h2>设置</h2>
<ul>
<li>保存时编译 - 如果选择了这个选项,每当你执行文件>保存*功能时,它将在保存前尝试编译。
保存。
</li>
<li>刷新时编译 - 如果选择了这个选项,每当你按下刷新键,它将在重新加载资源/类之前进行编译。</li>
<li>更新检查 - 如果选择了这个选项,它会查询 https://github.com/Konloch/bytecode-viewer 以确保你得到最新的
版本。
</li>
<li>在视图改变时刷新 - 如果选择了这个选项,每当你在视图面板中改变一个选项时,它将刷新当前打开的资源/类。
当前打开的资源/类。
</li>
<li>解码APK资源 - 如果选择了这个选项当你添加一个APK时它将首先运行APKTool.jar来解码资源。
资源。
</li>
<li>设置Python 2.7可执行文件 - 如果你希望Krakatau反编译器/反汇编器/反汇编器工作请设置Python 2.7可执行文件。
工作。
</li>
<li>Set JRE RT Library - 为Krakatau反编译器设置JRE RT库。
</ul>
<h2>插件</h2>
<ul>
<li>打开插件 - 打开一个为BCV创建的.java插件。</li>
<li>最近的插件 - 你用BCV打开的最后25个插件。</li>
<li>代码序列图 - 为当前打开的类文件建立一个粗糙的代码序列图。</li>
<li>恶意代码扫描器 - 允许你定义要搜索的内容,并输出它所发现的内容。</li>
<li>显示主要方法 - 检测并输出所有的公共静态void main(String[])函数。</li>
<li>显示所有字符串 - 抓取并输出每个类文件中的所有字符串。</li>
<li>替换字符串 - 允许你对classfile中的字符串做一个简单的永久.替换对于URL交换非常有用。</li>
<li>Allatori字符串解密器 - 解密Allatori混淆/加密的字符串。</li>
<li>ZKM字符串解密器 - 解密ZKM混淆/加密的字符串。</li>
<li>ZStringArray字符串解密器--解密被混淆/加密的ZStringArray字符串。</li>
</ul>
<h2>使用了不同项目的代码,包括但不限于</h2>
<ul>
<li>WaterWolf的J-RET</li>
<li>Sam Koivu的JHexPane</li>
<li>Robert Futrell的RSynaxPane</li>
<li>Commons IO by Apache</li>
<li>ASM by OW2</li>
<li>FernFlower by Stiver</li>
<li>Procyon作者Mstrobel</li>
<li>CFR by Lee Benfield</li>
<li>CFIDE by Bibl</li>
<li>Smali by JesusFreke</li>
<li>Dex2Jar by pxb1988</li>
<li>Krakatau by Storyyeller</li>
<li>JD-GUI + JD-Core by The Java-Decompiler Team</li>
<li>Enjarify by Storyyeller</li>
</ul>
<h2>注意事项</h2>
<ul>
<li>如果 BCV 无法启动,只需添加 -clean 作为参数来清理 lib 目录。
<li>在我吸食大麻烟的时候,请放松并做笔记。
<li>BCV 是出于对 Java 反向工程的热爱而创建的。
<li>Bytecode Viewer的主页是<a href="https://bytecodeviewer.com">https://bytecodeviewer.com</a> </li>
</ul>
</html>

View File

@ -58,7 +58,7 @@
"SET_JAVAC_EXECUTABLE": "Javac実行可能ファイルを設定する", "SET_JAVAC_EXECUTABLE": "Javac実行可能ファイルを設定する",
"JAVA": "Java", "JAVA": "Java",
"PROCYON": "プロキオン", "PROCYON": "プロキオン",
"CRF": "CFR", "CFR": "CFR",
"FERNFLOWER": "FernFlower", "FERNFLOWER": "FernFlower",
"KRAKATAU": "クラカタウ", "KRAKATAU": "クラカタウ",
"JDGUI": "JD-GUI", "JDGUI": "JD-GUI",
@ -83,7 +83,7 @@
"ALLATORI_STRING_DECRYPTER": "Allatori String Decrypter", "ALLATORI_STRING_DECRYPTER": "Allatori String Decrypter",
"ZSTRINGARRAY_DECRYPTER": "ZStringArray Decrypter", "ZSTRINGARRAY_DECRYPTER": "ZStringArray Decrypter",
"PROCYON_DECOMPILER": "プロキオン逆コンパイラ", "PROCYON_DECOMPILER": "プロキオン逆コンパイラ",
"CRF_DECOMPILER": "CFRデコンパイラー", "CFR_DECOMPILER": "CFRデコンパイラー",
"FERNFLOWER_DECOMPILER": "FernFlowerデコンパイラー", "FERNFLOWER_DECOMPILER": "FernFlowerデコンパイラー",
"JADX_DECOMPILER": "JADXデコンパイラー", "JADX_DECOMPILER": "JADXデコンパイラー",
"JD_DECOMPILER": "JD-GUIデコンパイラ", "JD_DECOMPILER": "JD-GUIデコンパイラ",

View File

@ -58,7 +58,7 @@
"SET_JAVAC_EXECUTABLE": "Tetapkan Javac Boleh Dilaksanakan", "SET_JAVAC_EXECUTABLE": "Tetapkan Javac Boleh Dilaksanakan",
"JAVA": "Jawa", "JAVA": "Jawa",
"PROCYON": "Procyon", "PROCYON": "Procyon",
"CRF": "CFR", "CFR": "CFR",
"FERNFLOWER": "FernFlower", "FERNFLOWER": "FernFlower",
"KRAKATAU": "Krakatau", "KRAKATAU": "Krakatau",
"JDGUI": "JD-GUI", "JDGUI": "JD-GUI",
@ -83,7 +83,7 @@
"ALLATORI_STRING_DECRYPTER": "Allatori String Decrypter", "ALLATORI_STRING_DECRYPTER": "Allatori String Decrypter",
"ZSTRINGARRAY_DECRYPTER": "ZStringArray Decrypter", "ZSTRINGARRAY_DECRYPTER": "ZStringArray Decrypter",
"PROCYON_DECOMPILER": "Procyon Decompiler", "PROCYON_DECOMPILER": "Procyon Decompiler",
"CRF_DECOMPILER": "Pengurai CFR", "CFR_DECOMPILER": "Pengurai CFR",
"FERNFLOWER_DECOMPILER": "Pengurai FernFlower", "FERNFLOWER_DECOMPILER": "Pengurai FernFlower",
"JADX_DECOMPILER": "Pengurai JADX", "JADX_DECOMPILER": "Pengurai JADX",
"JD_DECOMPILER": "Pengurai JD-GUI", "JD_DECOMPILER": "Pengurai JD-GUI",

View File

@ -68,7 +68,7 @@
"TODO3": "These only exist as key/value map pairs", "TODO3": "These only exist as key/value map pairs",
"JAVA": "Java", "JAVA": "Java",
"PROCYON": "Procyon", "PROCYON": "Procyon",
"CRF": "CFR", "CFR": "CFR",
"FERNFLOWER": "FernFlower", "FERNFLOWER": "FernFlower",
"KRAKATAU": "Krakatau", "KRAKATAU": "Krakatau",
"JDGUI": "JD-GUI", "JDGUI": "JD-GUI",
@ -100,7 +100,7 @@
"TODO5": "These only exist as key/value map pairs", "TODO5": "These only exist as key/value map pairs",
"PROCYON_DECOMPILER": "Procyon Decompiler", "PROCYON_DECOMPILER": "Procyon Decompiler",
"CRF_DECOMPILER": "CFR Decompiler", "CFR_DECOMPILER": "CFR Decompiler",
"FERNFLOWER_DECOMPILER": "FernFlower Decompiler", "FERNFLOWER_DECOMPILER": "FernFlower Decompiler",
"JADX_DECOMPILER": "JADX Decompiler", "JADX_DECOMPILER": "JADX Decompiler",
"JD_DECOMPILER": "JD-GUI Decompiler", "JD_DECOMPILER": "JD-GUI Decompiler",

View File

@ -58,7 +58,7 @@
"SET_JAVAC_EXECUTABLE": "Definir executável Javac", "SET_JAVAC_EXECUTABLE": "Definir executável Javac",
"JAVA": "Java", "JAVA": "Java",
"PROCYON": "Procyon", "PROCYON": "Procyon",
"CRF": "CFR", "CFR": "CFR",
"FERNFLOWER": "FernFlower", "FERNFLOWER": "FernFlower",
"KRAKATAU": "Krakatau", "KRAKATAU": "Krakatau",
"JDGUI": "JD-GUI", "JDGUI": "JD-GUI",
@ -83,7 +83,7 @@
"ALLATORI_STRING_DECRYPTER": "Allatori String Decrypter", "ALLATORI_STRING_DECRYPTER": "Allatori String Decrypter",
"ZSTRINGARRAY_DECRYPTER": "ZStringArray Decrypter", "ZSTRINGARRAY_DECRYPTER": "ZStringArray Decrypter",
"PROCYON_DECOMPILER": "Procyon Decompiler", "PROCYON_DECOMPILER": "Procyon Decompiler",
"CRF_DECOMPILER": "CFR Decompiler", "CFR_DECOMPILER": "CFR Decompiler",
"FERNFLOWER_DECOMPILER": "FernFlower Decompiler", "FERNFLOWER_DECOMPILER": "FernFlower Decompiler",
"JADX_DECOMPILER": "JADX Decompiler", "JADX_DECOMPILER": "JADX Decompiler",
"JD_DECOMPILER": "JD-GUI Decompiler", "JD_DECOMPILER": "JD-GUI Decompiler",

View File

@ -58,7 +58,7 @@
"SET_JAVAC_EXECUTABLE": "Установить исполняемый файл Javac", "SET_JAVAC_EXECUTABLE": "Установить исполняемый файл Javac",
"JAVA": "Ява", "JAVA": "Ява",
"PROCYON": "Процион", "PROCYON": "Процион",
"CRF": "CFR", "CFR": "CFR",
"FERNFLOWER": "ПапоротникЦветок", "FERNFLOWER": "ПапоротникЦветок",
"KRAKATAU": "Кракатау", "KRAKATAU": "Кракатау",
"JDGUI": "JD-GUI", "JDGUI": "JD-GUI",
@ -83,7 +83,7 @@
"ALLATORI_STRING_DECRYPTER": "Расшифровщик строк Аллатори", "ALLATORI_STRING_DECRYPTER": "Расшифровщик строк Аллатори",
"ZSTRINGARRAY_DECRYPTER": "Расшифровщик ZStringArray", "ZSTRINGARRAY_DECRYPTER": "Расшифровщик ZStringArray",
"PROCYON_DECOMPILER": "Декомпилятор Procyon", "PROCYON_DECOMPILER": "Декомпилятор Procyon",
"CRF_DECOMPILER": "CFR Декомпилятор", "CFR_DECOMPILER": "CFR Декомпилятор",
"FERNFLOWER_DECOMPILER": "Декомпилятор FernFlower", "FERNFLOWER_DECOMPILER": "Декомпилятор FernFlower",
"JADX_DECOMPILER": "Декомпилятор JADX", "JADX_DECOMPILER": "Декомпилятор JADX",
"JD_DECOMPILER": "Декомпилятор JD-GUI", "JD_DECOMPILER": "Декомпилятор JD-GUI",

View File

@ -58,7 +58,7 @@
"SET_JAVAC_EXECUTABLE": "Establecer ejecutable de Javac", "SET_JAVAC_EXECUTABLE": "Establecer ejecutable de Javac",
"JAVA": "Java", "JAVA": "Java",
"PROCYON": "Procyon", "PROCYON": "Procyon",
"CRF": "CFR", "CFR": "CFR",
"FERNFLOWER": "HelechoFlor", "FERNFLOWER": "HelechoFlor",
"KRAKATAU": "Krakatau", "KRAKATAU": "Krakatau",
"JDGUI": "JD-GUI", "JDGUI": "JD-GUI",
@ -83,7 +83,7 @@
"ALLATORI_STRING_DECRYPTER": "Descifrador de cadenas Allatori", "ALLATORI_STRING_DECRYPTER": "Descifrador de cadenas Allatori",
"ZSTRINGARRAY_DECRYPTER": "Descifrador ZStringArray", "ZSTRINGARRAY_DECRYPTER": "Descifrador ZStringArray",
"PROCYON_DECOMPILER": "Descompilador Procyon", "PROCYON_DECOMPILER": "Descompilador Procyon",
"CRF_DECOMPILER": "Descompilador CFR", "CFR_DECOMPILER": "Descompilador CFR",
"FERNFLOWER_DECOMPILER": "Descompilador FernFlower", "FERNFLOWER_DECOMPILER": "Descompilador FernFlower",
"JADX_DECOMPILER": "Descompilador JADX", "JADX_DECOMPILER": "Descompilador JADX",
"JD_DECOMPILER": "Descompilador JD-GUI", "JD_DECOMPILER": "Descompilador JD-GUI",