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> urlList = new ArrayList<>();
static {
try {
screen = new InitialBootScreen();
} catch (Exception e) {
BytecodeViewer.handleException(e);
}
}
public static void boot(String[] args, boolean CLI) throws Exception {
bootstrap();
ILoader<?> loader = findLoader();
screen = new InitialBootScreen();
if (!CLI)
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.Configuration;
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 *
@ -40,12 +43,12 @@ import the.bytecode.club.bytecodeviewer.Resources;
* @author Bibl (don't ban me pls)
* @created 19 Jul 2015 04:12:21
*/
public class InitialBootScreen extends JFrame {
private static final long serialVersionUID = -1098467609722393444L;
public class InitialBootScreen extends JFrame
{
private final JProgressBar progressBar = new JProgressBar();
public InitialBootScreen() throws IOException {
public InitialBootScreen() throws IOException
{
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
@Override
@ -56,24 +59,14 @@ public class InitialBootScreen extends JFrame {
});
this.setIconImages(Resources.iconList);
int i = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
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());
setSize(getSafeSize());
setTitle("Bytecode Viewer Boot Screen - Starting Up");
GridBagLayout gridBagLayout = new GridBagLayout();
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,
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};
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,
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};
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};
getContentPane().setLayout(gridBagLayout);
JScrollPane scrollPane = new JScrollPane();
@ -84,14 +77,8 @@ public class InitialBootScreen extends JFrame {
gbc_scrollPane.gridx = 0;
gbc_scrollPane.gridy = 0;
getContentPane().add(scrollPane, gbc_scrollPane);
JEditorPane editorPane = new JEditorPane();
editorPane.setEditorKit(new HTMLEditorKit());
editorPane.setText(convertStreamToString(InitialBootScreen.class.getClassLoader().getResourceAsStream("intro"
+ ".html")));
scrollPane.setViewportView(editorPane);
scrollPane.setViewportView(HTMLPane.fromResource(language.getHTMLPath("intro")));
GridBagConstraints gbc_progressBar = new GridBagConstraints();
gbc_progressBar.fill = GridBagConstraints.HORIZONTAL;
@ -100,17 +87,23 @@ public class InitialBootScreen extends JFrame {
getContentPane().add(progressBar, gbc_progressBar);
this.setLocationRelativeTo(null);
}
static String convertStreamToString(java.io.InputStream is) throws IOException {
@SuppressWarnings("resource")
java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
String string = s.hasNext() ? s.next() : "";
is.close();
s.close();
return string;
public static Dimension getSafeSize()
{
int i = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
if (i >= 840)
return new Dimension(600, 800);
else if (i >= 640)
return new Dimension(500, 600);
else if (i >= 440)
return new Dimension(400, 400);
else
return Toolkit.getDefaultToolkit().getScreenSize();
}
public JProgressBar getProgressBar() {
return progressBar;
}
private static final long serialVersionUID = -1098467609722393444L;
}

View File

@ -22,7 +22,7 @@ public class GlobalHotKeys
*/
public static void keyPressed(KeyEvent e)
{
if (System.currentTimeMillis() - Configuration.lastHotKeyExecuted <= (4000))
if (System.currentTimeMillis() - Configuration.lastHotKeyExecuted <= (600))
return;
//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.api.ExceptionUI;
import the.bytecode.club.bytecodeviewer.decompilers.InternalDecompiler;
import the.bytecode.club.bytecodeviewer.translation.TranslatedStrings;
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
import static the.bytecode.club.bytecodeviewer.Constants.*;
import static the.bytecode.club.bytecodeviewer.translation.TranslatedStrings.*;
/***************************************************************************
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
@ -143,8 +145,9 @@ public class CFRDecompiler extends InternalDecompiler
if (file.exists())
return findFile(Objects.requireNonNull(file.listFiles()));
return "CFR error! " + ExceptionUI.SEND_STACKTRACE_TO +
nl + nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler." + nl + nl + exception;
return CFR + " " + ERROR + "! " + ExceptionUI.SEND_STACKTRACE_TO +
nl + nl + TranslatedStrings.SUGGESTED_FIX_DECOMPILER_ERROR +
nl + nl + exception;
}
Random r = new Random();
@ -171,10 +174,10 @@ public class CFRDecompiler extends InternalDecompiler
e.printStackTrace(new PrintWriter(sw));
e.printStackTrace();
String exception =
"Bytecode Viewer Version: " + VERSION + nl + nl + sw;
return "CFR error! " + ExceptionUI.SEND_STACKTRACE_TO +
nl + nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler." +
String exception = "Bytecode Viewer Version: " + VERSION + nl + nl + sw;
return CFR + " " + ERROR + "! " + ExceptionUI.SEND_STACKTRACE_TO +
nl + nl + TranslatedStrings.SUGGESTED_FIX_DECOMPILER_ERROR +
nl + nl + exception;
}
@ -183,7 +186,7 @@ public class CFRDecompiler extends InternalDecompiler
}
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) {

View File

@ -12,9 +12,11 @@ import the.bytecode.club.bytecodeviewer.BytecodeViewer;
import the.bytecode.club.bytecodeviewer.Resources;
import the.bytecode.club.bytecodeviewer.api.ExceptionUI;
import the.bytecode.club.bytecodeviewer.decompilers.InternalDecompiler;
import the.bytecode.club.bytecodeviewer.translation.TranslatedStrings;
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
import static the.bytecode.club.bytecodeviewer.Constants.*;
import static the.bytecode.club.bytecodeviewer.translation.TranslatedStrings.*;
/***************************************************************************
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
@ -130,9 +132,10 @@ public class FernFlowerDecompiler extends InternalDecompiler
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."
+ nl + nl + exception;
return FERNFLOWER + " " + ERROR + "! " + ExceptionUI.SEND_STACKTRACE_TO +
nl + nl + TranslatedStrings.SUGGESTED_FIX_DECOMPILER_ERROR +
nl + nl + exception;
}
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.api.ExceptionUI;
import the.bytecode.club.bytecodeviewer.decompilers.InternalDecompiler;
import the.bytecode.club.bytecodeviewer.translation.TranslatedStrings;
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
import static the.bytecode.club.bytecodeviewer.Constants.*;
import static the.bytecode.club.bytecodeviewer.translation.TranslatedStrings.*;
/***************************************************************************
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
@ -86,9 +88,9 @@ public class JADXDecompiler extends InternalDecompiler
if(exception.isEmpty())
exception = "Decompiled source file not found!";
return "JADX error! " + ExceptionUI.SEND_STACKTRACE_TO
+ nl + nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler."
+ nl + nl + exception;
return JADX + " " + ERROR + "! " + ExceptionUI.SEND_STACKTRACE_TO +
nl + nl + TranslatedStrings.SUGGESTED_FIX_DECOMPILER_ERROR +
nl + nl + exception;
}
Random r = new Random();
@ -116,15 +118,16 @@ public class JADXDecompiler extends InternalDecompiler
e.printStackTrace();
String exception = "Bytecode Viewer Version: " + VERSION + nl + nl + sw;
return "JADX error! " + ExceptionUI.SEND_STACKTRACE_TO +
nl + nl + "Suggested Fix: Click refresh class, " +
"if it fails again try another decompiler." + nl + nl + exception;
return JADX + " " + ERROR + "! " + ExceptionUI.SEND_STACKTRACE_TO +
nl + nl + TranslatedStrings.SUGGESTED_FIX_DECOMPILER_ERROR +
nl + nl + exception;
}
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

View File

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

View File

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

View File

@ -12,11 +12,13 @@ import org.objectweb.asm.tree.ClassNode;
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
import the.bytecode.club.bytecodeviewer.api.ExceptionUI;
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.FileContainer;
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
import static the.bytecode.club.bytecodeviewer.Constants.*;
import static the.bytecode.club.bytecodeviewer.translation.TranslatedStrings.*;
/***************************************************************************
* 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;
}
return "Smali Disassembler error! " + ExceptionUI.SEND_STACKTRACE_TO
+ nl + nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler."
+ nl + nl + exception;
return SMALI + " " + DISASSEMBLER + " " + ERROR + "! " + ExceptionUI.SEND_STACKTRACE_TO +
nl + nl + TranslatedStrings.SUGGESTED_FIX_DECOMPILER_ERROR +
nl + nl + exception;
}
@Override

View File

@ -62,7 +62,6 @@ import static the.bytecode.club.bytecodeviewer.Constants.*;
*/
public class MainViewerGUI extends JFrame
{
public AboutWindow aboutWindow = new AboutWindow();
public boolean isMaximized;
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);
//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 rsy = new JCheckBoxMenuItem("Hide synthetic class members");
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");
//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 excludeNestedTypes = new JCheckBoxMenuItem("Exclude Nested Types");
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");
//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 sugarEnums = new JCheckBoxMenuItem("SugarEnums");
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());
decompileSaveAll.addActionListener(arg0 -> ResourceDecompiling.decompileSaveAll());
decompileSaveOpened.addActionListener(arg0 -> ResourceDecompiling.decompileSaveOpenedOnly());
about.addActionListener(arg0 -> aboutWindow.setVisible(true));
about.addActionListener(arg0 -> new AboutWindow().setVisible(true));
exit.addActionListener(arg0 -> askBeforeExiting());
}
@ -382,8 +381,8 @@ public class MainViewerGUI extends JFrame
settingsMainMenu.add(setOptionalLibrary);
settingsMainMenu.add(setJavac);
settingsMainMenu.add(new JSeparator());
fontSpinner.setPreferredSize(new Dimension(42, 20));
fontSpinner.setSize(new Dimension(42, 20));
fontSpinner.setPreferredSize(new Dimension(60, 24));
fontSpinner.setMinimumSize(new Dimension(60, 24));
fontSpinner.setModel(new SpinnerNumberModel(12, 1, null, 1));
fontSize.add(fontSpinner);

View File

@ -1,13 +1,14 @@
package the.bytecode.club.bytecodeviewer.gui.components;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.*;
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import the.bytecode.club.bootloader.InitialBootScreen;
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
import the.bytecode.club.bytecodeviewer.Configuration;
import the.bytecode.club.bytecodeviewer.Resources;
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
*/
public class AboutWindow extends JFrame
{
JTextArea textArea = new JTextArea();
public AboutWindow()
{
this.setIconImages(Resources.iconList);
setSize(Toolkit.getDefaultToolkit().getScreenSize());
setType(Type.UTILITY);
setSize(InitialBootScreen.getSafeSize());
setTitle("Bytecode Viewer - About - https://bytecodeviewer.com | https://the.bytecode.club");
getContentPane().setLayout(new CardLayout(0, 0));
JScrollPane scrollPane = new JScrollPane();
getContentPane().add(scrollPane, "name_845520934713596");
textArea.setWrapStyleWord(true);
textArea.setEnabled(false);
textArea.setDisabledTextColor(Color.BLACK);
scrollPane.setViewportView(textArea);
this.setResizable(false);
getContentPane().add(scrollPane);
try
{
scrollPane.setViewportView(HTMLPane.fromResource(language.getHTMLPath("intro")));
}
catch (IOException e)
{
e.printStackTrace();
}
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;
}

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

View File

@ -39,17 +39,17 @@ import java.util.HashSet;
*/
public enum Language
{
ARABIC("/translations/arabic.json", "عربى", "ab"),
ENGLISH("/translations/english.json", "English", "en"),
FRENCH("/translations/french.json", "Français", "fr"),
GERMAN("/translations/german.json", "Deutsch", "de"),
//HINDI("/translations/hindi.json", "हिंदी", "hi"),
JAPANESE("/translations/japanese.json", "日本語", "ja"),
MALAY("/translations/malay.json", "Bahasa Melayu", "ms"),
MANDARIN("/translations/mandarin.json", "普通话", "zh_cn", "zh"),
PORTUGUESE("/translations/portuguese.json", "Português", "pt"),
RUSSIAN("/translations/russian.json", "русский", "ru"),
SPANISH("/translations/spanish.json", "Español", "es"),
ARABIC("/translations/arabic.json", "عربى", "English", "ab"),
ENGLISH("/translations/english.json", "English", "English", "en"),
FRENCH("/translations/french.json", "Français", "English", "fr"),
GERMAN("/translations/german.json", "Deutsch", "German", "de"),
//HINDI("/translations/hindi.json", "हिंदी", "English", "hi"),
JAPANESE("/translations/japanese.json", "日本語", "English", "ja"),
MALAY("/translations/malay.json", "Bahasa Melayu", "English", "ms"),
MANDARIN("/translations/mandarin.json", "普通话", "Mandarin", "zh_cn", "zh"),
PORTUGUESE("/translations/portuguese.json", "Português", "English", "pt"),
RUSSIAN("/translations/russian.json", "русский", "English", "ru"),
SPANISH("/translations/spanish.json", "Español", "English", "es"),
;
private static final HashedMap<String, Language> languageCodeLookup;
@ -64,13 +64,15 @@ public enum Language
private final String resourcePath;
private final String readableName;
private final String htmlIdentifier;
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.languageCode = new HashSet<>(Arrays.asList(languageCodes));
this.readableName = readableName;
this.htmlIdentifier = htmlIdentifier.toLowerCase();
this.languageCode = new HashSet<>(Arrays.asList(languageCodes));
}
public void loadLanguage() throws IOException
@ -92,9 +94,16 @@ public enum Language
//update translation text value
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,
//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...");
continue;
@ -126,7 +135,7 @@ public enum Language
existingKeys.add(t.name());
for(String key : translationMap.keySet())
if(!existingKeys.contains(key) && !key.startsWith("TODO"))
if(!existingKeys.contains(key))
System.err.println(key + ",");
}
@ -145,6 +154,11 @@ public enum Language
return readableName;
}
public String getHTMLPath(String identifier)
{
return "translations/html/" + identifier + "." + htmlIdentifier + ".html";
}
public static HashedMap<String, Language> getLanguageCodeLookup()
{
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,
ENJARIFY,
PROCYON,
CRF,
CFR,
FERNFLOWER,
KRAKATAU,
JDGUI,
JADX,
SMALI_DEX,
SMALI,
DISASSEMBLER,
ERROR,
SUGGESTED_FIX_DECOMPILER_ERROR,
SUGGESTED_FIX_COMPILER_ERROR,
PROCYON_DECOMPILER,
CRF_DECOMPILER,
CFR_DECOMPILER,
FERNFLOWER_DECOMPILER,
JADX_DECOMPILER,
JD_DECOMPILER,

View File

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

View File

@ -66,11 +66,12 @@
"JAVA": "Java",
"PROCYON": "Procyon",
"CRF": "CFR",
"CFR": "CFR",
"FERNFLOWER": "FernFlower",
"KRAKATAU": "Krakatau",
"JDGUI": "JD-GUI",
"JADX": "JADX",
"SMALI": "Smali",
"SMALI_DEX": "Smali/Dex",
"HEXCODE": "Hexcode",
"BYTECODE": "Bytecode",
@ -96,11 +97,16 @@
"PROCYON_DECOMPILER": "Procyon Decompiler",
"CRF_DECOMPILER": "CFR Decompiler",
"CFR_DECOMPILER": "CFR Decompiler",
"FERNFLOWER_DECOMPILER": "FernFlower Decompiler",
"JADX_DECOMPILER": "JADX Decompiler",
"JD_DECOMPILER": "JD-GUI Decompiler",
"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",
"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",
"JAVA": "Java",
"PROCYON": "Procyon",
"CRF": "CFR",
"CFR": "CFR",
"FERNFLOWER": "FougèreFleur",
"KRAKATAU": "Krakatau",
"JDGUI": "JD-GUI",
@ -83,7 +83,7 @@
"ALLATORI_STRING_DECRYPTER": "Décrypteur de chaînes Allatori",
"ZSTRINGARRAY_DECRYPTER": "Décrypteur ZStringArray",
"PROCYON_DECOMPILER": "Décompilateur Procyon",
"CRF_DECOMPILER": "Décompilateur CFR",
"CFR_DECOMPILER": "Décompilateur CFR",
"FERNFLOWER_DECOMPILER": "Décompilateur FernFlower",
"JADX_DECOMPILER": "Décompilateur JADX",
"JD_DECOMPILER": "Décompilateur JD-GUI",

View File

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

View File

@ -58,7 +58,7 @@
"SET_JAVAC_EXECUTABLE": "जावैक निष्पादन योग्य सेट करें",
"JAVA": "जावा",
"PROCYON": "प्रोसिओन",
"CRF": "सीएफआर",
"CFR": "सीएफआर",
"FERNFLOWER": "फर्नफ्लावर",
"KRAKATAU": "Krakatau",
"JDGUI": "जद-जीयूआई",
@ -83,7 +83,7 @@
"ALLATORI_STRING_DECRYPTER": "एलाटोरी स्ट्रिंग डिक्रिप्टर",
"ZSTRINGARRAY_DECRYPTER": "ZStringArray डिक्रिप्टर",
"PROCYON_DECOMPILER": "प्रोसीओन डीकंपाइलर",
"CRF_DECOMPILER": "सीएफआर डीकंपाइलर",
"CFR_DECOMPILER": "सीएफआर डीकंपाइलर",
"FERNFLOWER_DECOMPILER": "फर्नाफ्लावर डीकंपेलर",
"JADX_DECOMPILER": "JADX डीकंपेलर",
"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
is accessible through an interface, settings, tools, etc. This means if you give BCV a try you should get the gist of it
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.
<html>
<h2>About</h2>
<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>
<li> -help Displays the help menu</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>
</ul>
<h2>File:</h2>
<h2>File</h2>
<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
then run the jar input process.
@ -37,7 +57,7 @@ of features BCV has, and what they do.
<li>Exit - Closes BCV.</li>
</ul>
<h2>View Panes:</h2>
<h2>View Panes</h2>
<ul>
<li>Editable - Defines if that viewing pane will be editable.</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>
</ul>
<h2>Settings:</h2>
<h2>Settings</h2>
<ul>
<li>Compile On Save - If selected whenever you do one of the File>Save * functions it will try to compile before it
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>
</ul>
<h2>Plugins:</h2>
<h2>Plugins</h2>
<ul>
<li>Open Plugin - Open a .java plugin created for 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>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>Replace Strings - Allows you to do a simple permanent .replace on the classfile strings, very useful for URL
swapping.
</li>
<li>Replace Strings - Allows you to do a simple permanent .replace on the classfile strings, very useful for URL swapping.</li>
<li>Allatori String Decrypter - Decrypts the Allatori 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>
</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>
<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>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>
</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実行可能ファイルを設定する",
"JAVA": "Java",
"PROCYON": "プロキオン",
"CRF": "CFR",
"CFR": "CFR",
"FERNFLOWER": "FernFlower",
"KRAKATAU": "クラカタウ",
"JDGUI": "JD-GUI",
@ -83,7 +83,7 @@
"ALLATORI_STRING_DECRYPTER": "Allatori String Decrypter",
"ZSTRINGARRAY_DECRYPTER": "ZStringArray Decrypter",
"PROCYON_DECOMPILER": "プロキオン逆コンパイラ",
"CRF_DECOMPILER": "CFRデコンパイラー",
"CFR_DECOMPILER": "CFRデコンパイラー",
"FERNFLOWER_DECOMPILER": "FernFlowerデコンパイラー",
"JADX_DECOMPILER": "JADXデコンパイラー",
"JD_DECOMPILER": "JD-GUIデコンパイラ",

View File

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

View File

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

View File

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

View File

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

View File

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