Constants Class Added & General Cleanups
Cleaned up the main BytecodeViewer class some and moved a few of the constants into their own class
This commit is contained in:
parent
fc421bcca2
commit
01b7a67cb2
37 changed files with 1312 additions and 1214 deletions
2
pom.xml
2
pom.xml
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
<groupId>club.bytecode.the</groupId>
|
<groupId>club.bytecode.the</groupId>
|
||||||
<artifactId>bytecodeviewer</artifactId>
|
<artifactId>bytecodeviewer</artifactId>
|
||||||
<version>2.10.0</version>
|
<version>2.10.10</version>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<java.version>8</java.version>
|
<java.version>8</java.version>
|
||||||
|
|
|
@ -14,9 +14,12 @@ import org.apache.commons.io.FileUtils;
|
||||||
import the.bytecode.club.bootloader.resource.EmptyExternalResource;
|
import the.bytecode.club.bootloader.resource.EmptyExternalResource;
|
||||||
import the.bytecode.club.bootloader.resource.ExternalResource;
|
import the.bytecode.club.bootloader.resource.ExternalResource;
|
||||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
|
import the.bytecode.club.bytecodeviewer.Constants;
|
||||||
import the.bytecode.club.bytecodeviewer.api.ExceptionUI;
|
import the.bytecode.club.bytecodeviewer.api.ExceptionUI;
|
||||||
import the.bytecode.club.bytecodeviewer.util.ZipUtils;
|
import the.bytecode.club.bytecodeviewer.util.ZipUtils;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -161,7 +164,7 @@ public class Boot {
|
||||||
setState("Bytecode Viewer Boot Screen - Verifying " + fileName + "...");
|
setState("Bytecode Viewer Boot Screen - Verifying " + fileName + "...");
|
||||||
System.out.println("Verifying " + fileName + "...");
|
System.out.println("Verifying " + fileName + "...");
|
||||||
|
|
||||||
File f = new File(BytecodeViewer.tempDirectory, "temp");
|
File f = new File(Constants.tempDirectory, "temp");
|
||||||
if (!f.exists()) {
|
if (!f.exists()) {
|
||||||
f.getParentFile().mkdirs();
|
f.getParentFile().mkdirs();
|
||||||
}
|
}
|
||||||
|
@ -181,7 +184,7 @@ public class Boot {
|
||||||
setState("Bytecode Viewer Boot Screen - Verifying " + fileName + "...");
|
setState("Bytecode Viewer Boot Screen - Verifying " + fileName + "...");
|
||||||
System.out.println("Verifying " + fileName + "...");
|
System.out.println("Verifying " + fileName + "...");
|
||||||
|
|
||||||
File f = new File(BytecodeViewer.tempDirectory, "temp");
|
File f = new File(Constants.tempDirectory, "temp");
|
||||||
ZipUtils.zipFile(file, f);
|
ZipUtils.zipFile(file, f);
|
||||||
f.delete();
|
f.delete();
|
||||||
|
|
||||||
|
@ -302,11 +305,9 @@ public class Boot {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void dropKrakatau() {
|
public static void dropKrakatau() {
|
||||||
File temp =
|
File temp = new File(getBCVDirectory() + fs + "krakatau_" + krakatauVersion + ".zip");
|
||||||
new File(BytecodeViewer.getBCVDirectory() + BytecodeViewer.fs + "krakatau_" + BytecodeViewer.krakatauVersion + ".zip");
|
File krakatauDirectory = new File(krakatauWorkingDirectory);
|
||||||
File krakatauDirectory = new File(BytecodeViewer.krakatauWorkingDirectory);
|
Constants.krakatauWorkingDirectory = krakatauWorkingDirectory + fs + "Krakatau-master";
|
||||||
BytecodeViewer.krakatauWorkingDirectory = BytecodeViewer.krakatauWorkingDirectory + BytecodeViewer.fs +
|
|
||||||
"Krakatau-master";
|
|
||||||
if (!krakatauDirectory.exists() || temp.exists()) {
|
if (!krakatauDirectory.exists() || temp.exists()) {
|
||||||
if (temp.exists())
|
if (temp.exists())
|
||||||
temp.delete();
|
temp.delete();
|
||||||
|
@ -318,8 +319,7 @@ public class Boot {
|
||||||
while (temp.exists())
|
while (temp.exists())
|
||||||
temp.delete();
|
temp.delete();
|
||||||
|
|
||||||
InputStream is =
|
InputStream is = BytecodeViewer.class.getClassLoader().getResourceAsStream("Krakatau-" + Constants.krakatauVersion + ".zip");
|
||||||
BytecodeViewer.class.getClassLoader().getResourceAsStream("Krakatau-" + BytecodeViewer.krakatauVersion + ".zip");
|
|
||||||
FileOutputStream baos = new FileOutputStream(temp);
|
FileOutputStream baos = new FileOutputStream(temp);
|
||||||
|
|
||||||
int r;
|
int r;
|
||||||
|
@ -340,23 +340,22 @@ public class Boot {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void dropEnjarify() {
|
public static void dropEnjarify() {
|
||||||
File temp =
|
File temp = new File(getBCVDirectory() + fs + "enjarify" + Constants.enjarifyVersion + ".zip");
|
||||||
new File(BytecodeViewer.getBCVDirectory() + BytecodeViewer.fs + "enjarify" + BytecodeViewer.enjarifyVersion + ".zip");
|
File enjarifyDirectory = new File(Constants.enjarifyWorkingDirectory);
|
||||||
File enjarifyDirectory = new File(BytecodeViewer.enjarifyWorkingDirectory);
|
Constants.enjarifyWorkingDirectory = Constants.enjarifyWorkingDirectory + fs + "enjarify-master";
|
||||||
BytecodeViewer.enjarifyWorkingDirectory = BytecodeViewer.enjarifyWorkingDirectory + BytecodeViewer.fs +
|
|
||||||
"enjarify-master";
|
|
||||||
if (!enjarifyDirectory.exists() || temp.exists()) {
|
if (!enjarifyDirectory.exists() || temp.exists()) {
|
||||||
if (temp.exists())
|
if (temp.exists())
|
||||||
temp.delete();
|
temp.delete();
|
||||||
|
|
||||||
setState("Bytecode Viewer Boot Screen - Extracting Enjarify");
|
setState("Bytecode Viewer Boot Screen - Extracting Enjarify");
|
||||||
System.out.println("Extracting Enjarify");
|
System.out.println("Extracting Enjarify");
|
||||||
try {
|
|
||||||
|
|
||||||
|
try {
|
||||||
while (temp.exists())
|
while (temp.exists())
|
||||||
temp.delete();
|
temp.delete();
|
||||||
|
|
||||||
InputStream is =
|
InputStream is =
|
||||||
BytecodeViewer.class.getClassLoader().getResourceAsStream("enjarify-" + BytecodeViewer.enjarifyVersion + ".zip");
|
BytecodeViewer.class.getClassLoader().getResourceAsStream("enjarify-" + Constants.enjarifyVersion + ".zip");
|
||||||
FileOutputStream baos = new FileOutputStream(temp);
|
FileOutputStream baos = new FileOutputStream(temp);
|
||||||
|
|
||||||
int r;
|
int r;
|
||||||
|
@ -432,7 +431,7 @@ public class Boot {
|
||||||
setState("Bytecode Viewer Boot Screen - Verifying " + fileName + "...");
|
setState("Bytecode Viewer Boot Screen - Verifying " + fileName + "...");
|
||||||
System.out.println("Verifying " + fileName + "...");
|
System.out.println("Verifying " + fileName + "...");
|
||||||
|
|
||||||
File f = new File(BytecodeViewer.tempDirectory, "temp");
|
File f = new File(Constants.tempDirectory, "temp");
|
||||||
ZipUtils.zipFile(file, f);
|
ZipUtils.zipFile(file, f);
|
||||||
f.delete();
|
f.delete();
|
||||||
|
|
||||||
|
@ -454,15 +453,15 @@ public class Boot {
|
||||||
setState("Bytecode Viewer Boot Screen - Checking Enjarify...");
|
setState("Bytecode Viewer Boot Screen - Checking Enjarify...");
|
||||||
System.out.println("Checking enjarify");
|
System.out.println("Checking enjarify");
|
||||||
File enjarifyZip = null;
|
File enjarifyZip = null;
|
||||||
for (File f : Objects.requireNonNull(new File(BytecodeViewer.libsDirectory).listFiles())) {
|
for (File f : Objects.requireNonNull(new File(Constants.libsDirectory).listFiles())) {
|
||||||
if (f.getName().toLowerCase().startsWith("enjarify-")) {
|
if (f.getName().toLowerCase().startsWith("enjarify-")) {
|
||||||
BytecodeViewer.enjarifyVersion = f.getName().split("-")[1].split("\\.")[0];
|
Constants.enjarifyVersion = f.getName().split("-")[1].split("\\.")[0];
|
||||||
enjarifyZip = f;
|
enjarifyZip = f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (File f : Objects.requireNonNull(new File(BytecodeViewer.getBCVDirectory()).listFiles())) {
|
for (File f : Objects.requireNonNull(new File(getBCVDirectory()).listFiles())) {
|
||||||
if (f.getName().toLowerCase().startsWith("enjarify_") && !f.getName().split("_")[1].split("\\.")[0].equals(BytecodeViewer.enjarifyVersion)) {
|
if (f.getName().toLowerCase().startsWith("enjarify_") && !f.getName().split("_")[1].split("\\.")[0].equals(Constants.enjarifyVersion)) {
|
||||||
setState("Bytecode Viewer Boot Screen - Removing Outdated " + f.getName() + "...");
|
setState("Bytecode Viewer Boot Screen - Removing Outdated " + f.getName() + "...");
|
||||||
System.out.println("Removing oudated " + f.getName());
|
System.out.println("Removing oudated " + f.getName());
|
||||||
try {
|
try {
|
||||||
|
@ -473,19 +472,17 @@ public class Boot {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BytecodeViewer.enjarifyWorkingDirectory =
|
Constants.enjarifyWorkingDirectory = getBCVDirectory() + fs + "enjarify_" + Constants.enjarifyVersion + fs + "enjarify-master";
|
||||||
BytecodeViewer.getBCVDirectory() + BytecodeViewer.fs + "enjarify_" + BytecodeViewer.enjarifyVersion + BytecodeViewer.fs + "enjarify-master";
|
File enjarifyDirectory = new File(getBCVDirectory() + fs + "enjarify_" + Constants.enjarifyVersion);
|
||||||
File enjarifyDirectory =
|
|
||||||
new File(BytecodeViewer.getBCVDirectory() + BytecodeViewer.fs + "enjarify_" + BytecodeViewer.enjarifyVersion);
|
|
||||||
if (!enjarifyDirectory.exists()) {
|
if (!enjarifyDirectory.exists()) {
|
||||||
try {
|
try {
|
||||||
setState("Bytecode Viewer Boot Screen - Updating to " + enjarifyDirectory.getName() + "...");
|
setState("Bytecode Viewer Boot Screen - Updating to " + enjarifyDirectory.getName() + "...");
|
||||||
ZipUtils.unzipFilesToPath(Objects.requireNonNull(enjarifyZip).getAbsolutePath(),
|
ZipUtils.unzipFilesToPath(Objects.requireNonNull(enjarifyZip).getAbsolutePath(),
|
||||||
enjarifyDirectory.getAbsolutePath());
|
enjarifyDirectory.getAbsolutePath());
|
||||||
System.out.println("Updated to enjarify v" + BytecodeViewer.enjarifyVersion);
|
System.out.println("Updated to enjarify v" + Constants.enjarifyVersion);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
BytecodeViewer.showMessage("ERROR: There was an issue unzipping enjarify (possibly corrupt). Restart "
|
BytecodeViewer.showMessage("ERROR: There was an issue unzipping enjarify (possibly corrupt). Restart "
|
||||||
+ "BCV." + BytecodeViewer.nl +
|
+ "BCV." + nl +
|
||||||
"If the error persists contact @Konloch.");
|
"If the error persists contact @Konloch.");
|
||||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||||
Objects.requireNonNull(enjarifyZip).delete();
|
Objects.requireNonNull(enjarifyZip).delete();
|
||||||
|
@ -499,16 +496,16 @@ public class Boot {
|
||||||
System.out.println("Checking krakatau");
|
System.out.println("Checking krakatau");
|
||||||
|
|
||||||
File krakatauZip = null;
|
File krakatauZip = null;
|
||||||
for (File f : Objects.requireNonNull(new File(BytecodeViewer.libsDirectory).listFiles())) {
|
for (File f : Objects.requireNonNull(new File(Constants.libsDirectory).listFiles())) {
|
||||||
if (f.getName().toLowerCase().startsWith("krakatau-")) {
|
if (f.getName().toLowerCase().startsWith("krakatau-")) {
|
||||||
//System.out.println(f.getName());
|
//System.out.println(f.getName());
|
||||||
BytecodeViewer.krakatauVersion = f.getName().split("-")[1].split("\\.")[0];
|
Constants.krakatauVersion = f.getName().split("-")[1].split("\\.")[0];
|
||||||
krakatauZip = f;
|
krakatauZip = f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (File f : Objects.requireNonNull(new File(BytecodeViewer.getBCVDirectory()).listFiles())) {
|
for (File f : Objects.requireNonNull(new File(getBCVDirectory()).listFiles())) {
|
||||||
if (f.getName().toLowerCase().startsWith("krakatau_") && !f.getName().split("_")[1].split("\\.")[0].equals(BytecodeViewer.krakatauVersion)) {
|
if (f.getName().toLowerCase().startsWith("krakatau_") && !f.getName().split("_")[1].split("\\.")[0].equals(Constants.krakatauVersion)) {
|
||||||
setState("Bytecode Viewer Boot Screen - Removing Outdated " + f.getName() + "...");
|
setState("Bytecode Viewer Boot Screen - Removing Outdated " + f.getName() + "...");
|
||||||
System.out.println("Removing oudated " + f.getName());
|
System.out.println("Removing oudated " + f.getName());
|
||||||
try {
|
try {
|
||||||
|
@ -519,20 +516,18 @@ public class Boot {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BytecodeViewer.krakatauWorkingDirectory = BytecodeViewer.getBCVDirectory() + BytecodeViewer.fs + "krakatau_" +
|
Constants.krakatauWorkingDirectory = getBCVDirectory() + fs + "krakatau_" + Constants.krakatauVersion + fs + "Krakatau-master";
|
||||||
BytecodeViewer.krakatauVersion + BytecodeViewer.fs + "Krakatau-master";
|
|
||||||
|
|
||||||
File krakatauDirectory =
|
File krakatauDirectory = new File(getBCVDirectory() + fs + "krakatau_" + Constants.krakatauVersion);
|
||||||
new File(BytecodeViewer.getBCVDirectory() + BytecodeViewer.fs + "krakatau_" + BytecodeViewer.krakatauVersion);
|
|
||||||
if (!krakatauDirectory.exists()) {
|
if (!krakatauDirectory.exists()) {
|
||||||
try {
|
try {
|
||||||
setState("Bytecode Viewer Boot Screen - Updating to " + krakatauDirectory.getName() + "...");
|
setState("Bytecode Viewer Boot Screen - Updating to " + krakatauDirectory.getName() + "...");
|
||||||
ZipUtils.unzipFilesToPath(Objects.requireNonNull(krakatauZip).getAbsolutePath(),
|
ZipUtils.unzipFilesToPath(Objects.requireNonNull(krakatauZip).getAbsolutePath(),
|
||||||
krakatauDirectory.getAbsolutePath());
|
krakatauDirectory.getAbsolutePath());
|
||||||
System.out.println("Updated to krakatau v" + BytecodeViewer.krakatauVersion);
|
System.out.println("Updated to krakatau v" + Constants.krakatauVersion);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
BytecodeViewer.showMessage("ERROR: There was an issue unzipping Krakatau decompiler (possibly "
|
BytecodeViewer.showMessage("ERROR: There was an issue unzipping Krakatau decompiler (possibly "
|
||||||
+ "corrupt). Restart BCV." + BytecodeViewer.nl +
|
+ "corrupt). Restart BCV." + nl +
|
||||||
"If the error persists contact @Konloch.");
|
"If the error persists contact @Konloch.");
|
||||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||||
Objects.requireNonNull(krakatauZip).delete();
|
Objects.requireNonNull(krakatauZip).delete();
|
||||||
|
|
|
@ -1,21 +1,11 @@
|
||||||
package the.bytecode.club.bytecodeviewer;
|
package the.bytecode.club.bytecodeviewer;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
|
||||||
import com.google.gson.GsonBuilder;
|
|
||||||
import com.google.gson.reflect.TypeToken;
|
|
||||||
import java.awt.Desktop;
|
|
||||||
import java.awt.event.KeyEvent;
|
import java.awt.event.KeyEvent;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.net.URI;
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Paths;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -26,17 +16,12 @@ import javax.swing.JMenuItem;
|
||||||
import javax.swing.JOptionPane;
|
import javax.swing.JOptionPane;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
import javax.swing.filechooser.FileFilter;
|
import javax.swing.filechooser.FileFilter;
|
||||||
import me.konloch.kontainer.io.DiskReader;
|
|
||||||
import me.konloch.kontainer.io.DiskWriter;
|
import me.konloch.kontainer.io.DiskWriter;
|
||||||
import me.konloch.kontainer.io.HTTPRequest;
|
import me.konloch.kontainer.io.HTTPRequest;
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.objectweb.asm.tree.ClassNode;
|
import org.objectweb.asm.tree.ClassNode;
|
||||||
import the.bytecode.club.bootloader.Boot;
|
import the.bytecode.club.bootloader.Boot;
|
||||||
import the.bytecode.club.bootloader.ILoader;
|
|
||||||
import the.bytecode.club.bootloader.resource.EmptyExternalResource;
|
|
||||||
import the.bytecode.club.bootloader.resource.ExternalResource;
|
|
||||||
import the.bytecode.club.bytecodeviewer.api.ClassNodeLoader;
|
import the.bytecode.club.bytecodeviewer.api.ClassNodeLoader;
|
||||||
import the.bytecode.club.bytecodeviewer.api.ExceptionUI;
|
|
||||||
import the.bytecode.club.bytecodeviewer.compilers.Compilers;
|
import the.bytecode.club.bytecodeviewer.compilers.Compilers;
|
||||||
import the.bytecode.club.bytecodeviewer.gui.ClassViewer;
|
import the.bytecode.club.bytecodeviewer.gui.ClassViewer;
|
||||||
import the.bytecode.club.bytecodeviewer.gui.FileNavigationPane;
|
import the.bytecode.club.bytecodeviewer.gui.FileNavigationPane;
|
||||||
|
@ -47,14 +32,9 @@ import the.bytecode.club.bytecodeviewer.gui.SystemErrConsole;
|
||||||
import the.bytecode.club.bytecodeviewer.gui.WorkPane;
|
import the.bytecode.club.bytecodeviewer.gui.WorkPane;
|
||||||
import the.bytecode.club.bytecodeviewer.obfuscators.mapping.Refactorer;
|
import the.bytecode.club.bytecodeviewer.obfuscators.mapping.Refactorer;
|
||||||
import the.bytecode.club.bytecodeviewer.plugin.PluginManager;
|
import the.bytecode.club.bytecodeviewer.plugin.PluginManager;
|
||||||
import the.bytecode.club.bytecodeviewer.util.APKTool;
|
import the.bytecode.club.bytecodeviewer.util.*;
|
||||||
import the.bytecode.club.bytecodeviewer.util.Dex2Jar;
|
|
||||||
import the.bytecode.club.bytecodeviewer.util.Enjarify;
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
import the.bytecode.club.bytecodeviewer.util.FileContainer;
|
|
||||||
import the.bytecode.club.bytecodeviewer.util.JRTExtractor;
|
|
||||||
import the.bytecode.club.bytecodeviewer.util.JarUtils;
|
|
||||||
import the.bytecode.club.bytecodeviewer.util.LazyNameUtil;
|
|
||||||
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
|
@ -75,66 +55,47 @@ import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO:
|
|
||||||
* open as folder doesn't actually work
|
|
||||||
* smali compile
|
|
||||||
* <p>
|
|
||||||
* A lightweight Java Reverse Engineering suite, developed by Konloch - http://konloch.me
|
* A lightweight Java Reverse Engineering suite, developed by Konloch - http://konloch.me
|
||||||
* <p>
|
*
|
||||||
* All you have to do is add a jar or class file into the workspace,
|
* All you have to do is add a jar or class file into the workspace,
|
||||||
* select the file you want then it will start decompiling the class in the background.
|
* select the file you want then it will start decompiling the class in the background.
|
||||||
* When it's done it will show the Source code, Bytecode and Hexcode of the class file you chose.
|
* When it's done it will show the Source code, Bytecode and Hexcode of the class file you chose.
|
||||||
* <p>
|
*
|
||||||
* There is also a plugin system that will allow you to interact with the loaded classfiles.
|
* There is also a plugin system that will allow you to interact with the loaded classfiles.
|
||||||
* For example you can write a String deobfuscator, a malicious code searcher,
|
* For example you can write a String deobfuscator, a malicious code searcher,
|
||||||
* or anything else you can think of.
|
* or anything else you can think of.
|
||||||
* <p>
|
*
|
||||||
* You can either use one of the pre-written plugins, or write your own. It supports java scripting.
|
* You can either use one of the pre-written plugins, or write your own. It supports java scripting.
|
||||||
* Once a plugin is activated, it will send a ClassNode ArrayList of every single class loaded in the
|
* Once a plugin is activated, it will send a ClassNode ArrayList of every single class loaded in the
|
||||||
* file system to the execute function, this allows the user to handle it completely using ASM.
|
* file system to the execute function, this allows the user to handle it completely using ASM.
|
||||||
* <p>
|
*
|
||||||
* Are you a Java Reverse Engineer? Or maybe you want to learn Java Reverse Engineering?
|
* Are you a Java Reverse Engineer? Or maybe you want to learn Java Reverse Engineering?
|
||||||
* Join The Bytecode Club, we're noob friendly, and censorship free.
|
* Join The Bytecode Club, we're noob friendly, and censorship free.
|
||||||
* http://the.bytecode.club
|
* http://the.bytecode.club
|
||||||
* <p>
|
*
|
||||||
* TODO:
|
* TODO:
|
||||||
* Finish dragging code
|
* open as folder doesn't actually work
|
||||||
* Finish right-click tab menu detection
|
* smali compile
|
||||||
* make it use that global last used inside of export as jar
|
* Finish dragging code
|
||||||
* Add https://github.com/ptnkjke/Java-Bytecode-Editor visualize as a plugin
|
* Finish right-click tab menu detection
|
||||||
* make zipfile not include the decode shit
|
* make it use that global last used inside of export as jar
|
||||||
* add stackmapframes to bytecode decompiler
|
* Add https://github.com/ptnkjke/Java-Bytecode-Editor visualize as a plugin
|
||||||
* make ez-injection plugin console show all sys.out calls
|
* make zipfile not include the decode shit
|
||||||
* add JEB decompiler optionally, requires them to add jeb library jar externally and disable update check ?
|
* add stackmapframes to bytecode decompiler
|
||||||
* add decompile as zip for krakatau-bytecode, jd-gui and smali for CLI
|
* make ez-injection plugin console show all sys.out calls
|
||||||
* add decompile all as zip for CLI
|
* add JEB decompiler optionally, requires them to add jeb library jar externally and disable update check ?
|
||||||
* fix hook inject for EZ-Injection
|
* add decompile as zip for krakatau-bytecode, jd-gui and smali for CLI
|
||||||
* fix classfile searcher
|
* add decompile all as zip for CLI
|
||||||
* make the decompilers launch in a separate process
|
* fix hook inject for EZ-Injection
|
||||||
|
* fix classfile searcher
|
||||||
|
* make the decompilers launch in a separate process
|
||||||
*
|
*
|
||||||
* @author Konloch
|
* @author Konloch
|
||||||
* @author The entire BCV community
|
* @author The entire BCV community
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class BytecodeViewer {
|
public class BytecodeViewer
|
||||||
/*per version*/
|
{
|
||||||
public static final String VERSION = "2.10.10";
|
|
||||||
public static String krakatauVersion = "12";
|
|
||||||
public static String enjarifyVersion = "4";
|
|
||||||
public static final boolean BLOCK_TAB_MENU = true;
|
|
||||||
public static final boolean PREVIEW_COPY = false;
|
|
||||||
public static final boolean FAT_JAR = true; //could be automatic by checking if it's loaded a class named
|
|
||||||
// whatever for a library
|
|
||||||
public static final boolean OFFLINE_MODE = true; //disables the automatic updater
|
|
||||||
|
|
||||||
/*the rest*/
|
|
||||||
public static boolean verify = false; //eventually may be a setting
|
|
||||||
public static String[] args;
|
|
||||||
public static MainViewerGUI viewer = null;
|
|
||||||
public static ClassNodeLoader loader = new ClassNodeLoader(); //might be insecure due to assholes targeting BCV,
|
|
||||||
// however that's highly unlikely.
|
|
||||||
public static SecurityMan sm = new SecurityMan(); //might be insecure due to assholes targeting BCV, however
|
|
||||||
// that's highly unlikely.
|
|
||||||
public static String python = "";
|
public static String python = "";
|
||||||
public static String python3 = "";
|
public static String python3 = "";
|
||||||
public static String rt = "";
|
public static String rt = "";
|
||||||
|
@ -147,242 +108,28 @@ public class BytecodeViewer {
|
||||||
public static boolean currentlyDumping = false;
|
public static boolean currentlyDumping = false;
|
||||||
public static boolean needsReDump = true;
|
public static boolean needsReDump = true;
|
||||||
public static boolean warnForEditing = false;
|
public static boolean warnForEditing = false;
|
||||||
public static List<FileContainer> files = new ArrayList<>(); //all of BCV's loaded files/classes/etc
|
|
||||||
private static final int maxRecentFiles = 25;
|
|
||||||
public static String fs = System.getProperty("file.separator");
|
|
||||||
public static String nl = System.getProperty("line.separator");
|
|
||||||
private static final File BCVDir = new File(System.getProperty("user.home") + fs + ".Bytecode-Viewer");
|
|
||||||
public static File RT_JAR = new File(System.getProperty("java.home") + fs + "lib" + fs + "rt.jar");
|
|
||||||
public static File RT_JAR_DUMPED = new File(getBCVDirectory() + fs + "rt.jar");
|
|
||||||
private static final String filesName = getBCVDirectory() + fs + "recentfiles.json";
|
|
||||||
private static final String pluginsName = getBCVDirectory() + fs + "recentplugins.json";
|
|
||||||
public static String settingsName = getBCVDirectory() + fs + "settings.bcv";
|
|
||||||
public static String tempDirectory = getBCVDirectory() + fs + "bcv_temp" + fs;
|
|
||||||
public static String libsDirectory = getBCVDirectory() + fs + "libs" + fs;
|
|
||||||
public static String krakatauWorkingDirectory = getBCVDirectory() + fs + "krakatau_" + krakatauVersion;
|
|
||||||
public static String enjarifyWorkingDirectory = getBCVDirectory() + fs + "enjarify_" + enjarifyVersion;
|
|
||||||
public static boolean runningObfuscation = false;
|
public static boolean runningObfuscation = false;
|
||||||
private static final long start = System.currentTimeMillis();
|
private static final long start = System.currentTimeMillis();
|
||||||
public static String lastDirectory = ".";
|
public static String lastDirectory = ".";
|
||||||
public static List<Process> createdProcesses = new ArrayList<>();
|
|
||||||
public static Refactorer refactorer = new Refactorer();
|
|
||||||
public static boolean pingback = false;
|
public static boolean pingback = false;
|
||||||
public static boolean deleteForeignLibraries = true;
|
public static boolean deleteForeignLibraries = true;
|
||||||
public static boolean canExit = false;
|
public static boolean canExit = false;
|
||||||
public static Gson gson;
|
|
||||||
|
|
||||||
private static List<String> recentPlugins;
|
|
||||||
private static List<String> recentFiles;
|
|
||||||
|
|
||||||
static {
|
public static boolean verify = false; //eventually may be a setting
|
||||||
try {
|
public static String[] args;
|
||||||
gson = new GsonBuilder().setPrettyPrinting().create();
|
public static MainViewerGUI viewer = null;
|
||||||
if (new File(filesName).exists())
|
public static ClassNodeLoader loader = new ClassNodeLoader(); //might be insecure due to assholes targeting BCV,
|
||||||
recentFiles = gson.fromJson(DiskReader.loadAsString(filesName), new TypeToken<ArrayList<String>>() {
|
public static SecurityMan sm = new SecurityMan(); //might be insecure due to assholes targeting BCV, however
|
||||||
}.getType());
|
public static Refactorer refactorer = new Refactorer();
|
||||||
else
|
public static List<FileContainer> files = new ArrayList<>(); //all of BCV's loaded files/classes/etc
|
||||||
recentFiles = DiskReader.loadArrayList(getBCVDirectory() + fs + "recentfiles.bcv", false);
|
public static List<Process> createdProcesses = new ArrayList<>();
|
||||||
|
|
||||||
if (new File(pluginsName).exists())
|
|
||||||
recentPlugins = gson.fromJson(DiskReader.loadAsString(pluginsName), new TypeToken<ArrayList<String>>() {
|
|
||||||
}.getType());
|
|
||||||
else
|
|
||||||
recentPlugins = DiskReader.loadArrayList(getBCVDirectory() + fs + "recentplugins.bcv", false);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The version checker thread
|
* The version checker thread
|
||||||
*/
|
*/
|
||||||
private static final Thread versionChecker = new Thread(() -> {
|
private static final Thread versionChecker = new Thread(new VersionChecker());
|
||||||
try {
|
|
||||||
HTTPRequest r = new HTTPRequest(new URL("https://raw.githubusercontent.com/Konloch/bytecode-viewer/master/VERSION"));
|
|
||||||
final String version = r.readSingle();
|
|
||||||
final String localVersion = BytecodeViewer.VERSION + 0;
|
|
||||||
try {
|
|
||||||
int simplemaths = Integer.parseInt(version.replace(".", ""));
|
|
||||||
int simplemaths2 = Integer.parseInt(localVersion.replace(".", ""));
|
|
||||||
System.out.println("DEBUG: " + simplemaths + " vs " + simplemaths2);
|
|
||||||
if (simplemaths2 > simplemaths)
|
|
||||||
return; //developer version
|
|
||||||
} catch (Exception ignored) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!BytecodeViewer.VERSION.equals(version)) {
|
|
||||||
JOptionPane pane = new JOptionPane("Your version: "
|
|
||||||
+ BytecodeViewer.VERSION
|
|
||||||
+ ", latest version: "
|
|
||||||
+ version
|
|
||||||
+ nl
|
|
||||||
+ "What would you like to do?");
|
|
||||||
Object[] options = new String[]{"Open The Download Page", "Download The Updated Jar", "Do Nothing"};
|
|
||||||
pane.setOptions(options);
|
|
||||||
JDialog dialog = pane.createDialog(BytecodeViewer.viewer,
|
|
||||||
"Bytecode Viewer - Outdated Version");
|
|
||||||
dialog.setVisible(true);
|
|
||||||
Object obj = pane.getValue();
|
|
||||||
int result = -1;
|
|
||||||
for (int k = 0; k < options.length; k++)
|
|
||||||
if (options[k].equals(obj))
|
|
||||||
result = k;
|
|
||||||
|
|
||||||
if (result == 0) {
|
|
||||||
if (Desktop.isDesktopSupported()) {
|
|
||||||
Desktop.getDesktop().browse(new URI("https://github.com/Konloch/bytecode-viewer/releases"));
|
|
||||||
} else {
|
|
||||||
showMessage("Cannot open the page, please manually type it." + nl + "https://github"
|
|
||||||
+ ".com/Konloch/bytecode-viewer/releases");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (result == 1) {
|
|
||||||
JFileChooser fc = new JFileChooser();
|
|
||||||
try {
|
|
||||||
fc.setCurrentDirectory(new File(".").getAbsoluteFile()); //set the current working directory
|
|
||||||
} catch (Exception e) {
|
|
||||||
new ExceptionUI(e);
|
|
||||||
}
|
|
||||||
fc.setFileFilter(new FileFilter() {
|
|
||||||
@Override
|
|
||||||
public boolean accept(File f) {
|
|
||||||
return f.isDirectory() || MiscUtils.extension(f.getAbsolutePath()).equals("zip");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDescription() {
|
|
||||||
return "Zip Archives";
|
|
||||||
}
|
|
||||||
});
|
|
||||||
fc.setFileHidingEnabled(false);
|
|
||||||
fc.setAcceptAllFileFilterUsed(false);
|
|
||||||
int returnVal = fc.showSaveDialog(viewer);
|
|
||||||
if (returnVal == JFileChooser.APPROVE_OPTION) {
|
|
||||||
File file = fc.getSelectedFile();
|
|
||||||
if (!file.getAbsolutePath().endsWith(".zip"))
|
|
||||||
file = new File(file.getAbsolutePath() + ".zip");
|
|
||||||
|
|
||||||
if (file.exists()) {
|
|
||||||
pane = new JOptionPane("The file " + file + " exists, would you like to overwrite it?");
|
|
||||||
options = new String[]{"Yes", "No"};
|
|
||||||
pane.setOptions(options);
|
|
||||||
dialog = pane.createDialog(BytecodeViewer.viewer,
|
|
||||||
"Bytecode Viewer - Overwrite File");
|
|
||||||
dialog.setVisible(true);
|
|
||||||
obj = pane.getValue();
|
|
||||||
result = -1;
|
|
||||||
for (int k = 0; k < options.length; k++)
|
|
||||||
if (options[k].equals(obj))
|
|
||||||
result = k;
|
|
||||||
|
|
||||||
if (result != 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
file.delete();
|
|
||||||
}
|
|
||||||
|
|
||||||
final File finalFile = file;
|
|
||||||
Thread downloadThread = new Thread(() -> {
|
|
||||||
try {
|
|
||||||
InputStream is = new URL("https://github.com/Konloch/bytecode-viewer/releases"
|
|
||||||
+ "/download/v" + version + "/BytecodeViewer." + version + ".zip").openConnection().getInputStream();
|
|
||||||
FileOutputStream fos = new FileOutputStream(finalFile);
|
|
||||||
try {
|
|
||||||
System.out.println("Downloading from https://github"
|
|
||||||
+ ".com/Konloch/bytecode-viewer/releases/download/v" + version +
|
|
||||||
"/BytecodeViewer." + version + ".zip");
|
|
||||||
byte[] buffer = new byte[8192];
|
|
||||||
int len;
|
|
||||||
int downloaded = 0;
|
|
||||||
boolean flag = false;
|
|
||||||
showMessage("Downloading the jar in the background, when it's finished "
|
|
||||||
+ "you will be alerted with another message box." + nl + nl +
|
|
||||||
"Expect this to take several minutes.");
|
|
||||||
while ((len = is.read(buffer)) > 0) {
|
|
||||||
fos.write(buffer, 0, len);
|
|
||||||
fos.flush();
|
|
||||||
downloaded += 8192;
|
|
||||||
int mbs = downloaded / 1048576;
|
|
||||||
if (mbs % 5 == 0 && mbs != 0) {
|
|
||||||
if (!flag)
|
|
||||||
System.out.println("Downloaded " + mbs + "MBs so far");
|
|
||||||
flag = true;
|
|
||||||
} else
|
|
||||||
flag = false;
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
try {
|
|
||||||
if (is != null) {
|
|
||||||
is.close();
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
fos.flush();
|
|
||||||
fos.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
System.out.println("Download finished!");
|
|
||||||
showMessage("Download successful! You can find the updated program at " + finalFile.getAbsolutePath());
|
|
||||||
} catch (FileNotFoundException e) {
|
|
||||||
try {
|
|
||||||
InputStream is = new URL("https://github.com/Konloch/bytecode-viewer"
|
|
||||||
+ "/releases/download/v" + version + "/BytecodeViewer." + version + ".jar"
|
|
||||||
).openConnection().getInputStream();
|
|
||||||
FileOutputStream fos = new FileOutputStream(finalFile);
|
|
||||||
try {
|
|
||||||
System.out.println("Downloading from https://github"
|
|
||||||
+ ".com/Konloch/bytecode-viewer/releases/download/v" + version +
|
|
||||||
"/BytecodeViewer." + version + ".jar");
|
|
||||||
byte[] buffer = new byte[8192];
|
|
||||||
int len;
|
|
||||||
int downloaded = 0;
|
|
||||||
boolean flag = false;
|
|
||||||
showMessage("Downloading the jar in the background, when it's "
|
|
||||||
+ "finished you will be alerted with another message box." + nl + nl + "Expect this to take several minutes.");
|
|
||||||
while ((len = is.read(buffer)) > 0) {
|
|
||||||
fos.write(buffer, 0, len);
|
|
||||||
fos.flush();
|
|
||||||
downloaded += 8192;
|
|
||||||
int mbs = downloaded / 1048576;
|
|
||||||
if (mbs % 5 == 0 && mbs != 0) {
|
|
||||||
if (!flag)
|
|
||||||
System.out.println("Downloaded " + mbs + "MBs so far");
|
|
||||||
flag = true;
|
|
||||||
} else
|
|
||||||
flag = false;
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
try {
|
|
||||||
if (is != null) {
|
|
||||||
is.close();
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
fos.flush();
|
|
||||||
fos.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
System.out.println("Download finished!");
|
|
||||||
showMessage("Download successful! You can find the updated program at " + finalFile.getAbsolutePath());
|
|
||||||
} catch (FileNotFoundException ex) {
|
|
||||||
showMessage("Unable to download, the zip file has not been uploaded yet, "
|
|
||||||
+ "please try again in about 10 minutes.");
|
|
||||||
} catch (Exception ex) {
|
|
||||||
new ExceptionUI(ex);
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
new ExceptionUI(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
downloadThread.start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pings back to bytecodeviewer.com to be added into the total running statistics
|
* Pings back to bytecodeviewer.com to be added into the total running statistics
|
||||||
|
@ -400,7 +147,7 @@ public class BytecodeViewer {
|
||||||
*/
|
*/
|
||||||
private static final Thread InstallFatJar = new Thread(() -> {
|
private static final Thread InstallFatJar = new Thread(() -> {
|
||||||
try {
|
try {
|
||||||
if (BytecodeViewer.OFFLINE_MODE) {
|
if (OFFLINE_MODE) {
|
||||||
Boot.dropKrakatau();
|
Boot.dropKrakatau();
|
||||||
Boot.dropEnjarify();
|
Boot.dropEnjarify();
|
||||||
} else {
|
} else {
|
||||||
|
@ -418,85 +165,7 @@ public class BytecodeViewer {
|
||||||
/**
|
/**
|
||||||
* Used to check incase booting failed for some reason, this kicks in as a fail safe
|
* Used to check incase booting failed for some reason, this kicks in as a fail safe
|
||||||
*/
|
*/
|
||||||
private static final Thread bootCheck = new Thread() {
|
private static final Thread bootCheck = new Thread(new BootCheck());
|
||||||
boolean finished = false;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
|
||||||
public void run() {
|
|
||||||
long start = System.currentTimeMillis();
|
|
||||||
|
|
||||||
while (!finished) {
|
|
||||||
if (System.currentTimeMillis() - start >= 7000) { //7 second failsafe
|
|
||||||
if (!Boot.completedboot && !Boot.downloading) {
|
|
||||||
File libsDir = Boot.libsDir();
|
|
||||||
File[] listFiles = libsDir.listFiles();
|
|
||||||
if (listFiles == null || listFiles.length <= 0) {
|
|
||||||
BytecodeViewer.showMessage(
|
|
||||||
"Github is loading extremely slow, BCV needs to download libraries from github in"
|
|
||||||
+ " order" + nl +
|
|
||||||
"to work, please try adjusting your network settings or manually "
|
|
||||||
+ "downloading these libraries" + nl +
|
|
||||||
"if this error persists.");
|
|
||||||
finished = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Boot.setState("Bytecode Viewer Boot Screen (OFFLINE MODE) - Unable to connect to github, "
|
|
||||||
+ "force booting...");
|
|
||||||
System.out.println("Unable to connect to github, force booting...");
|
|
||||||
List<String> libsFileList = new ArrayList<>();
|
|
||||||
for (File f : listFiles) {
|
|
||||||
libsFileList.add(f.getAbsolutePath());
|
|
||||||
}
|
|
||||||
|
|
||||||
ILoader<?> loader = Boot.findLoader();
|
|
||||||
|
|
||||||
for (String s : libsFileList) {
|
|
||||||
if (s.endsWith(".jar")) {
|
|
||||||
File f = new File(s);
|
|
||||||
if (f.exists()) {
|
|
||||||
Boot.setState("Bytecode Viewer Boot Screen (OFFLINE MODE) - Force Loading Library"
|
|
||||||
+ " " + f.getName());
|
|
||||||
System.out.println("Force loading library " + f.getName());
|
|
||||||
|
|
||||||
try {
|
|
||||||
ExternalResource res = new EmptyExternalResource<>(f.toURI().toURL());
|
|
||||||
loader.bind(res);
|
|
||||||
System.out.println("Successfully loaded " + f.getName());
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
f.delete();
|
|
||||||
JOptionPane.showMessageDialog(null, "Error, Library " + f.getName() + " is "
|
|
||||||
+ "corrupt, please restart to redownload it.",
|
|
||||||
"Error", JOptionPane.ERROR_MESSAGE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Boot.checkEnjarify();
|
|
||||||
Boot.checkKrakatau();
|
|
||||||
|
|
||||||
Boot.globalstop = false;
|
|
||||||
Boot.hide();
|
|
||||||
|
|
||||||
if (CommandLineInput.parseCommandLine(args) == CommandLineInput.OPEN_FILE)
|
|
||||||
BytecodeViewer.BOOT(false);
|
|
||||||
else {
|
|
||||||
BytecodeViewer.BOOT(true);
|
|
||||||
CommandLineInput.executeCommandLine(args);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finished = true;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
Thread.sleep(100);
|
|
||||||
} catch (InterruptedException ignored) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Grab the byte array from the loaded Class object
|
* Grab the byte array from the loaded Class object
|
||||||
|
@ -523,17 +192,16 @@ public class BytecodeViewer {
|
||||||
*/
|
*/
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
BytecodeViewer.args = args;
|
BytecodeViewer.args = args;
|
||||||
System.out.println("https://the.bytecode.club - Created by @Konloch - Bytecode Viewer " + VERSION + ", "
|
System.out.println("https://the.bytecode.club - Created by @Konloch - Bytecode Viewer " + VERSION + ", " + "Fat-Jar: " + FAT_JAR);
|
||||||
+ "Fat-Jar: " + FAT_JAR);
|
|
||||||
System.setSecurityManager(sm);
|
System.setSecurityManager(sm);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
UIManager.put("MenuItem.disabledAreNavigable", Boolean.FALSE);
|
UIManager.put("MenuItem.disabledAreNavigable", Boolean.FALSE);
|
||||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||||
if (PREVIEW_COPY && !CommandLineInput.containsCommand(args))
|
if (PREVIEW_COPY && !CommandLineInput.containsCommand(args))
|
||||||
showMessage("WARNING: This is a preview/dev copy, you WON'T be alerted when " + VERSION + " is "
|
showMessage("WARNING: This is a preview/dev copy, you WON'T be alerted when " + VERSION + " is "
|
||||||
+ "actually out if you use this." + nl +
|
+ "actually out if you use this." + nl +
|
||||||
"Make sure to watch the repo: https://github.com/Konloch/bytecode-viewer for " + VERSION +
|
"Make sure to watch the repo: https://github.com/Konloch/bytecode-viewer for " + VERSION + "'s release");
|
||||||
"'s release");
|
|
||||||
|
|
||||||
viewer = new MainViewerGUI();
|
viewer = new MainViewerGUI();
|
||||||
Settings.loadSettings();
|
Settings.loadSettings();
|
||||||
|
@ -623,7 +291,7 @@ public class BytecodeViewer {
|
||||||
sm.setBlocking();
|
sm.setBlocking();
|
||||||
boolean empty = java.isEmpty();
|
boolean empty = java.isEmpty();
|
||||||
while (empty) {
|
while (empty) {
|
||||||
showMessage("You need to set your Java path, this requires the JRE to be downloaded." + BytecodeViewer.nl +
|
showMessage("You need to set your Java path, this requires the JRE to be downloaded." + nl +
|
||||||
"(C:/programfiles/Java/JDK_xx/bin/java.exe)");
|
"(C:/programfiles/Java/JDK_xx/bin/java.exe)");
|
||||||
viewer.java();
|
viewer.java();
|
||||||
empty = java.isEmpty();
|
empty = java.isEmpty();
|
||||||
|
@ -835,8 +503,6 @@ public class BytecodeViewer {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean update = true;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Opens a file, optional if it should append to the recent files menu
|
* Opens a file, optional if it should append to the recent files menu
|
||||||
*
|
*
|
||||||
|
@ -850,178 +516,8 @@ public class BytecodeViewer {
|
||||||
BytecodeViewer.addRecentFile(f);
|
BytecodeViewer.addRecentFile(f);
|
||||||
|
|
||||||
BytecodeViewer.viewer.setIcon(true);
|
BytecodeViewer.viewer.setIcon(true);
|
||||||
update = true;
|
|
||||||
needsReDump = true;
|
needsReDump = true;
|
||||||
|
Thread t = new Thread(new OpenFile(files));
|
||||||
Thread t = new Thread(() -> {
|
|
||||||
try {
|
|
||||||
for (final File f : files) {
|
|
||||||
final String fn = f.getName();
|
|
||||||
if (!f.exists()) {
|
|
||||||
update = false;
|
|
||||||
showMessage("The file " + f.getAbsolutePath() + " could not be found.");
|
|
||||||
} else {
|
|
||||||
if (f.isDirectory()) {
|
|
||||||
FileContainer container = new FileContainer(f);
|
|
||||||
HashMap<String, byte[]> files1 = new HashMap<>();
|
|
||||||
boolean finished = false;
|
|
||||||
ArrayList<File> totalFiles = new ArrayList<>();
|
|
||||||
totalFiles.add(f);
|
|
||||||
String dir = f.getAbsolutePath();//f.getAbsolutePath().substring(0, f.getAbsolutePath
|
|
||||||
// ().length()-f.getName().length());
|
|
||||||
|
|
||||||
while (!finished) {
|
|
||||||
boolean added = false;
|
|
||||||
for (int i = 0; i < totalFiles.size(); i++) {
|
|
||||||
File child = totalFiles.get(i);
|
|
||||||
if (child.listFiles() != null)
|
|
||||||
for (File rocket : Objects.requireNonNull(child.listFiles()))
|
|
||||||
if (!totalFiles.contains(rocket)) {
|
|
||||||
totalFiles.add(rocket);
|
|
||||||
added = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!added) {
|
|
||||||
for (File child : totalFiles)
|
|
||||||
if (child.isFile()) {
|
|
||||||
String fileName = child.getAbsolutePath().substring(dir.length() + 1
|
|
||||||
).replaceAll("\\\\", "\\/");
|
|
||||||
|
|
||||||
|
|
||||||
files1.put(fileName,
|
|
||||||
Files.readAllBytes(Paths.get(child.getAbsolutePath())));
|
|
||||||
}
|
|
||||||
finished = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
container.files = files1;
|
|
||||||
BytecodeViewer.files.add(container);
|
|
||||||
} else {
|
|
||||||
if (fn.endsWith(".jar") || fn.endsWith(".zip") || fn.endsWith(".war")) {
|
|
||||||
try {
|
|
||||||
JarUtils.put(f);
|
|
||||||
} catch (IOException z) {
|
|
||||||
try {
|
|
||||||
JarUtils.put2(f);
|
|
||||||
} catch (final Exception e) {
|
|
||||||
new ExceptionUI(e);
|
|
||||||
update = false;
|
|
||||||
}
|
|
||||||
} catch (final Exception e) {
|
|
||||||
new ExceptionUI(e);
|
|
||||||
update = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (fn.endsWith(".class")) {
|
|
||||||
try {
|
|
||||||
byte[] bytes = JarUtils.getBytes(new FileInputStream(f));
|
|
||||||
String cafebabe = String.format("%02X", bytes[0]) + String.format("%02X",
|
|
||||||
bytes[1]) + String.format("%02X", bytes[2]) + String.format("%02X",
|
|
||||||
bytes[3]);
|
|
||||||
if (cafebabe.equalsIgnoreCase("cafebabe")) {
|
|
||||||
final ClassNode cn = JarUtils.getNode(bytes);
|
|
||||||
|
|
||||||
FileContainer container = new FileContainer(f);
|
|
||||||
container.classes.add(cn);
|
|
||||||
BytecodeViewer.files.add(container);
|
|
||||||
} else {
|
|
||||||
showMessage(fn + ": Header does not start with CAFEBABE, ignoring.");
|
|
||||||
update = false;
|
|
||||||
}
|
|
||||||
} catch (final Exception e) {
|
|
||||||
new ExceptionUI(e);
|
|
||||||
update = false;
|
|
||||||
}
|
|
||||||
} else if (fn.endsWith(".apk")) {
|
|
||||||
try {
|
|
||||||
BytecodeViewer.viewer.setIcon(true);
|
|
||||||
|
|
||||||
File tempCopy = new File(tempDirectory + fs + MiscUtils.randomString(32) +
|
|
||||||
".apk");
|
|
||||||
|
|
||||||
FileUtils.copyFile(f, tempCopy);
|
|
||||||
|
|
||||||
FileContainer container = new FileContainer(tempCopy, f.getName());
|
|
||||||
|
|
||||||
if (viewer.decodeAPKResources.isSelected()) {
|
|
||||||
File decodedResources =
|
|
||||||
new File(tempDirectory + fs + MiscUtils.randomString(32) + ".apk");
|
|
||||||
APKTool.decodeResources(tempCopy, decodedResources, container);
|
|
||||||
container.files = JarUtils.loadResources(decodedResources);
|
|
||||||
}
|
|
||||||
|
|
||||||
Objects.requireNonNull(container.files).putAll(JarUtils.loadResources(tempCopy)); //copy and rename
|
|
||||||
// to prevent unicode filenames
|
|
||||||
|
|
||||||
String name = getRandomizedName() + ".jar";
|
|
||||||
File output = new File(tempDirectory + fs + name);
|
|
||||||
|
|
||||||
if (BytecodeViewer.viewer.apkConversionGroup.isSelected(BytecodeViewer.viewer.apkConversionDex.getModel()))
|
|
||||||
Dex2Jar.dex2Jar(tempCopy, output);
|
|
||||||
else if (BytecodeViewer.viewer.apkConversionGroup.isSelected(BytecodeViewer.viewer.apkConversionEnjarify.getModel()))
|
|
||||||
Enjarify.apk2Jar(tempCopy, output);
|
|
||||||
|
|
||||||
container.classes = JarUtils.loadClasses(output);
|
|
||||||
|
|
||||||
BytecodeViewer.viewer.setIcon(false);
|
|
||||||
BytecodeViewer.files.add(container);
|
|
||||||
} catch (final Exception e) {
|
|
||||||
new ExceptionUI(e);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
} else if (fn.endsWith(".dex")) {
|
|
||||||
try {
|
|
||||||
BytecodeViewer.viewer.setIcon(true);
|
|
||||||
|
|
||||||
File tempCopy = new File(tempDirectory + fs + MiscUtils.randomString(32) +
|
|
||||||
".dex");
|
|
||||||
|
|
||||||
FileUtils.copyFile(f, tempCopy); //copy and rename to prevent unicode filenames
|
|
||||||
|
|
||||||
FileContainer container = new FileContainer(tempCopy, f.getName());
|
|
||||||
|
|
||||||
String name = getRandomizedName() + ".jar";
|
|
||||||
File output = new File(tempDirectory + fs + name);
|
|
||||||
|
|
||||||
if (BytecodeViewer.viewer.apkConversionGroup.isSelected(BytecodeViewer.viewer.apkConversionDex.getModel()))
|
|
||||||
Dex2Jar.dex2Jar(tempCopy, output);
|
|
||||||
else if (BytecodeViewer.viewer.apkConversionGroup.isSelected(BytecodeViewer.viewer.apkConversionEnjarify.getModel()))
|
|
||||||
Enjarify.apk2Jar(tempCopy, output);
|
|
||||||
|
|
||||||
container.classes = JarUtils.loadClasses(output);
|
|
||||||
|
|
||||||
BytecodeViewer.viewer.setIcon(false);
|
|
||||||
BytecodeViewer.files.add(container);
|
|
||||||
} catch (final Exception e) {
|
|
||||||
new ExceptionUI(e);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
HashMap<String, byte[]> files1 = new HashMap<>();
|
|
||||||
byte[] bytes = JarUtils.getBytes(new FileInputStream(f));
|
|
||||||
files1.put(f.getName(), bytes);
|
|
||||||
|
|
||||||
|
|
||||||
FileContainer container = new FileContainer(f);
|
|
||||||
container.files = files1;
|
|
||||||
BytecodeViewer.files.add(container);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (final Exception e) {
|
|
||||||
new ExceptionUI(e);
|
|
||||||
} finally {
|
|
||||||
BytecodeViewer.viewer.setIcon(false);
|
|
||||||
|
|
||||||
if (update)
|
|
||||||
try {
|
|
||||||
Objects.requireNonNull(MainViewerGUI.getComponent(FileNavigationPane.class)).updateTree();
|
|
||||||
} catch (NullPointerException ignored) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
t.start();
|
t.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1204,46 +700,6 @@ public class BytecodeViewer {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the BCV directory
|
|
||||||
*
|
|
||||||
* @return the static BCV directory
|
|
||||||
*/
|
|
||||||
public static String getBCVDirectory() {
|
|
||||||
while (!BCVDir.exists())
|
|
||||||
BCVDir.mkdirs();
|
|
||||||
|
|
||||||
if (!BCVDir.isHidden() && isWindows())
|
|
||||||
hideFile(BCVDir);
|
|
||||||
|
|
||||||
return BCVDir.getAbsolutePath();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if the OS contains 'win'
|
|
||||||
*
|
|
||||||
* @return true if the os.name property contains 'win'
|
|
||||||
*/
|
|
||||||
private static boolean isWindows() {
|
|
||||||
return System.getProperty("os.name").toLowerCase().contains("win");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Runs the windows command to hide files
|
|
||||||
*
|
|
||||||
* @param f file you want hidden
|
|
||||||
*/
|
|
||||||
private static void hideFile(File f) {
|
|
||||||
sm.stopBlocking();
|
|
||||||
try {
|
|
||||||
// Hide file by running attrib system command (on Windows)
|
|
||||||
Runtime.getRuntime().exec("attrib +H " + f.getAbsolutePath());
|
|
||||||
} catch (Exception e) {
|
|
||||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
|
||||||
}
|
|
||||||
sm.setBlocking();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts an array list to a string
|
* Converts an array list to a string
|
||||||
*
|
*
|
||||||
|
@ -1427,12 +883,9 @@ public class BytecodeViewer {
|
||||||
|
|
||||||
currentlyDumping = true;
|
currentlyDumping = true;
|
||||||
needsReDump = false;
|
needsReDump = false;
|
||||||
krakatauTempDir =
|
krakatauTempDir = new File(tempDirectory + fs + MiscUtils.randomString(32) + fs);
|
||||||
new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + MiscUtils.randomString(32) + BytecodeViewer.fs);
|
|
||||||
krakatauTempDir.mkdir();
|
krakatauTempDir.mkdir();
|
||||||
krakatauTempJar =
|
krakatauTempJar = new File(tempDirectory + fs + "temp" + MiscUtils.randomString(32) + ".jar");
|
||||||
new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + "temp" + MiscUtils.randomString(32) +
|
|
||||||
".jar");
|
|
||||||
//krakatauTempJar = new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + "temp" + MiscUtils
|
//krakatauTempJar = new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + "temp" + MiscUtils
|
||||||
// .randomString(32) + ".jar."+container.name);
|
// .randomString(32) + ".jar."+container.name);
|
||||||
JarUtils.saveAsJarClassesOnly(container.classes, krakatauTempJar.getAbsolutePath());
|
JarUtils.saveAsJarClassesOnly(container.classes, krakatauTempJar.getAbsolutePath());
|
||||||
|
|
|
@ -11,6 +11,8 @@ import org.objectweb.asm.tree.ClassNode;
|
||||||
import the.bytecode.club.bytecodeviewer.decompilers.Decompilers;
|
import the.bytecode.club.bytecodeviewer.decompilers.Decompilers;
|
||||||
import the.bytecode.club.bytecodeviewer.util.JarUtils;
|
import the.bytecode.club.bytecodeviewer.util.JarUtils;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -47,7 +49,7 @@ public class CommandLineInput {
|
||||||
|
|
||||||
static {
|
static {
|
||||||
options.addOption("help", false, "prints the help menu.");
|
options.addOption("help", false, "prints the help menu.");
|
||||||
options.addOption("list", false, "lists all the available decompilers for BCV " + BytecodeViewer.VERSION + ".");
|
options.addOption("list", false, "lists all the available decompilers for BCV " + VERSION + ".");
|
||||||
options.addOption("decompiler", true, "sets the decompiler, procyon by default.");
|
options.addOption("decompiler", true, "sets the decompiler, procyon by default.");
|
||||||
options.addOption("i", true, "sets the input.");
|
options.addOption("i", true, "sets the input.");
|
||||||
options.addOption("o", true, "sets the output.");
|
options.addOption("o", true, "sets the output.");
|
||||||
|
@ -184,7 +186,7 @@ public class CommandLineInput {
|
||||||
//if its just class allow any
|
//if its just class allow any
|
||||||
|
|
||||||
File tempZip =
|
File tempZip =
|
||||||
new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + "temp_" + BytecodeViewer.getRandomizedName() + ".jar");
|
new File(tempDirectory + fs + "temp_" + BytecodeViewer.getRandomizedName() + ".jar");
|
||||||
if (tempZip.exists())
|
if (tempZip.exists())
|
||||||
tempZip.delete();
|
tempZip.delete();
|
||||||
|
|
||||||
|
@ -322,7 +324,7 @@ public class CommandLineInput {
|
||||||
}
|
}
|
||||||
|
|
||||||
System.out.println("Finished.");
|
System.out.println("Finished.");
|
||||||
System.out.println("Bytecode Viewer CLI v" + BytecodeViewer.VERSION + " by @Konloch - "
|
System.out.println("Bytecode Viewer CLI v" + VERSION + " by @Konloch - "
|
||||||
+ "https://bytecodeviewer.com");
|
+ "https://bytecodeviewer.com");
|
||||||
BytecodeViewer.canExit = true;
|
BytecodeViewer.canExit = true;
|
||||||
System.exit(0);
|
System.exit(0);
|
||||||
|
|
101
src/main/java/the/bytecode/club/bytecodeviewer/Constants.java
Normal file
101
src/main/java/the/bytecode/club/bytecodeviewer/Constants.java
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
package the.bytecode.club.bytecodeviewer;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import com.google.gson.reflect.TypeToken;
|
||||||
|
import me.konloch.kontainer.io.DiskReader;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Konloch
|
||||||
|
* @since 6/21/2021
|
||||||
|
*/
|
||||||
|
public class Constants
|
||||||
|
{
|
||||||
|
/*per version*/
|
||||||
|
public static final String VERSION = "2.10.10"; //could be loaded from the pom
|
||||||
|
public static String krakatauVersion = "12";
|
||||||
|
public static String enjarifyVersion = "4";
|
||||||
|
public static final boolean BLOCK_TAB_MENU = true;
|
||||||
|
public static final boolean PREVIEW_COPY = false;
|
||||||
|
public static final boolean FAT_JAR = true; //could be automatic by checking if it's loaded a class named whatever for a library
|
||||||
|
public static final boolean OFFLINE_MODE = true; //disables the automatic updater
|
||||||
|
|
||||||
|
public static final int maxRecentFiles = 25;
|
||||||
|
public static final String fs = System.getProperty("file.separator");
|
||||||
|
public static final String nl = System.getProperty("line.separator");
|
||||||
|
public static final File BCVDir = new File(System.getProperty("user.home") + fs + ".Bytecode-Viewer");
|
||||||
|
public static final File RT_JAR = new File(System.getProperty("java.home") + fs + "lib" + fs + "rt.jar");
|
||||||
|
public static final File RT_JAR_DUMPED = new File(getBCVDirectory() + fs + "rt.jar");
|
||||||
|
public static final String filesName = getBCVDirectory() + fs + "recentfiles.json";
|
||||||
|
public static final String pluginsName = getBCVDirectory() + fs + "recentplugins.json";
|
||||||
|
public static final String settingsName = getBCVDirectory() + fs + "settings.bcv";
|
||||||
|
public static final String tempDirectory = getBCVDirectory() + fs + "bcv_temp" + fs;
|
||||||
|
public static final String libsDirectory = getBCVDirectory() + fs + "libs" + fs;
|
||||||
|
public static String krakatauWorkingDirectory = getBCVDirectory() + fs + "krakatau_" + krakatauVersion;
|
||||||
|
public static String enjarifyWorkingDirectory = getBCVDirectory() + fs + "enjarify_" + enjarifyVersion;
|
||||||
|
|
||||||
|
public static List<String> recentPlugins;
|
||||||
|
public static List<String> recentFiles;
|
||||||
|
public static Gson gson;
|
||||||
|
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
gson = new GsonBuilder().setPrettyPrinting().create();
|
||||||
|
if (new File(filesName).exists())
|
||||||
|
recentFiles = gson.fromJson(DiskReader.loadAsString(filesName), new TypeToken<ArrayList<String>>() {}.getType());
|
||||||
|
else
|
||||||
|
recentFiles = DiskReader.loadArrayList(getBCVDirectory() + fs + "recentfiles.bcv", false);
|
||||||
|
|
||||||
|
if (new File(pluginsName).exists())
|
||||||
|
recentPlugins = gson.fromJson(DiskReader.loadAsString(pluginsName), new TypeToken<ArrayList<String>>() {}.getType());
|
||||||
|
else
|
||||||
|
recentPlugins = DiskReader.loadArrayList(getBCVDirectory() + fs + "recentplugins.bcv", false);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the BCV directory
|
||||||
|
*
|
||||||
|
* @return the static BCV directory
|
||||||
|
*/
|
||||||
|
public static String getBCVDirectory() {
|
||||||
|
while (!BCVDir.exists())
|
||||||
|
BCVDir.mkdirs();
|
||||||
|
|
||||||
|
if (!BCVDir.isHidden() && isWindows())
|
||||||
|
hideFile(BCVDir);
|
||||||
|
|
||||||
|
return BCVDir.getAbsolutePath();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the OS contains 'win'
|
||||||
|
*
|
||||||
|
* @return true if the os.name property contains 'win'
|
||||||
|
*/
|
||||||
|
private static boolean isWindows() {
|
||||||
|
return System.getProperty("os.name").toLowerCase().contains("win");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runs the windows command to hide files
|
||||||
|
*
|
||||||
|
* @param f file you want hidden
|
||||||
|
*/
|
||||||
|
private static void hideFile(File f) {
|
||||||
|
BytecodeViewer.sm.stopBlocking();
|
||||||
|
try {
|
||||||
|
// Hide file by running attrib system command (on Windows)
|
||||||
|
Runtime.getRuntime().exec("attrib +H " + f.getAbsolutePath());
|
||||||
|
} catch (Exception e) {
|
||||||
|
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||||
|
}
|
||||||
|
BytecodeViewer.sm.setBlocking();
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,6 +11,8 @@ import javax.swing.ImageIcon;
|
||||||
import org.apache.commons.codec.binary.Base64;
|
import org.apache.commons.codec.binary.Base64;
|
||||||
import org.imgscalr.Scalr;
|
import org.imgscalr.Scalr;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.libsDirectory;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -126,7 +128,7 @@ public class Resources {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String findLibrary(String nameContains) {
|
public static String findLibrary(String nameContains) {
|
||||||
for (File f : Objects.requireNonNull(new File(BytecodeViewer.libsDirectory).listFiles())) {
|
for (File f : Objects.requireNonNull(new File(libsDirectory).listFiles())) {
|
||||||
if (f.getName().contains(nameContains))
|
if (f.getName().contains(nameContains))
|
||||||
return f.getAbsolutePath();
|
return f.getAbsolutePath();
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,8 @@ import javax.swing.JFrame;
|
||||||
import me.konloch.kontainer.io.DiskReader;
|
import me.konloch.kontainer.io.DiskReader;
|
||||||
import me.konloch.kontainer.io.DiskWriter;
|
import me.konloch.kontainer.io.DiskWriter;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -32,315 +34,315 @@ public class Settings {
|
||||||
|
|
||||||
public static void saveSettings() {
|
public static void saveSettings() {
|
||||||
try {
|
try {
|
||||||
DiskWriter.replaceFile(BytecodeViewer.settingsName, "BCV: " + BytecodeViewer.VERSION, false);
|
DiskWriter.replaceFile(settingsName, "BCV: " + VERSION, false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.rbr.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.rbr.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.rsy.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.rsy.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.din.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.din.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.dc4.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.dc4.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.das.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.das.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.hes.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.hes.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.hdc.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.hdc.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.dgs.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.dgs.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.ner.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.ner.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.den.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.den.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.rgn.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.rgn.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.bto.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.bto.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.nns.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.nns.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.uto.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.uto.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.udv.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.udv.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.rer.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.rer.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.fdi.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.fdi.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.asc.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.asc.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.decodeenumswitch.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.decodeenumswitch.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.sugarenums.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.sugarenums.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.decodestringswitch.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.decodestringswitch.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.arrayiter.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.arrayiter.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.collectioniter.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.collectioniter.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.innerclasses.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.innerclasses.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.removeboilerplate.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.removeboilerplate.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.removeinnerclasssynthetics.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.removeinnerclasssynthetics.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.decodelambdas.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.decodelambdas.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.hidebridgemethods.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.hidebridgemethods.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.liftconstructorinit.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.liftconstructorinit.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.removedeadmethods.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.removedeadmethods.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.removebadgenerics.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.removebadgenerics.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.sugarasserts.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.sugarasserts.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.sugarboxing.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.sugarboxing.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.showversion.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.showversion.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.decodefinally.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.decodefinally.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.tidymonitors.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.tidymonitors.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.lenient.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.lenient.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.dumpclasspath.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.dumpclasspath.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.comments.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.comments.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.forcetopsort.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.forcetopsort.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.forcetopsortaggress.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.forcetopsortaggress.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.stringbuffer.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.stringbuffer.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.stringbuilder.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.stringbuilder.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.silent.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.silent.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.recover.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.recover.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.eclipse.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.eclipse.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.override.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.override.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.showinferrable.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.showinferrable.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.aexagg.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.aexagg.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.forcecondpropagate.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.forcecondpropagate.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.hideutf.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.hideutf.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.hidelongstrings.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.hidelongstrings.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.commentmonitor.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.commentmonitor.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.allowcorrecting.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.allowcorrecting.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.labelledblocks.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.labelledblocks.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.j14classobj.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.j14classobj.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.hidelangimports.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.hidelangimports.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.recoverytypeclash.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.recoverytypeclash.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.recoverytypehints.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.recoverytypehints.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.forceturningifs.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.forceturningifs.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.forloopaggcapture.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.forloopaggcapture.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.forceexceptionprune.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.forceexceptionprune.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.chckbxmntmShowDebugLine.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.chckbxmntmShowDebugLine.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.chckbxmntmSimplifyMemberReferences.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.chckbxmntmSimplifyMemberReferences.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.mnMergeVariables.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.mnMergeVariables.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_1.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_1.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_2.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_2.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_3.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_3.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_4.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_4.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_5.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_5.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_6.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_6.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_7.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_7.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_8.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_8.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_9.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_9.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_10.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_10.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_11.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_11.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.chckbxmntmAppendBrackets.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.chckbxmntmAppendBrackets.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.debugHelpers.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.debugHelpers.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "deprecated", false);
|
DiskWriter.writeNewLine(settingsName, "deprecated", false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_12.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.chckbxmntmNewCheckItem_12.isSelected()), false);
|
||||||
if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1None.getModel()))
|
if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1None.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "0", false);
|
DiskWriter.writeNewLine(settingsName, "0", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1Proc.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1Proc.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "1", false);
|
DiskWriter.writeNewLine(settingsName, "1", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1CFR.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1CFR.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "2", false);
|
DiskWriter.writeNewLine(settingsName, "2", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1Fern.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1Fern.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "3", false);
|
DiskWriter.writeNewLine(settingsName, "3", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1Bytecode.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1Bytecode.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "4", false);
|
DiskWriter.writeNewLine(settingsName, "4", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1Hexcode.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1Hexcode.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "5", false);
|
DiskWriter.writeNewLine(settingsName, "5", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1Smali.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1Smali.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "6", false);
|
DiskWriter.writeNewLine(settingsName, "6", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1Krakatau.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1Krakatau.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "7", false);
|
DiskWriter.writeNewLine(settingsName, "7", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1KrakatauBytecode.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1KrakatauBytecode.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "8", false);
|
DiskWriter.writeNewLine(settingsName, "8", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1JDGUI.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1JDGUI.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "9", false);
|
DiskWriter.writeNewLine(settingsName, "9", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.jadxJ1.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.jadxJ1.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "10", false);
|
DiskWriter.writeNewLine(settingsName, "10", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.asmText1.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.asmText1.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "11", false);
|
DiskWriter.writeNewLine(settingsName, "11", false);
|
||||||
|
|
||||||
if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2None.getModel()))
|
if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2None.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "0", false);
|
DiskWriter.writeNewLine(settingsName, "0", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2Proc.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2Proc.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "1", false);
|
DiskWriter.writeNewLine(settingsName, "1", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2CFR.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2CFR.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "2", false);
|
DiskWriter.writeNewLine(settingsName, "2", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2Fern.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2Fern.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "3", false);
|
DiskWriter.writeNewLine(settingsName, "3", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2Bytecode.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2Bytecode.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "4", false);
|
DiskWriter.writeNewLine(settingsName, "4", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2Hexcode.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2Hexcode.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "5", false);
|
DiskWriter.writeNewLine(settingsName, "5", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2Smali.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2Smali.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "6", false);
|
DiskWriter.writeNewLine(settingsName, "6", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2Krakatau.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2Krakatau.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "7", false);
|
DiskWriter.writeNewLine(settingsName, "7", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2KrakatauBytecode.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2KrakatauBytecode.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "8", false);
|
DiskWriter.writeNewLine(settingsName, "8", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2JDGUI.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2JDGUI.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "9", false);
|
DiskWriter.writeNewLine(settingsName, "9", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.jadxJ2.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.jadxJ2.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "10", false);
|
DiskWriter.writeNewLine(settingsName, "10", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.asmText2.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.asmText2.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "11", false);
|
DiskWriter.writeNewLine(settingsName, "11", false);
|
||||||
|
|
||||||
if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3None.getModel()))
|
if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3None.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "0", false);
|
DiskWriter.writeNewLine(settingsName, "0", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3Proc.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3Proc.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "1", false);
|
DiskWriter.writeNewLine(settingsName, "1", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3CFR.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3CFR.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "2", false);
|
DiskWriter.writeNewLine(settingsName, "2", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3Fern.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3Fern.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "3", false);
|
DiskWriter.writeNewLine(settingsName, "3", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3Bytecode.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3Bytecode.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "4", false);
|
DiskWriter.writeNewLine(settingsName, "4", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3Hexcode.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3Hexcode.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "5", false);
|
DiskWriter.writeNewLine(settingsName, "5", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3Smali.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3Smali.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "6", false);
|
DiskWriter.writeNewLine(settingsName, "6", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3Krakatau.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3Krakatau.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "7", false);
|
DiskWriter.writeNewLine(settingsName, "7", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3KrakatauBytecode.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3KrakatauBytecode.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "8", false);
|
DiskWriter.writeNewLine(settingsName, "8", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3JDGUI.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3JDGUI.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "9", false);
|
DiskWriter.writeNewLine(settingsName, "9", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.jadxJ3.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.jadxJ3.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "10", false);
|
DiskWriter.writeNewLine(settingsName, "10", false);
|
||||||
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.asmText3.getModel()))
|
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.asmText3.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "11", false);
|
DiskWriter.writeNewLine(settingsName, "11", false);
|
||||||
|
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.refreshOnChange.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.refreshOnChange.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.isMaximized),
|
DiskWriter.writeNewLine(settingsName, String.valueOf(BytecodeViewer.viewer.isMaximized),
|
||||||
false);
|
false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "deprecated", false);
|
DiskWriter.writeNewLine(settingsName, "deprecated", false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "deprecated", false);
|
DiskWriter.writeNewLine(settingsName, "deprecated", false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, BytecodeViewer.lastDirectory, false);
|
DiskWriter.writeNewLine(settingsName, BytecodeViewer.lastDirectory, false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, BytecodeViewer.python, false);
|
DiskWriter.writeNewLine(settingsName, BytecodeViewer.python, false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, BytecodeViewer.rt, false);
|
DiskWriter.writeNewLine(settingsName, BytecodeViewer.rt, false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.panel1Proc_E.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.panel1Proc_E.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.panel1CFR_E.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.panel1CFR_E.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.panel1Fern_E.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.panel1Fern_E.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.panel1Krakatau_E.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.panel1Krakatau_E.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.panel1Smali_E.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.panel1Smali_E.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.panel2Proc_E.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.panel2Proc_E.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.panel2CFR_E.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.panel2CFR_E.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.panel2Fern_E.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.panel2Fern_E.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.panel2Krakatau_E.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.panel2Krakatau_E.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.panel2Smali_E.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.panel2Smali_E.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.panel3Proc_E.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.panel3Proc_E.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.panel3CFR_E.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.panel3CFR_E.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.panel3Fern_E.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.panel3Fern_E.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.panel3Krakatau_E.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.panel3Krakatau_E.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.panel3Smali_E.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.panel3Smali_E.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.decodeAPKResources.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.decodeAPKResources.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, BytecodeViewer.library, false);
|
DiskWriter.writeNewLine(settingsName, BytecodeViewer.library, false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.pingback), false);
|
DiskWriter.writeNewLine(settingsName, String.valueOf(BytecodeViewer.pingback), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.panel1JDGUI_E.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.panel1JDGUI_E.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.panel2JDGUI_E.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.panel2JDGUI_E.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.panel3JDGUI_E.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.panel3JDGUI_E.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.fontSpinner.getValue()), false);
|
String.valueOf(BytecodeViewer.viewer.fontSpinner.getValue()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.deleteForeignLibraries), false);
|
String.valueOf(BytecodeViewer.deleteForeignLibraries), false);
|
||||||
if (BytecodeViewer.viewer.apkConversionGroup.isSelected(BytecodeViewer.viewer.apkConversionDex.getModel()))
|
if (BytecodeViewer.viewer.apkConversionGroup.isSelected(BytecodeViewer.viewer.apkConversionDex.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "0", false);
|
DiskWriter.writeNewLine(settingsName, "0", false);
|
||||||
else if (BytecodeViewer.viewer.apkConversionGroup.isSelected(BytecodeViewer.viewer.apkConversionEnjarify.getModel()))
|
else if (BytecodeViewer.viewer.apkConversionGroup.isSelected(BytecodeViewer.viewer.apkConversionEnjarify.getModel()))
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "1", false);
|
DiskWriter.writeNewLine(settingsName, "1", false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, BytecodeViewer.python3, false);
|
DiskWriter.writeNewLine(settingsName, BytecodeViewer.python3, false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, BytecodeViewer.javac, false);
|
DiskWriter.writeNewLine(settingsName, BytecodeViewer.javac, false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, BytecodeViewer.java, false);
|
DiskWriter.writeNewLine(settingsName, BytecodeViewer.java, false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.compileOnSave.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.compileOnSave.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.autoCompileOnRefresh.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.autoCompileOnRefresh.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.warnForEditing), false);
|
DiskWriter.writeNewLine(settingsName, String.valueOf(BytecodeViewer.warnForEditing), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.showFileInTabTitle.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.showFileInTabTitle.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.forcePureAsciiAsText.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.forcePureAsciiAsText.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.synchronizedViewing.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.synchronizedViewing.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.showClassMethods.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.showClassMethods.isSelected()), false);
|
||||||
DiskWriter.writeNewLine(BytecodeViewer.settingsName,
|
DiskWriter.writeNewLine(settingsName,
|
||||||
String.valueOf(BytecodeViewer.viewer.ren.isSelected()), false);
|
String.valueOf(BytecodeViewer.viewer.ren.isSelected()), false);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||||
|
@ -349,87 +351,87 @@ public class Settings {
|
||||||
|
|
||||||
public static void loadSettings() { //utilizes the Disk Reader's caching system.
|
public static void loadSettings() { //utilizes the Disk Reader's caching system.
|
||||||
try {
|
try {
|
||||||
BytecodeViewer.viewer.rbr.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 1, true)));
|
BytecodeViewer.viewer.rbr.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 1, true)));
|
||||||
BytecodeViewer.viewer.rsy.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 2, false)));
|
BytecodeViewer.viewer.rsy.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 2, false)));
|
||||||
BytecodeViewer.viewer.din.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 3, false)));
|
BytecodeViewer.viewer.din.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 3, false)));
|
||||||
BytecodeViewer.viewer.dc4.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 4, false)));
|
BytecodeViewer.viewer.dc4.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 4, false)));
|
||||||
BytecodeViewer.viewer.das.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 5, false)));
|
BytecodeViewer.viewer.das.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 5, false)));
|
||||||
BytecodeViewer.viewer.hes.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 6, false)));
|
BytecodeViewer.viewer.hes.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 6, false)));
|
||||||
BytecodeViewer.viewer.hdc.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 7, false)));
|
BytecodeViewer.viewer.hdc.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 7, false)));
|
||||||
BytecodeViewer.viewer.dgs.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 8, false)));
|
BytecodeViewer.viewer.dgs.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 8, false)));
|
||||||
BytecodeViewer.viewer.ner.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 9, false)));
|
BytecodeViewer.viewer.ner.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 9, false)));
|
||||||
BytecodeViewer.viewer.den.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 10, false)));
|
BytecodeViewer.viewer.den.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 10, false)));
|
||||||
BytecodeViewer.viewer.rgn.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 11, false)));
|
BytecodeViewer.viewer.rgn.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 11, false)));
|
||||||
BytecodeViewer.viewer.bto.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 12, false)));
|
BytecodeViewer.viewer.bto.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 12, false)));
|
||||||
BytecodeViewer.viewer.nns.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 13, false)));
|
BytecodeViewer.viewer.nns.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 13, false)));
|
||||||
BytecodeViewer.viewer.uto.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 14, false)));
|
BytecodeViewer.viewer.uto.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 14, false)));
|
||||||
BytecodeViewer.viewer.udv.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 15, false)));
|
BytecodeViewer.viewer.udv.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 15, false)));
|
||||||
BytecodeViewer.viewer.rer.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 16, false)));
|
BytecodeViewer.viewer.rer.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 16, false)));
|
||||||
BytecodeViewer.viewer.fdi.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 17, false)));
|
BytecodeViewer.viewer.fdi.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 17, false)));
|
||||||
BytecodeViewer.viewer.asc.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 18, false)));
|
BytecodeViewer.viewer.asc.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 18, false)));
|
||||||
BytecodeViewer.viewer.decodeenumswitch.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 19, false)));
|
BytecodeViewer.viewer.decodeenumswitch.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 19, false)));
|
||||||
BytecodeViewer.viewer.sugarenums.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 20, false)));
|
BytecodeViewer.viewer.sugarenums.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 20, false)));
|
||||||
BytecodeViewer.viewer.decodestringswitch.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 21, false)));
|
BytecodeViewer.viewer.decodestringswitch.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 21, false)));
|
||||||
BytecodeViewer.viewer.arrayiter.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 22, false)));
|
BytecodeViewer.viewer.arrayiter.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 22, false)));
|
||||||
BytecodeViewer.viewer.collectioniter.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 23, false)));
|
BytecodeViewer.viewer.collectioniter.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 23, false)));
|
||||||
BytecodeViewer.viewer.innerclasses.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 24, false)));
|
BytecodeViewer.viewer.innerclasses.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 24, false)));
|
||||||
BytecodeViewer.viewer.removeboilerplate.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 25, false)));
|
BytecodeViewer.viewer.removeboilerplate.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 25, false)));
|
||||||
BytecodeViewer.viewer.removeinnerclasssynthetics.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 26, false)));
|
BytecodeViewer.viewer.removeinnerclasssynthetics.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 26, false)));
|
||||||
BytecodeViewer.viewer.decodelambdas.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 27, false)));
|
BytecodeViewer.viewer.decodelambdas.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 27, false)));
|
||||||
BytecodeViewer.viewer.hidebridgemethods.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 28, false)));
|
BytecodeViewer.viewer.hidebridgemethods.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 28, false)));
|
||||||
BytecodeViewer.viewer.liftconstructorinit.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 29, false)));
|
BytecodeViewer.viewer.liftconstructorinit.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 29, false)));
|
||||||
BytecodeViewer.viewer.removedeadmethods.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 30, false)));
|
BytecodeViewer.viewer.removedeadmethods.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 30, false)));
|
||||||
BytecodeViewer.viewer.removebadgenerics.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 31, false)));
|
BytecodeViewer.viewer.removebadgenerics.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 31, false)));
|
||||||
BytecodeViewer.viewer.sugarasserts.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 32, false)));
|
BytecodeViewer.viewer.sugarasserts.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 32, false)));
|
||||||
BytecodeViewer.viewer.sugarboxing.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 33, false)));
|
BytecodeViewer.viewer.sugarboxing.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 33, false)));
|
||||||
BytecodeViewer.viewer.showversion.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 34, false)));
|
BytecodeViewer.viewer.showversion.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 34, false)));
|
||||||
BytecodeViewer.viewer.decodefinally.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 35, false)));
|
BytecodeViewer.viewer.decodefinally.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 35, false)));
|
||||||
BytecodeViewer.viewer.tidymonitors.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 36, false)));
|
BytecodeViewer.viewer.tidymonitors.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 36, false)));
|
||||||
BytecodeViewer.viewer.lenient.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 37, false)));
|
BytecodeViewer.viewer.lenient.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 37, false)));
|
||||||
BytecodeViewer.viewer.dumpclasspath.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 38, false)));
|
BytecodeViewer.viewer.dumpclasspath.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 38, false)));
|
||||||
BytecodeViewer.viewer.comments.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 39, false)));
|
BytecodeViewer.viewer.comments.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 39, false)));
|
||||||
BytecodeViewer.viewer.forcetopsort.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 40, false)));
|
BytecodeViewer.viewer.forcetopsort.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 40, false)));
|
||||||
BytecodeViewer.viewer.forcetopsortaggress.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 41, false)));
|
BytecodeViewer.viewer.forcetopsortaggress.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 41, false)));
|
||||||
BytecodeViewer.viewer.stringbuffer.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 42, false)));
|
BytecodeViewer.viewer.stringbuffer.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 42, false)));
|
||||||
BytecodeViewer.viewer.stringbuilder.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 43, false)));
|
BytecodeViewer.viewer.stringbuilder.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 43, false)));
|
||||||
BytecodeViewer.viewer.silent.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 44, false)));
|
BytecodeViewer.viewer.silent.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 44, false)));
|
||||||
BytecodeViewer.viewer.recover.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 45, false)));
|
BytecodeViewer.viewer.recover.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 45, false)));
|
||||||
BytecodeViewer.viewer.eclipse.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 46, false)));
|
BytecodeViewer.viewer.eclipse.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 46, false)));
|
||||||
BytecodeViewer.viewer.override.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 47, false)));
|
BytecodeViewer.viewer.override.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 47, false)));
|
||||||
BytecodeViewer.viewer.showinferrable.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 48, false)));
|
BytecodeViewer.viewer.showinferrable.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 48, false)));
|
||||||
BytecodeViewer.viewer.aexagg.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 49, false)));
|
BytecodeViewer.viewer.aexagg.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 49, false)));
|
||||||
BytecodeViewer.viewer.forcecondpropagate.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 50, false)));
|
BytecodeViewer.viewer.forcecondpropagate.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 50, false)));
|
||||||
BytecodeViewer.viewer.hideutf.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 51, false)));
|
BytecodeViewer.viewer.hideutf.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 51, false)));
|
||||||
BytecodeViewer.viewer.hidelongstrings.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 52, false)));
|
BytecodeViewer.viewer.hidelongstrings.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 52, false)));
|
||||||
BytecodeViewer.viewer.commentmonitor.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 53, false)));
|
BytecodeViewer.viewer.commentmonitor.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 53, false)));
|
||||||
BytecodeViewer.viewer.allowcorrecting.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 54, false)));
|
BytecodeViewer.viewer.allowcorrecting.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 54, false)));
|
||||||
BytecodeViewer.viewer.labelledblocks.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 55, false)));
|
BytecodeViewer.viewer.labelledblocks.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 55, false)));
|
||||||
BytecodeViewer.viewer.j14classobj.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 56, false)));
|
BytecodeViewer.viewer.j14classobj.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 56, false)));
|
||||||
BytecodeViewer.viewer.hidelangimports.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 57, false)));
|
BytecodeViewer.viewer.hidelangimports.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 57, false)));
|
||||||
BytecodeViewer.viewer.recoverytypeclash.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 58, false)));
|
BytecodeViewer.viewer.recoverytypeclash.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 58, false)));
|
||||||
BytecodeViewer.viewer.recoverytypehints.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 59, false)));
|
BytecodeViewer.viewer.recoverytypehints.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 59, false)));
|
||||||
BytecodeViewer.viewer.forceturningifs.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 60, false)));
|
BytecodeViewer.viewer.forceturningifs.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 60, false)));
|
||||||
BytecodeViewer.viewer.forloopaggcapture.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 61, false)));
|
BytecodeViewer.viewer.forloopaggcapture.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 61, false)));
|
||||||
BytecodeViewer.viewer.forceexceptionprune.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 62, false)));
|
BytecodeViewer.viewer.forceexceptionprune.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 62, false)));
|
||||||
BytecodeViewer.viewer.chckbxmntmShowDebugLine.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 63, false)));
|
BytecodeViewer.viewer.chckbxmntmShowDebugLine.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 63, false)));
|
||||||
BytecodeViewer.viewer.chckbxmntmSimplifyMemberReferences.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 64, false)));
|
BytecodeViewer.viewer.chckbxmntmSimplifyMemberReferences.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 64, false)));
|
||||||
BytecodeViewer.viewer.mnMergeVariables.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 65, false)));
|
BytecodeViewer.viewer.mnMergeVariables.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 65, false)));
|
||||||
BytecodeViewer.viewer.chckbxmntmNewCheckItem_1.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 66, false)));
|
BytecodeViewer.viewer.chckbxmntmNewCheckItem_1.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 66, false)));
|
||||||
BytecodeViewer.viewer.chckbxmntmNewCheckItem_2.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 67, false)));
|
BytecodeViewer.viewer.chckbxmntmNewCheckItem_2.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 67, false)));
|
||||||
BytecodeViewer.viewer.chckbxmntmNewCheckItem_3.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 68, false)));
|
BytecodeViewer.viewer.chckbxmntmNewCheckItem_3.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 68, false)));
|
||||||
BytecodeViewer.viewer.chckbxmntmNewCheckItem_4.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 69, false)));
|
BytecodeViewer.viewer.chckbxmntmNewCheckItem_4.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 69, false)));
|
||||||
BytecodeViewer.viewer.chckbxmntmNewCheckItem_5.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 70, false)));
|
BytecodeViewer.viewer.chckbxmntmNewCheckItem_5.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 70, false)));
|
||||||
BytecodeViewer.viewer.chckbxmntmNewCheckItem_6.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 71, false)));
|
BytecodeViewer.viewer.chckbxmntmNewCheckItem_6.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 71, false)));
|
||||||
BytecodeViewer.viewer.chckbxmntmNewCheckItem_7.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 72, false)));
|
BytecodeViewer.viewer.chckbxmntmNewCheckItem_7.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 72, false)));
|
||||||
BytecodeViewer.viewer.chckbxmntmNewCheckItem_8.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 73, false)));
|
BytecodeViewer.viewer.chckbxmntmNewCheckItem_8.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 73, false)));
|
||||||
BytecodeViewer.viewer.chckbxmntmNewCheckItem_9.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 74, false)));
|
BytecodeViewer.viewer.chckbxmntmNewCheckItem_9.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 74, false)));
|
||||||
BytecodeViewer.viewer.chckbxmntmNewCheckItem_10.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 75, false)));
|
BytecodeViewer.viewer.chckbxmntmNewCheckItem_10.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 75, false)));
|
||||||
BytecodeViewer.viewer.chckbxmntmNewCheckItem_11.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 76, false)));
|
BytecodeViewer.viewer.chckbxmntmNewCheckItem_11.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 76, false)));
|
||||||
BytecodeViewer.viewer.chckbxmntmAppendBrackets.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 77, false)));
|
BytecodeViewer.viewer.chckbxmntmAppendBrackets.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 77, false)));
|
||||||
BytecodeViewer.viewer.debugHelpers.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 78, false)));
|
BytecodeViewer.viewer.debugHelpers.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 78, false)));
|
||||||
//79 is deprecated
|
//79 is deprecated
|
||||||
BytecodeViewer.viewer.chckbxmntmNewCheckItem_12.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 80, false)));
|
BytecodeViewer.viewer.chckbxmntmNewCheckItem_12.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 80, false)));
|
||||||
int decompiler = Integer.parseInt(DiskReader.loadString(BytecodeViewer.settingsName, 81, false));
|
int decompiler = Integer.parseInt(DiskReader.loadString(settingsName, 81, false));
|
||||||
if (decompiler == 0)
|
if (decompiler == 0)
|
||||||
BytecodeViewer.viewer.panelGroup1.setSelected(BytecodeViewer.viewer.panel1None.getModel(), true);
|
BytecodeViewer.viewer.panelGroup1.setSelected(BytecodeViewer.viewer.panel1None.getModel(), true);
|
||||||
else if (decompiler == 1)
|
else if (decompiler == 1)
|
||||||
|
@ -456,7 +458,7 @@ public class Settings {
|
||||||
else if (decompiler == 11)
|
else if (decompiler == 11)
|
||||||
BytecodeViewer.viewer.panelGroup1.setSelected(BytecodeViewer.viewer.asmText1.getModel(), true);
|
BytecodeViewer.viewer.panelGroup1.setSelected(BytecodeViewer.viewer.asmText1.getModel(), true);
|
||||||
|
|
||||||
decompiler = Integer.parseInt(DiskReader.loadString(BytecodeViewer.settingsName, 82, false));
|
decompiler = Integer.parseInt(DiskReader.loadString(settingsName, 82, false));
|
||||||
if (decompiler == 0)
|
if (decompiler == 0)
|
||||||
BytecodeViewer.viewer.panelGroup2.setSelected(BytecodeViewer.viewer.panel2None.getModel(), true);
|
BytecodeViewer.viewer.panelGroup2.setSelected(BytecodeViewer.viewer.panel2None.getModel(), true);
|
||||||
else if (decompiler == 1)
|
else if (decompiler == 1)
|
||||||
|
@ -483,7 +485,7 @@ public class Settings {
|
||||||
else if (decompiler == 11)
|
else if (decompiler == 11)
|
||||||
BytecodeViewer.viewer.panelGroup2.setSelected(BytecodeViewer.viewer.asmText2.getModel(), true);
|
BytecodeViewer.viewer.panelGroup2.setSelected(BytecodeViewer.viewer.asmText2.getModel(), true);
|
||||||
|
|
||||||
decompiler = Integer.parseInt(DiskReader.loadString(BytecodeViewer.settingsName, 83, false));
|
decompiler = Integer.parseInt(DiskReader.loadString(settingsName, 83, false));
|
||||||
if (decompiler == 0)
|
if (decompiler == 0)
|
||||||
BytecodeViewer.viewer.panelGroup3.setSelected(BytecodeViewer.viewer.panel3None.getModel(), true);
|
BytecodeViewer.viewer.panelGroup3.setSelected(BytecodeViewer.viewer.panel3None.getModel(), true);
|
||||||
else if (decompiler == 1)
|
else if (decompiler == 1)
|
||||||
|
@ -510,61 +512,61 @@ public class Settings {
|
||||||
else if (decompiler == 11)
|
else if (decompiler == 11)
|
||||||
BytecodeViewer.viewer.panelGroup3.setSelected(BytecodeViewer.viewer.asmText3.getModel(), true);
|
BytecodeViewer.viewer.panelGroup3.setSelected(BytecodeViewer.viewer.asmText3.getModel(), true);
|
||||||
|
|
||||||
BytecodeViewer.viewer.refreshOnChange.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 84, false)));
|
BytecodeViewer.viewer.refreshOnChange.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 84, false)));
|
||||||
|
|
||||||
boolean bool = Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 85, false));
|
boolean bool = Boolean.parseBoolean(DiskReader.loadString(settingsName, 85, false));
|
||||||
if (bool) {
|
if (bool) {
|
||||||
BytecodeViewer.viewer.setExtendedState(JFrame.MAXIMIZED_BOTH);
|
BytecodeViewer.viewer.setExtendedState(JFrame.MAXIMIZED_BOTH);
|
||||||
BytecodeViewer.viewer.isMaximized = true;
|
BytecodeViewer.viewer.isMaximized = true;
|
||||||
}
|
}
|
||||||
//86 is deprecated
|
//86 is deprecated
|
||||||
//87 is deprecated
|
//87 is deprecated
|
||||||
BytecodeViewer.lastDirectory = DiskReader.loadString(BytecodeViewer.settingsName, 88, false);
|
BytecodeViewer.lastDirectory = DiskReader.loadString(settingsName, 88, false);
|
||||||
BytecodeViewer.python = DiskReader.loadString(BytecodeViewer.settingsName, 89, false);
|
BytecodeViewer.python = DiskReader.loadString(settingsName, 89, false);
|
||||||
BytecodeViewer.rt = DiskReader.loadString(BytecodeViewer.settingsName, 90, false);
|
BytecodeViewer.rt = DiskReader.loadString(settingsName, 90, false);
|
||||||
BytecodeViewer.viewer.panel1Proc_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 91, false)));
|
BytecodeViewer.viewer.panel1Proc_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 91, false)));
|
||||||
BytecodeViewer.viewer.panel1CFR_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 92, false)));
|
BytecodeViewer.viewer.panel1CFR_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 92, false)));
|
||||||
BytecodeViewer.viewer.panel1Fern_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 93, false)));
|
BytecodeViewer.viewer.panel1Fern_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 93, false)));
|
||||||
BytecodeViewer.viewer.panel1Krakatau_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 94, false)));
|
BytecodeViewer.viewer.panel1Krakatau_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 94, false)));
|
||||||
BytecodeViewer.viewer.panel1Smali_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 95, false)));
|
BytecodeViewer.viewer.panel1Smali_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 95, false)));
|
||||||
BytecodeViewer.viewer.panel2Proc_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 96, false)));
|
BytecodeViewer.viewer.panel2Proc_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 96, false)));
|
||||||
BytecodeViewer.viewer.panel2CFR_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 97, false)));
|
BytecodeViewer.viewer.panel2CFR_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 97, false)));
|
||||||
BytecodeViewer.viewer.panel2Fern_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 98, false)));
|
BytecodeViewer.viewer.panel2Fern_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 98, false)));
|
||||||
BytecodeViewer.viewer.panel2Krakatau_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 99, false)));
|
BytecodeViewer.viewer.panel2Krakatau_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 99, false)));
|
||||||
BytecodeViewer.viewer.panel2Smali_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 100, false)));
|
BytecodeViewer.viewer.panel2Smali_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 100, false)));
|
||||||
BytecodeViewer.viewer.panel3Proc_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 101, false)));
|
BytecodeViewer.viewer.panel3Proc_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 101, false)));
|
||||||
BytecodeViewer.viewer.panel3CFR_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 101, false)));
|
BytecodeViewer.viewer.panel3CFR_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 101, false)));
|
||||||
BytecodeViewer.viewer.panel3Fern_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 103, false)));
|
BytecodeViewer.viewer.panel3Fern_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 103, false)));
|
||||||
BytecodeViewer.viewer.panel3Krakatau_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 104, false)));
|
BytecodeViewer.viewer.panel3Krakatau_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 104, false)));
|
||||||
BytecodeViewer.viewer.panel3Smali_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 105, false)));
|
BytecodeViewer.viewer.panel3Smali_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 105, false)));
|
||||||
BytecodeViewer.viewer.decodeAPKResources.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 106, false)));
|
BytecodeViewer.viewer.decodeAPKResources.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 106, false)));
|
||||||
BytecodeViewer.library = DiskReader.loadString(BytecodeViewer.settingsName, 107, false);
|
BytecodeViewer.library = DiskReader.loadString(settingsName, 107, false);
|
||||||
BytecodeViewer.pingback = Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 108,
|
BytecodeViewer.pingback = Boolean.parseBoolean(DiskReader.loadString(settingsName, 108,
|
||||||
false));
|
false));
|
||||||
BytecodeViewer.viewer.panel1JDGUI_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 109, false)));
|
BytecodeViewer.viewer.panel1JDGUI_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 109, false)));
|
||||||
BytecodeViewer.viewer.panel2JDGUI_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 110, false)));
|
BytecodeViewer.viewer.panel2JDGUI_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 110, false)));
|
||||||
BytecodeViewer.viewer.panel3JDGUI_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 111, false)));
|
BytecodeViewer.viewer.panel3JDGUI_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 111, false)));
|
||||||
BytecodeViewer.viewer.fontSpinner.setValue(Integer.parseInt(DiskReader.loadString(BytecodeViewer.settingsName, 112, false)));
|
BytecodeViewer.viewer.fontSpinner.setValue(Integer.parseInt(DiskReader.loadString(settingsName, 112, false)));
|
||||||
BytecodeViewer.deleteForeignLibraries =
|
BytecodeViewer.deleteForeignLibraries =
|
||||||
Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 113, false));
|
Boolean.parseBoolean(DiskReader.loadString(settingsName, 113, false));
|
||||||
decompiler = Integer.parseInt(DiskReader.loadString(BytecodeViewer.settingsName, 114, false));
|
decompiler = Integer.parseInt(DiskReader.loadString(settingsName, 114, false));
|
||||||
if (decompiler == 0)
|
if (decompiler == 0)
|
||||||
BytecodeViewer.viewer.apkConversionGroup.setSelected(BytecodeViewer.viewer.apkConversionDex.getModel(), true);
|
BytecodeViewer.viewer.apkConversionGroup.setSelected(BytecodeViewer.viewer.apkConversionDex.getModel(), true);
|
||||||
else if (decompiler == 1)
|
else if (decompiler == 1)
|
||||||
BytecodeViewer.viewer.apkConversionGroup.setSelected(BytecodeViewer.viewer.apkConversionEnjarify.getModel(), true);
|
BytecodeViewer.viewer.apkConversionGroup.setSelected(BytecodeViewer.viewer.apkConversionEnjarify.getModel(), true);
|
||||||
BytecodeViewer.python3 = DiskReader.loadString(BytecodeViewer.settingsName, 115, false);
|
BytecodeViewer.python3 = DiskReader.loadString(settingsName, 115, false);
|
||||||
BytecodeViewer.javac = DiskReader.loadString(BytecodeViewer.settingsName, 116, false);
|
BytecodeViewer.javac = DiskReader.loadString(settingsName, 116, false);
|
||||||
BytecodeViewer.java = DiskReader.loadString(BytecodeViewer.settingsName, 117, false);
|
BytecodeViewer.java = DiskReader.loadString(settingsName, 117, false);
|
||||||
BytecodeViewer.viewer.compileOnSave.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 118, false)));
|
BytecodeViewer.viewer.compileOnSave.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 118, false)));
|
||||||
BytecodeViewer.viewer.autoCompileOnRefresh.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 119, false)));
|
BytecodeViewer.viewer.autoCompileOnRefresh.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 119, false)));
|
||||||
BytecodeViewer.warnForEditing = Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName,
|
BytecodeViewer.warnForEditing = Boolean.parseBoolean(DiskReader.loadString(settingsName,
|
||||||
120, false));
|
120, false));
|
||||||
BytecodeViewer.viewer.showFileInTabTitle.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 121, false)));
|
BytecodeViewer.viewer.showFileInTabTitle.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 121, false)));
|
||||||
BytecodeViewer.displayParentInTab = BytecodeViewer.viewer.showFileInTabTitle.isSelected();
|
BytecodeViewer.displayParentInTab = BytecodeViewer.viewer.showFileInTabTitle.isSelected();
|
||||||
BytecodeViewer.viewer.forcePureAsciiAsText.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 122, false)));
|
BytecodeViewer.viewer.forcePureAsciiAsText.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 122, false)));
|
||||||
BytecodeViewer.viewer.synchronizedViewing.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 123, false)));
|
BytecodeViewer.viewer.synchronizedViewing.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 123, false)));
|
||||||
BytecodeViewer.viewer.showClassMethods.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 124, false)));
|
BytecodeViewer.viewer.showClassMethods.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 124, false)));
|
||||||
BytecodeViewer.viewer.ren.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 125, false)));
|
BytecodeViewer.viewer.ren.setSelected(Boolean.parseBoolean(DiskReader.loadString(settingsName, 125, false)));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
//ignore because errors are expected, first start up and outdated settings.
|
//ignore because errors are expected, first start up and outdated settings.
|
||||||
//e.printStackTrace();
|
//e.printStackTrace();
|
||||||
|
|
|
@ -15,6 +15,8 @@ import the.bytecode.club.bytecodeviewer.decompilers.Decompilers;
|
||||||
import the.bytecode.club.bytecodeviewer.plugin.preinstalled.EZInjection;
|
import the.bytecode.club.bytecodeviewer.plugin.preinstalled.EZInjection;
|
||||||
import the.bytecode.club.bytecodeviewer.util.JarUtils;
|
import the.bytecode.club.bytecodeviewer.util.JarUtils;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -70,10 +72,7 @@ public class BytecodeViewer {
|
||||||
*/
|
*/
|
||||||
public static List<Class<?>> loadClassesIntoClassLoader() {
|
public static List<Class<?>> loadClassesIntoClassLoader() {
|
||||||
try {
|
try {
|
||||||
File f = new File(
|
File f = new File(tempDirectory + fs + "loaded_temp.jar");
|
||||||
the.bytecode.club.bytecodeviewer.BytecodeViewer.tempDirectory +
|
|
||||||
the.bytecode.club.bytecodeviewer.BytecodeViewer.fs +
|
|
||||||
"loaded_temp.jar");
|
|
||||||
JarUtils.saveAsJar(BytecodeViewer.getLoadedClasses(), f.getAbsolutePath());
|
JarUtils.saveAsJar(BytecodeViewer.getLoadedClasses(), f.getAbsolutePath());
|
||||||
JarFile jarFile = new JarFile("" + f.getAbsolutePath());
|
JarFile jarFile = new JarFile("" + f.getAbsolutePath());
|
||||||
Enumeration<JarEntry> e = jarFile.entries();
|
Enumeration<JarEntry> e = jarFile.entries();
|
||||||
|
|
|
@ -11,6 +11,8 @@ import javax.swing.JTextArea;
|
||||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
import the.bytecode.club.bytecodeviewer.Resources;
|
import the.bytecode.club.bytecodeviewer.Resources;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -73,25 +75,23 @@ public class ExceptionUI extends JFrame {
|
||||||
|
|
||||||
this.setIconImages(Resources.iconList);
|
this.setIconImages(Resources.iconList);
|
||||||
setSize(new Dimension(600, 400));
|
setSize(new Dimension(600, 400));
|
||||||
setTitle("Bytecode Viewer " + BytecodeViewer.VERSION
|
setTitle("Bytecode Viewer " + VERSION + " - Stack Trace - Send this to " + author);
|
||||||
+ " - Stack Trace - Send this to " + author);
|
|
||||||
getContentPane().setLayout(new CardLayout(0, 0));
|
getContentPane().setLayout(new CardLayout(0, 0));
|
||||||
|
|
||||||
JTextArea txtrBytecodeViewerIs = new JTextArea();
|
JTextArea txtrBytecodeViewerIs = new JTextArea();
|
||||||
txtrBytecodeViewerIs.setDisabledTextColor(Color.BLACK);
|
txtrBytecodeViewerIs.setDisabledTextColor(Color.BLACK);
|
||||||
txtrBytecodeViewerIs.setWrapStyleWord(true);
|
txtrBytecodeViewerIs.setWrapStyleWord(true);
|
||||||
getContentPane().add(new JScrollPane(txtrBytecodeViewerIs),
|
getContentPane().add(new JScrollPane(txtrBytecodeViewerIs), "name_140466576080695");
|
||||||
"name_140466576080695");
|
|
||||||
StringWriter sw = new StringWriter();
|
StringWriter sw = new StringWriter();
|
||||||
e.printStackTrace(new PrintWriter(sw));
|
e.printStackTrace(new PrintWriter(sw));
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
||||||
txtrBytecodeViewerIs.setText("Bytecode Viewer Version: " + BytecodeViewer.VERSION +
|
txtrBytecodeViewerIs.setText("Bytecode Viewer Version: " + VERSION +
|
||||||
", Preview Copy: " + BytecodeViewer.PREVIEW_COPY +
|
", Preview Copy: " + PREVIEW_COPY +
|
||||||
", Fat Jar: " + BytecodeViewer.FAT_JAR +
|
", Fat Jar: " + FAT_JAR +
|
||||||
", OS: " + System.getProperty("os.name") +
|
", OS: " + System.getProperty("os.name") +
|
||||||
", Java: " + System.getProperty("java.version") +
|
", Java: " + System.getProperty("java.version") +
|
||||||
BytecodeViewer.nl + BytecodeViewer.nl + sw);
|
nl + nl + sw);
|
||||||
this.setLocationRelativeTo(null);
|
this.setLocationRelativeTo(null);
|
||||||
this.setVisible(true);
|
this.setVisible(true);
|
||||||
}
|
}
|
||||||
|
@ -99,15 +99,13 @@ public class ExceptionUI extends JFrame {
|
||||||
private void setup(String e, String author) {
|
private void setup(String e, String author) {
|
||||||
this.setIconImages(Resources.iconList);
|
this.setIconImages(Resources.iconList);
|
||||||
setSize(new Dimension(600, 400));
|
setSize(new Dimension(600, 400));
|
||||||
setTitle("Bytecode Viewer " + BytecodeViewer.VERSION
|
setTitle("Bytecode Viewer " + VERSION + " - Stack Trace - Send this to " + author);
|
||||||
+ " - Stack Trace - Send this to " + author);
|
|
||||||
getContentPane().setLayout(new CardLayout(0, 0));
|
getContentPane().setLayout(new CardLayout(0, 0));
|
||||||
|
|
||||||
JTextArea txtrBytecodeViewerIs = new JTextArea();
|
JTextArea txtrBytecodeViewerIs = new JTextArea();
|
||||||
txtrBytecodeViewerIs.setDisabledTextColor(Color.BLACK);
|
txtrBytecodeViewerIs.setDisabledTextColor(Color.BLACK);
|
||||||
txtrBytecodeViewerIs.setWrapStyleWord(true);
|
txtrBytecodeViewerIs.setWrapStyleWord(true);
|
||||||
getContentPane().add(new JScrollPane(txtrBytecodeViewerIs),
|
getContentPane().add(new JScrollPane(txtrBytecodeViewerIs), "name_140466576080695");
|
||||||
"name_140466576080695");
|
|
||||||
txtrBytecodeViewerIs.setText(e);
|
txtrBytecodeViewerIs.setText(e);
|
||||||
System.err.println(e);
|
System.err.println(e);
|
||||||
this.setLocationRelativeTo(null);
|
this.setLocationRelativeTo(null);
|
||||||
|
|
|
@ -10,6 +10,8 @@ import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
import the.bytecode.club.bytecodeviewer.util.JarUtils;
|
import the.bytecode.club.bytecodeviewer.util.JarUtils;
|
||||||
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -38,22 +40,18 @@ public class JavaCompiler extends Compiler {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte[] compile(String contents, String name) {
|
public byte[] compile(String contents, String name) {
|
||||||
String fileStart =
|
String fileStart = tempDirectory + fs + "temp" + MiscUtils.randomString(12) + fs;
|
||||||
BytecodeViewer.tempDirectory + BytecodeViewer.fs + "temp" + MiscUtils.randomString(12) + BytecodeViewer.fs;
|
String fileStart2 = tempDirectory + fs + "temp" + MiscUtils.randomString(12) + fs;
|
||||||
String fileStart2 =
|
File java = new File(fileStart + fs + name + ".java");
|
||||||
BytecodeViewer.tempDirectory + BytecodeViewer.fs + "temp" + MiscUtils.randomString(12) + BytecodeViewer.fs;
|
File clazz = new File(fileStart2 + fs + name + ".class");
|
||||||
File java = new File(fileStart + BytecodeViewer.fs + name + ".java");
|
File cp = new File(tempDirectory + fs + "cpath_" + MiscUtils.randomString(12) + ".jar");
|
||||||
File clazz = new File(fileStart2 + BytecodeViewer.fs + name + ".class");
|
File tempD = new File(fileStart + fs + name.substring(0, name.length() - name.split("/")[name.split("/").length - 1].length()));
|
||||||
File cp =
|
|
||||||
new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + "cpath_" + MiscUtils.randomString(12) +
|
|
||||||
".jar");
|
|
||||||
File tempD = new File(fileStart + BytecodeViewer.fs + name.substring(0,
|
|
||||||
name.length() - name.split("/")[name.split("/").length - 1].length()));
|
|
||||||
tempD.mkdirs();
|
tempD.mkdirs();
|
||||||
new File(fileStart2).mkdirs();
|
new File(fileStart2).mkdirs();
|
||||||
|
|
||||||
if (BytecodeViewer.javac.equals("") || !new File(BytecodeViewer.javac).exists()) {
|
if (BytecodeViewer.javac.equals("") || !new File(BytecodeViewer.javac).exists()) {
|
||||||
BytecodeViewer.showMessage("You need to set your Javac path, this requires the JDK to be downloaded." + BytecodeViewer.nl + "(C:/programfiles/Java/JDK_xx/bin/javac.exe)");
|
BytecodeViewer.showMessage("You need to set your Javac path, this requires the JDK to be downloaded." + nl + "(C:/programfiles/Java/JDK_xx/bin/javac.exe)");
|
||||||
BytecodeViewer.viewer.javac();
|
BytecodeViewer.viewer.javac();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -116,20 +114,20 @@ public class JavaCompiler extends Compiler {
|
||||||
BufferedReader br = new BufferedReader(isr);
|
BufferedReader br = new BufferedReader(isr);
|
||||||
String line;
|
String line;
|
||||||
while ((line = br.readLine()) != null) {
|
while ((line = br.readLine()) != null) {
|
||||||
log.append(BytecodeViewer.nl).append(line);
|
log.append(nl).append(line);
|
||||||
}
|
}
|
||||||
br.close();
|
br.close();
|
||||||
|
|
||||||
log.append(BytecodeViewer.nl).append(BytecodeViewer.nl).append("Error:").append(BytecodeViewer.nl).append(BytecodeViewer.nl);
|
log.append(nl).append(nl).append("Error:").append(nl).append(nl);
|
||||||
is = process.getErrorStream();
|
is = process.getErrorStream();
|
||||||
isr = new InputStreamReader(is);
|
isr = new InputStreamReader(is);
|
||||||
br = new BufferedReader(isr);
|
br = new BufferedReader(isr);
|
||||||
while ((line = br.readLine()) != null) {
|
while ((line = br.readLine()) != null) {
|
||||||
log.append(BytecodeViewer.nl).append(line);
|
log.append(nl).append(line);
|
||||||
}
|
}
|
||||||
br.close();
|
br.close();
|
||||||
|
|
||||||
log.append(BytecodeViewer.nl).append(BytecodeViewer.nl).append("Exit Value is ").append(exitValue);
|
log.append(nl).append(nl).append("Exit Value is ").append(exitValue);
|
||||||
System.out.println(log);
|
System.out.println(log);
|
||||||
|
|
||||||
if (!clazz.exists())
|
if (!clazz.exists())
|
||||||
|
|
|
@ -6,9 +6,12 @@ import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import me.konloch.kontainer.io.DiskWriter;
|
import me.konloch.kontainer.io.DiskWriter;
|
||||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
|
import the.bytecode.club.bytecodeviewer.Constants;
|
||||||
import the.bytecode.club.bytecodeviewer.util.JarUtils;
|
import the.bytecode.club.bytecodeviewer.util.JarUtils;
|
||||||
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -50,18 +53,15 @@ public class KrakatauAssembler extends Compiler {
|
||||||
name = MiscUtils.randomString(20);
|
name = MiscUtils.randomString(20);
|
||||||
|
|
||||||
File tempD =
|
File tempD =
|
||||||
new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + MiscUtils.randomString(32) + BytecodeViewer.fs);
|
new File(Constants.tempDirectory + fs + MiscUtils.randomString(32) + fs);
|
||||||
tempD.mkdir();
|
tempD.mkdir();
|
||||||
|
|
||||||
File tempJ = new File(tempD.getAbsolutePath() + BytecodeViewer.fs + name + ".j");
|
File tempJ = new File(tempD.getAbsolutePath() + fs + name + ".j");
|
||||||
DiskWriter.replaceFile(tempJ.getAbsolutePath(), contents, true);
|
DiskWriter.replaceFile(tempJ.getAbsolutePath(), contents, true);
|
||||||
|
|
||||||
final File tempDirectory =
|
final File tempDirectory = new File(Constants.tempDirectory + fs + MiscUtils.randomString(32) + fs);
|
||||||
new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + MiscUtils.randomString(32) + BytecodeViewer.fs);
|
|
||||||
tempDirectory.mkdir();
|
tempDirectory.mkdir();
|
||||||
final File tempJar =
|
final File tempJar = new File(Constants.tempDirectory + fs + "temp" + MiscUtils.randomString(32) + ".jar");
|
||||||
new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + "temp" + MiscUtils.randomString(32) +
|
|
||||||
".jar");
|
|
||||||
JarUtils.saveAsJar(BytecodeViewer.getLoadedClasses(), tempJar.getAbsolutePath());
|
JarUtils.saveAsJar(BytecodeViewer.getLoadedClasses(), tempJar.getAbsolutePath());
|
||||||
|
|
||||||
BytecodeViewer.sm.stopBlocking();
|
BytecodeViewer.sm.stopBlocking();
|
||||||
|
@ -70,7 +70,7 @@ public class KrakatauAssembler extends Compiler {
|
||||||
ProcessBuilder pb = new ProcessBuilder(
|
ProcessBuilder pb = new ProcessBuilder(
|
||||||
BytecodeViewer.python,
|
BytecodeViewer.python,
|
||||||
"-O", //love you storyyeller <3
|
"-O", //love you storyyeller <3
|
||||||
BytecodeViewer.krakatauWorkingDirectory + BytecodeViewer.fs + "assemble.py",
|
krakatauWorkingDirectory + fs + "assemble.py",
|
||||||
"-out",
|
"-out",
|
||||||
tempDirectory.getAbsolutePath(),
|
tempDirectory.getAbsolutePath(),
|
||||||
tempJ.getAbsolutePath()
|
tempJ.getAbsolutePath()
|
||||||
|
@ -85,25 +85,25 @@ public class KrakatauAssembler extends Compiler {
|
||||||
BufferedReader br = new BufferedReader(isr);
|
BufferedReader br = new BufferedReader(isr);
|
||||||
String line;
|
String line;
|
||||||
while ((line = br.readLine()) != null) {
|
while ((line = br.readLine()) != null) {
|
||||||
log.append(BytecodeViewer.nl).append(line);
|
log.append(nl).append(line);
|
||||||
}
|
}
|
||||||
br.close();
|
br.close();
|
||||||
|
|
||||||
log.append(BytecodeViewer.nl).append(BytecodeViewer.nl).append("Error:").append(BytecodeViewer.nl).append(BytecodeViewer.nl);
|
log.append(nl).append(nl).append("Error:").append(nl).append(nl);
|
||||||
is = process.getErrorStream();
|
is = process.getErrorStream();
|
||||||
isr = new InputStreamReader(is);
|
isr = new InputStreamReader(is);
|
||||||
br = new BufferedReader(isr);
|
br = new BufferedReader(isr);
|
||||||
while ((line = br.readLine()) != null) {
|
while ((line = br.readLine()) != null) {
|
||||||
log.append(BytecodeViewer.nl).append(line);
|
log.append(nl).append(line);
|
||||||
}
|
}
|
||||||
br.close();
|
br.close();
|
||||||
|
|
||||||
int exitValue = process.waitFor();
|
int exitValue = process.waitFor();
|
||||||
log.append(BytecodeViewer.nl).append(BytecodeViewer.nl).append("Exit Value is ").append(exitValue);
|
log.append(nl).append(nl).append("Exit Value is ").append(exitValue);
|
||||||
System.out.println(log);
|
System.out.println(log);
|
||||||
|
|
||||||
byte[] b =
|
byte[] b =
|
||||||
org.apache.commons.io.FileUtils.readFileToByteArray(new File(tempDirectory.getAbsolutePath() + BytecodeViewer.fs + origName + ".class"));
|
org.apache.commons.io.FileUtils.readFileToByteArray(new File(tempDirectory.getAbsolutePath() + fs + origName + ".class"));
|
||||||
tempDirectory.delete();
|
tempDirectory.delete();
|
||||||
tempJar.delete();
|
tempJar.delete();
|
||||||
return b;
|
return b;
|
||||||
|
|
|
@ -9,6 +9,8 @@ import the.bytecode.club.bytecodeviewer.util.Enjarify;
|
||||||
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
||||||
import the.bytecode.club.bytecodeviewer.util.ZipUtils;
|
import the.bytecode.club.bytecodeviewer.util.ZipUtils;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -37,16 +39,16 @@ public class SmaliAssembler extends Compiler {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte[] compile(String contents, String name) {
|
public byte[] compile(String contents, String name) {
|
||||||
String fileStart = BytecodeViewer.tempDirectory + BytecodeViewer.fs + "temp";
|
String fileStart = tempDirectory + fs + "temp";
|
||||||
int fileNumber = MiscUtils.getClassNumber(fileStart, ".dex");
|
int fileNumber = MiscUtils.getClassNumber(fileStart, ".dex");
|
||||||
|
|
||||||
final File tempSmaliFolder = new File(fileStart + fileNumber + "-smalifolder" + BytecodeViewer.fs);
|
final File tempSmaliFolder = new File(fileStart + fileNumber + "-smalifolder" + fs);
|
||||||
tempSmaliFolder.mkdir();
|
tempSmaliFolder.mkdir();
|
||||||
|
|
||||||
File tempSmali = new File(tempSmaliFolder.getAbsolutePath() + BytecodeViewer.fs + fileNumber + ".smali");
|
File tempSmali = new File(tempSmaliFolder.getAbsolutePath() + fs + fileNumber + ".smali");
|
||||||
File tempDex = new File("./out.dex");
|
File tempDex = new File("./out.dex");
|
||||||
File tempJar = new File(fileStart + fileNumber + ".jar");
|
File tempJar = new File(fileStart + fileNumber + ".jar");
|
||||||
File tempJarFolder = new File(fileStart + fileNumber + "-jar" + BytecodeViewer.fs);
|
File tempJarFolder = new File(fileStart + fileNumber + "-jar" + fs);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
DiskWriter.replaceFile(tempSmali.getAbsolutePath(), contents, false);
|
DiskWriter.replaceFile(tempSmali.getAbsolutePath(), contents, false);
|
||||||
|
|
|
@ -20,6 +20,8 @@ import org.objectweb.asm.tree.ClassNode;
|
||||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -84,7 +86,7 @@ public class CFRDecompiler extends Decompiler {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String decompileClassNode(ClassNode cn, byte[] b) {
|
public String decompileClassNode(ClassNode cn, byte[] b) {
|
||||||
String fileStart = BytecodeViewer.tempDirectory + BytecodeViewer.fs.toLowerCase();
|
String fileStart = tempDirectory + fs.toLowerCase();
|
||||||
|
|
||||||
String exception = "";
|
String exception = "";
|
||||||
//final File tempClass = new File(windowsFun(MiscUtils.getUniqueName(fileStart, ".class") + ".class"));
|
//final File tempClass = new File(windowsFun(MiscUtils.getUniqueName(fileStart, ".class") + ".class"));
|
||||||
|
@ -129,7 +131,7 @@ public class CFRDecompiler extends Decompiler {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
||||||
exception =
|
exception =
|
||||||
"Bytecode Viewer Version: " + BytecodeViewer.VERSION + BytecodeViewer.nl + BytecodeViewer.nl + sw;
|
"Bytecode Viewer Version: " + VERSION + nl + nl + sw;
|
||||||
}
|
}
|
||||||
|
|
||||||
tempClass.delete();
|
tempClass.delete();
|
||||||
|
@ -138,7 +140,7 @@ public class CFRDecompiler extends Decompiler {
|
||||||
if (file.exists())
|
if (file.exists())
|
||||||
return findFile(Objects.requireNonNull(file.listFiles()));
|
return findFile(Objects.requireNonNull(file.listFiles()));
|
||||||
|
|
||||||
return "CFR error! Send the stacktrace to Konloch at https://the.bytecode.club or konloch@gmail.com" + BytecodeViewer.nl + BytecodeViewer.nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler." + BytecodeViewer.nl + BytecodeViewer.nl + exception;
|
return "CFR error! Send the stacktrace to Konloch at https://the.bytecode.club or konloch@gmail.com" + nl + nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler." + nl + nl + exception;
|
||||||
}
|
}
|
||||||
|
|
||||||
Random r = new Random();
|
Random r = new Random();
|
||||||
|
@ -166,15 +168,15 @@ public class CFRDecompiler extends Decompiler {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
||||||
String exception =
|
String exception =
|
||||||
"Bytecode Viewer Version: " + BytecodeViewer.VERSION + BytecodeViewer.nl + BytecodeViewer.nl + sw;
|
"Bytecode Viewer Version: " + VERSION + nl + nl + sw;
|
||||||
return "CFR error! Send the stacktrace to Konloch at https://the.bytecode.club or konloch@gmail"
|
return "CFR error! Send the stacktrace to Konloch at https://the.bytecode.club or konloch@gmail"
|
||||||
+ ".com" + BytecodeViewer.nl + BytecodeViewer.nl + "Suggested Fix: Click refresh class, "
|
+ ".com" + nl + nl + "Suggested Fix: Click refresh class, "
|
||||||
+ "if it fails again try another decompiler." + BytecodeViewer.nl + BytecodeViewer.nl + exception;
|
+ "if it fails again try another decompiler." + nl + nl + exception;
|
||||||
}
|
}
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "CFR error!" + BytecodeViewer.nl + BytecodeViewer.nl + "Suggested Fix: Click refresh class, if it "
|
return "CFR error!" + nl + nl + "Suggested Fix: Click refresh class, if it "
|
||||||
+ "fails again try another decompiler.";
|
+ "fails again try another decompiler.";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -296,7 +298,7 @@ public class CFRDecompiler extends Decompiler {
|
||||||
public void decompileToZip(String sourceJar, String zipName) {
|
public void decompileToZip(String sourceJar, String zipName) {
|
||||||
File tempZip = new File(sourceJar);
|
File tempZip = new File(sourceJar);
|
||||||
|
|
||||||
String fileStart = BytecodeViewer.tempDirectory + BytecodeViewer.fs;
|
String fileStart = tempDirectory + fs;
|
||||||
String fuckery = fuckery(fileStart);
|
String fuckery = fuckery(fileStart);
|
||||||
|
|
||||||
org.benf.cfr.reader.Main.main(generateMainMethod(tempZip.getAbsolutePath(), fuckery));
|
org.benf.cfr.reader.Main.main(generateMainMethod(tempZip.getAbsolutePath(), fuckery));
|
||||||
|
|
|
@ -12,6 +12,8 @@ import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
import the.bytecode.club.bytecodeviewer.Resources;
|
import the.bytecode.club.bytecodeviewer.Resources;
|
||||||
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -42,17 +44,16 @@ public class FernFlowerDecompiler extends Decompiler {
|
||||||
public void decompileToZip(String sourceJar, String zipName) {
|
public void decompileToZip(String sourceJar, String zipName) {
|
||||||
File tempZip = new File(sourceJar);
|
File tempZip = new File(sourceJar);
|
||||||
|
|
||||||
File f = new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + "temp" + BytecodeViewer.fs);
|
File f = new File(tempDirectory + fs + "temp" + fs);
|
||||||
f.mkdir();
|
f.mkdir();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler.main(generateMainMethod(tempZip.getAbsolutePath(), BytecodeViewer.tempDirectory + "./temp/"));
|
org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler.main(generateMainMethod(tempZip.getAbsolutePath(), tempDirectory + "./temp/"));
|
||||||
} catch (StackOverflowError | Exception ignored) {
|
} catch (StackOverflowError | Exception ignored) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
File tempZip2 =
|
File tempZip2 = new File(tempDirectory + fs + "temp" + fs + tempZip.getName());
|
||||||
new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + "temp" + BytecodeViewer.fs + tempZip.getName());
|
|
||||||
if (tempZip2.exists())
|
if (tempZip2.exists())
|
||||||
tempZip2.renameTo(new File(zipName));
|
tempZip2.renameTo(new File(zipName));
|
||||||
|
|
||||||
|
@ -61,33 +62,29 @@ public class FernFlowerDecompiler extends Decompiler {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String decompileClassNode(final ClassNode cn, byte[] b) {
|
public String decompileClassNode(final ClassNode cn, byte[] b) {
|
||||||
String start = BytecodeViewer.tempDirectory + BytecodeViewer.fs + MiscUtils.getUniqueName("", ".class");
|
String start = tempDirectory + fs + MiscUtils.getUniqueName("", ".class");
|
||||||
|
|
||||||
final File tempClass = new File(start + ".class");
|
final File tempClass = new File(start + ".class");
|
||||||
|
|
||||||
String exception = "";
|
String exception = "";
|
||||||
try {
|
try {
|
||||||
final FileOutputStream fos = new FileOutputStream(tempClass);
|
final FileOutputStream fos = new FileOutputStream(tempClass);
|
||||||
|
|
||||||
fos.write(b);
|
fos.write(b);
|
||||||
|
|
||||||
fos.close();
|
fos.close();
|
||||||
} catch (final IOException e) {
|
} catch (final IOException e) {
|
||||||
StringWriter sw = new StringWriter();
|
StringWriter sw = new StringWriter();
|
||||||
e.printStackTrace(new PrintWriter(sw));
|
e.printStackTrace(new PrintWriter(sw));
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
exception = "Bytecode Viewer Version: " + VERSION + nl + nl + sw;
|
||||||
exception =
|
|
||||||
"Bytecode Viewer Version: " + BytecodeViewer.VERSION + BytecodeViewer.nl + BytecodeViewer.nl + sw;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!BytecodeViewer.FAT_JAR) {
|
if (!FAT_JAR) {
|
||||||
try {
|
try {
|
||||||
ProcessBuilder pb = new ProcessBuilder(ArrayUtils.addAll(
|
ProcessBuilder pb = new ProcessBuilder(ArrayUtils.addAll(
|
||||||
new String[]{BytecodeViewer.getJavaCommand(), "-jar", Resources.findLibrary("fernflower")},
|
new String[]{BytecodeViewer.getJavaCommand(), "-jar", Resources.findLibrary("fernflower")},
|
||||||
generateMainMethod(tempClass.getAbsolutePath(),
|
generateMainMethod(tempClass.getAbsolutePath(),
|
||||||
new File(BytecodeViewer.tempDirectory).getAbsolutePath())
|
new File(tempDirectory).getAbsolutePath())
|
||||||
));
|
));
|
||||||
BytecodeViewer.sm.stopBlocking();
|
BytecodeViewer.sm.stopBlocking();
|
||||||
Process p = pb.start();
|
Process p = pb.start();
|
||||||
|
@ -100,15 +97,12 @@ public class FernFlowerDecompiler extends Decompiler {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler.main(generateMainMethod(tempClass.getAbsolutePath(),
|
org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler.main(generateMainMethod(tempClass.getAbsolutePath(), new File(tempDirectory).getAbsolutePath()));
|
||||||
new File(BytecodeViewer.tempDirectory).getAbsolutePath()));
|
|
||||||
} catch (StackOverflowError | Exception e) {
|
} catch (StackOverflowError | Exception e) {
|
||||||
StringWriter sw = new StringWriter();
|
StringWriter sw = new StringWriter();
|
||||||
e.printStackTrace(new PrintWriter(sw));
|
e.printStackTrace(new PrintWriter(sw));
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
exception = "Bytecode Viewer Version: " + VERSION + nl + nl + sw;
|
||||||
exception =
|
|
||||||
"Bytecode Viewer Version: " + BytecodeViewer.VERSION + BytecodeViewer.nl + BytecodeViewer.nl + sw;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,10 +122,12 @@ public class FernFlowerDecompiler extends Decompiler {
|
||||||
e.printStackTrace(new PrintWriter(sw));
|
e.printStackTrace(new PrintWriter(sw));
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
||||||
exception += BytecodeViewer.nl + BytecodeViewer.nl + sw;
|
exception += nl + nl + sw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "FernFlower error! Send the stacktrace to Konloch at https://the.bytecode.club or konloch@gmail.com" + BytecodeViewer.nl + BytecodeViewer.nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler." + BytecodeViewer.nl + BytecodeViewer.nl + exception;
|
return "FernFlower error! Send the stacktrace to Konloch at https://the.bytecode.club or konloch@gmail.com"
|
||||||
|
+ nl + nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler."
|
||||||
|
+ nl + nl + exception;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String[] generateMainMethod(String className, String folder) {
|
private String[] generateMainMethod(String className, String folder) {
|
||||||
|
|
|
@ -14,6 +14,8 @@ import org.objectweb.asm.tree.ClassNode;
|
||||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -40,16 +42,14 @@ import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
||||||
public class JADXDecompiler extends Decompiler {
|
public class JADXDecompiler extends Decompiler {
|
||||||
@Override
|
@Override
|
||||||
public String decompileClassNode(ClassNode cn, byte[] b) {
|
public String decompileClassNode(ClassNode cn, byte[] b) {
|
||||||
String fileStart = BytecodeViewer.tempDirectory + BytecodeViewer.fs;
|
String fileStart = tempDirectory + fs;
|
||||||
|
|
||||||
String exception = "";
|
String exception = "";
|
||||||
final File tempClass = new File(MiscUtils.getUniqueName(fileStart, ".class") + ".class");
|
final File tempClass = new File(MiscUtils.getUniqueName(fileStart, ".class") + ".class");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final FileOutputStream fos = new FileOutputStream(tempClass);
|
final FileOutputStream fos = new FileOutputStream(tempClass);
|
||||||
|
|
||||||
fos.write(b);
|
fos.write(b);
|
||||||
|
|
||||||
fos.close();
|
fos.close();
|
||||||
} catch (final IOException e) {
|
} catch (final IOException e) {
|
||||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||||
|
@ -68,9 +68,7 @@ public class JADXDecompiler extends Decompiler {
|
||||||
StringWriter sw = new StringWriter();
|
StringWriter sw = new StringWriter();
|
||||||
e.printStackTrace(new PrintWriter(sw));
|
e.printStackTrace(new PrintWriter(sw));
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
exception = "Bytecode Viewer Version: " + VERSION + nl + nl + sw;
|
||||||
exception =
|
|
||||||
"Bytecode Viewer Version: " + BytecodeViewer.VERSION + BytecodeViewer.nl + BytecodeViewer.nl + sw;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tempClass.delete();
|
tempClass.delete();
|
||||||
|
@ -78,7 +76,9 @@ public class JADXDecompiler extends Decompiler {
|
||||||
if (fuckery.exists())
|
if (fuckery.exists())
|
||||||
return findFile(Objects.requireNonNull(fuckery.listFiles()));
|
return findFile(Objects.requireNonNull(fuckery.listFiles()));
|
||||||
|
|
||||||
return "JADX error! Send the stacktrace to Konloch at https://the.bytecode.club or konloch@gmail.com" + BytecodeViewer.nl + BytecodeViewer.nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler." + BytecodeViewer.nl + BytecodeViewer.nl + exception;
|
return "JADX error! Send the stacktrace to Konloch at https://the.bytecode.club or konloch@gmail.com"
|
||||||
|
+ nl + nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler."
|
||||||
|
+ nl + nl + exception;
|
||||||
}
|
}
|
||||||
|
|
||||||
Random r = new Random();
|
Random r = new Random();
|
||||||
|
@ -104,17 +104,16 @@ public class JADXDecompiler extends Decompiler {
|
||||||
StringWriter sw = new StringWriter();
|
StringWriter sw = new StringWriter();
|
||||||
e.printStackTrace(new PrintWriter(sw));
|
e.printStackTrace(new PrintWriter(sw));
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
String exception = "Bytecode Viewer Version: " + VERSION + nl + nl + sw;
|
||||||
|
|
||||||
String exception =
|
|
||||||
"Bytecode Viewer Version: " + BytecodeViewer.VERSION + BytecodeViewer.nl + BytecodeViewer.nl + sw;
|
|
||||||
return "JADX error! Send the stacktrace to Konloch at https://the.bytecode.club or konloch@gmail"
|
return "JADX error! Send the stacktrace to Konloch at https://the.bytecode.club or konloch@gmail"
|
||||||
+ ".com" + BytecodeViewer.nl + BytecodeViewer.nl + "Suggested Fix: Click refresh class, "
|
+ ".com" + nl + nl + "Suggested Fix: Click refresh class, "
|
||||||
+ "if it fails again try another decompiler." + BytecodeViewer.nl + BytecodeViewer.nl + exception;
|
+ "if it fails again try another decompiler." + nl + nl + exception;
|
||||||
}
|
}
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "CFR error!" + BytecodeViewer.nl + BytecodeViewer.nl + "Suggested Fix: Click refresh class, if it "
|
return "CFR error!" + nl + nl + "Suggested Fix: Click refresh class, if it "
|
||||||
+ "fails again try another decompiler.";
|
+ "fails again try another decompiler.";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,8 +14,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.BytecodeViewer;
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
|
import the.bytecode.club.bytecodeviewer.Constants;
|
||||||
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -47,17 +50,17 @@ public class JDGUIDecompiler extends Decompiler {
|
||||||
public String decompileClassNode(ClassNode cn, byte[] b) {
|
public String decompileClassNode(ClassNode cn, byte[] b) {
|
||||||
String exception;
|
String exception;
|
||||||
try {
|
try {
|
||||||
final File tempDirectory =
|
final File tempDirectory = new File(Constants.tempDirectory + fs + MiscUtils.randomString(32) + fs);
|
||||||
new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + MiscUtils.randomString(32) + BytecodeViewer.fs);
|
|
||||||
tempDirectory.mkdir();
|
tempDirectory.mkdir();
|
||||||
final File tempClass = new File(tempDirectory.getAbsolutePath() + BytecodeViewer.fs + cn.name + ".class");
|
|
||||||
final File tempJava = new File(tempDirectory.getAbsolutePath() + BytecodeViewer.fs + cn.name + ".java");
|
final File tempClass = new File(tempDirectory.getAbsolutePath() + fs + cn.name + ".class");
|
||||||
|
final File tempJava = new File(tempDirectory.getAbsolutePath() + fs + cn.name + ".java");
|
||||||
|
|
||||||
if (cn.name.contains("/")) {
|
if (cn.name.contains("/")) {
|
||||||
String[] raw = cn.name.split("/");
|
String[] raw = cn.name.split("/");
|
||||||
String path = tempDirectory.getAbsolutePath() + BytecodeViewer.fs;
|
String path = tempDirectory.getAbsolutePath() + fs;
|
||||||
for (int i = 0; i < raw.length - 1; i++) {
|
for (int i = 0; i < raw.length - 1; i++) {
|
||||||
path += raw[i] + BytecodeViewer.fs;
|
path += raw[i] + fs;
|
||||||
File f = new File(path);
|
File f = new File(path);
|
||||||
f.mkdir();
|
f.mkdir();
|
||||||
}
|
}
|
||||||
|
@ -65,19 +68,15 @@ public class JDGUIDecompiler extends Decompiler {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final FileOutputStream fos = new FileOutputStream(tempClass);
|
final FileOutputStream fos = new FileOutputStream(tempClass);
|
||||||
|
|
||||||
fos.write(b);
|
fos.write(b);
|
||||||
|
|
||||||
fos.close();
|
fos.close();
|
||||||
} catch (final IOException e) {
|
} catch (final IOException e) {
|
||||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
String pathToClass = tempClass.getAbsolutePath().replace('/', File.separatorChar).replace('\\',
|
String pathToClass = tempClass.getAbsolutePath().replace('/', File.separatorChar).replace('\\', File.separatorChar);
|
||||||
File.separatorChar);
|
|
||||||
String directoryPath = ClassFileUtil.ExtractDirectoryPath(pathToClass);
|
String directoryPath = ClassFileUtil.ExtractDirectoryPath(pathToClass);
|
||||||
|
|
||||||
String internalPath = ClassFileUtil.ExtractInternalPath(directoryPath, pathToClass);
|
String internalPath = ClassFileUtil.ExtractInternalPath(directoryPath, pathToClass);
|
||||||
|
|
||||||
CommonPreferences preferences = new CommonPreferences() {
|
CommonPreferences preferences = new CommonPreferences() {
|
||||||
|
@ -112,9 +111,12 @@ public class JDGUIDecompiler extends Decompiler {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
||||||
exception =
|
exception =
|
||||||
"Bytecode Viewer Version: " + BytecodeViewer.VERSION + BytecodeViewer.nl + BytecodeViewer.nl + sw;
|
"Bytecode Viewer Version: " + VERSION + nl + nl + sw;
|
||||||
}
|
}
|
||||||
return "JD-GUI error! Send the stacktrace to Konloch at https://the.bytecode.club or konloch@gmail.com" + BytecodeViewer.nl + BytecodeViewer.nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler." + BytecodeViewer.nl + BytecodeViewer.nl + exception;
|
|
||||||
|
return "JD-GUI error! Send the stacktrace to Konloch at https://the.bytecode.club or konloch@gmail.com"
|
||||||
|
+ nl + nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler."
|
||||||
|
+ nl + nl + exception;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -9,9 +9,11 @@ import java.io.StringWriter;
|
||||||
import me.konloch.kontainer.io.DiskReader;
|
import me.konloch.kontainer.io.DiskReader;
|
||||||
import org.objectweb.asm.tree.ClassNode;
|
import org.objectweb.asm.tree.ClassNode;
|
||||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
|
import the.bytecode.club.bytecodeviewer.Constants;
|
||||||
import the.bytecode.club.bytecodeviewer.util.JarUtils;
|
import the.bytecode.club.bytecodeviewer.util.JarUtils;
|
||||||
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
||||||
import the.bytecode.club.bytecodeviewer.util.ZipUtils;
|
import the.bytecode.club.bytecodeviewer.util.ZipUtils;
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
|
@ -69,15 +71,15 @@ public class KrakatauDecompiler extends Decompiler {
|
||||||
return "Set your paths";
|
return "Set your paths";
|
||||||
}
|
}
|
||||||
|
|
||||||
String s = "Bytecode Viewer Version: " + BytecodeViewer.VERSION + BytecodeViewer.nl + BytecodeViewer.nl +
|
String s = "Bytecode Viewer Version: " + VERSION + nl + nl +
|
||||||
"Please send this to konloch@gmail.com. " + BytecodeViewer.nl + BytecodeViewer.nl;
|
"Please send this to konloch@gmail.com. " + nl + nl;
|
||||||
|
|
||||||
BytecodeViewer.sm.stopBlocking();
|
BytecodeViewer.sm.stopBlocking();
|
||||||
try {
|
try {
|
||||||
ProcessBuilder pb = new ProcessBuilder(
|
ProcessBuilder pb = new ProcessBuilder(
|
||||||
BytecodeViewer.python,
|
BytecodeViewer.python,
|
||||||
"-O", //love you storyyeller <3
|
"-O", //love you storyyeller <3
|
||||||
BytecodeViewer.krakatauWorkingDirectory + BytecodeViewer.fs + "decompile.py",
|
krakatauWorkingDirectory + fs + "decompile.py",
|
||||||
"-skip", //love you storyyeller <3
|
"-skip", //love you storyyeller <3
|
||||||
"-nauto",
|
"-nauto",
|
||||||
"-path",
|
"-path",
|
||||||
|
@ -94,34 +96,33 @@ public class KrakatauDecompiler extends Decompiler {
|
||||||
InputStream is = process.getInputStream();
|
InputStream is = process.getInputStream();
|
||||||
InputStreamReader isr = new InputStreamReader(is);
|
InputStreamReader isr = new InputStreamReader(is);
|
||||||
BufferedReader br = new BufferedReader(isr);
|
BufferedReader br = new BufferedReader(isr);
|
||||||
StringBuilder log = new StringBuilder("Process:" + BytecodeViewer.nl + BytecodeViewer.nl);
|
StringBuilder log = new StringBuilder("Process:" + nl + nl);
|
||||||
String line;
|
String line;
|
||||||
while ((line = br.readLine()) != null) {
|
while ((line = br.readLine()) != null) {
|
||||||
log.append(BytecodeViewer.nl).append(line);
|
log.append(nl).append(line);
|
||||||
}
|
}
|
||||||
br.close();
|
br.close();
|
||||||
|
|
||||||
log.append(BytecodeViewer.nl).append(BytecodeViewer.nl).append("Error:").append(BytecodeViewer.nl)
|
log.append(nl).append(nl).append("Error:").append(nl).append(nl);
|
||||||
.append(BytecodeViewer.nl);
|
|
||||||
is = process.getErrorStream();
|
is = process.getErrorStream();
|
||||||
isr = new InputStreamReader(is);
|
isr = new InputStreamReader(is);
|
||||||
br = new BufferedReader(isr);
|
br = new BufferedReader(isr);
|
||||||
while ((line = br.readLine()) != null) {
|
while ((line = br.readLine()) != null) {
|
||||||
log.append(BytecodeViewer.nl).append(line);
|
log.append(nl).append(line);
|
||||||
}
|
}
|
||||||
br.close();
|
br.close();
|
||||||
|
|
||||||
int exitValue = process.waitFor();
|
int exitValue = process.waitFor();
|
||||||
log.append(BytecodeViewer.nl).append(BytecodeViewer.nl).append("Exit Value is ").append(exitValue);
|
log.append(nl).append(nl).append("Exit Value is ").append(exitValue);
|
||||||
s = log.toString();
|
s = log.toString();
|
||||||
|
|
||||||
//if the motherfucker failed this'll fail, aka wont set.
|
//if the motherfucker failed this'll fail, aka wont set.
|
||||||
s = DiskReader.loadAsString(krakatauTempDir.getAbsolutePath() + BytecodeViewer.fs + cn.name + ".java");
|
s = DiskReader.loadAsString(krakatauTempDir.getAbsolutePath() + fs + cn.name + ".java");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
StringWriter sw = new StringWriter();
|
StringWriter sw = new StringWriter();
|
||||||
e.printStackTrace(new PrintWriter(sw));
|
e.printStackTrace(new PrintWriter(sw));
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
s += BytecodeViewer.nl + "Bytecode Viewer Version: " + BytecodeViewer.VERSION + BytecodeViewer.nl + BytecodeViewer.nl + sw;
|
s += nl + "Bytecode Viewer Version: " + VERSION + nl + nl + sw;
|
||||||
} finally {
|
} finally {
|
||||||
BytecodeViewer.sm.setBlocking();
|
BytecodeViewer.sm.setBlocking();
|
||||||
}
|
}
|
||||||
|
@ -151,15 +152,13 @@ public class KrakatauDecompiler extends Decompiler {
|
||||||
return "Set your paths";
|
return "Set your paths";
|
||||||
}
|
}
|
||||||
|
|
||||||
String s = "Bytecode Viewer Version: " + BytecodeViewer.VERSION + BytecodeViewer.nl + BytecodeViewer.nl +
|
String s = "Bytecode Viewer Version: " + VERSION + nl + nl +
|
||||||
"Please send this to konloch@gmail.com. " + BytecodeViewer.nl + BytecodeViewer.nl;
|
"Please send this to konloch@gmail.com. " + nl + nl;
|
||||||
|
|
||||||
final File tempDirectory =
|
final File tempDirectory = new File(Constants.tempDirectory + fs + MiscUtils.randomString(32) + fs);
|
||||||
new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + MiscUtils.randomString(32) + BytecodeViewer.fs);
|
|
||||||
tempDirectory.mkdir();
|
tempDirectory.mkdir();
|
||||||
final File tempJar =
|
final File tempJar = new File(Constants.tempDirectory + fs + "temp" + MiscUtils.randomString(32) + ".jar");
|
||||||
new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + "temp" + MiscUtils.randomString(32) +
|
|
||||||
".jar");
|
|
||||||
JarUtils.saveAsJarClassesOnly(BytecodeViewer.getLoadedClasses(), tempJar.getAbsolutePath());
|
JarUtils.saveAsJarClassesOnly(BytecodeViewer.getLoadedClasses(), tempJar.getAbsolutePath());
|
||||||
|
|
||||||
BytecodeViewer.sm.stopBlocking();
|
BytecodeViewer.sm.stopBlocking();
|
||||||
|
@ -168,7 +167,7 @@ public class KrakatauDecompiler extends Decompiler {
|
||||||
ProcessBuilder pb = new ProcessBuilder(
|
ProcessBuilder pb = new ProcessBuilder(
|
||||||
BytecodeViewer.python,
|
BytecodeViewer.python,
|
||||||
"-O", //love you storyyeller <3
|
"-O", //love you storyyeller <3
|
||||||
BytecodeViewer.krakatauWorkingDirectory + BytecodeViewer.fs + "decompile.py",
|
krakatauWorkingDirectory + fs + "decompile.py",
|
||||||
"-skip", //love you storyyeller <3
|
"-skip", //love you storyyeller <3
|
||||||
"-nauto",
|
"-nauto",
|
||||||
"-path",
|
"-path",
|
||||||
|
@ -185,36 +184,36 @@ public class KrakatauDecompiler extends Decompiler {
|
||||||
InputStream is = process.getInputStream();
|
InputStream is = process.getInputStream();
|
||||||
InputStreamReader isr = new InputStreamReader(is);
|
InputStreamReader isr = new InputStreamReader(is);
|
||||||
BufferedReader br = new BufferedReader(isr);
|
BufferedReader br = new BufferedReader(isr);
|
||||||
StringBuilder log = new StringBuilder("Process:" + BytecodeViewer.nl + BytecodeViewer.nl);
|
StringBuilder log = new StringBuilder("Process:" + nl + nl);
|
||||||
String line;
|
String line;
|
||||||
while ((line = br.readLine()) != null) {
|
while ((line = br.readLine()) != null) {
|
||||||
log.append(BytecodeViewer.nl).append(line);
|
log.append(nl).append(line);
|
||||||
}
|
}
|
||||||
br.close();
|
br.close();
|
||||||
|
|
||||||
log.append(BytecodeViewer.nl).append(BytecodeViewer.nl).append("Error:").append(BytecodeViewer.nl)
|
log.append(nl).append(nl).append("Error:").append(nl)
|
||||||
.append(BytecodeViewer.nl);
|
.append(nl);
|
||||||
is = process.getErrorStream();
|
is = process.getErrorStream();
|
||||||
isr = new InputStreamReader(is);
|
isr = new InputStreamReader(is);
|
||||||
br = new BufferedReader(isr);
|
br = new BufferedReader(isr);
|
||||||
while ((line = br.readLine()) != null) {
|
while ((line = br.readLine()) != null) {
|
||||||
log.append(BytecodeViewer.nl).append(line);
|
log.append(nl).append(line);
|
||||||
}
|
}
|
||||||
br.close();
|
br.close();
|
||||||
|
|
||||||
int exitValue = process.waitFor();
|
int exitValue = process.waitFor();
|
||||||
log.append(BytecodeViewer.nl).append(BytecodeViewer.nl).append("Exit Value is ").append(exitValue);
|
log.append(nl).append(nl).append("Exit Value is ").append(exitValue);
|
||||||
s = log.toString();
|
s = log.toString();
|
||||||
|
|
||||||
//if the motherfucker failed this'll fail, aka wont set.
|
//if the motherfucker failed this'll fail, aka wont set.
|
||||||
s = DiskReader.loadAsString(tempDirectory.getAbsolutePath() + BytecodeViewer.fs + cn.name + ".java");
|
s = DiskReader.loadAsString(tempDirectory.getAbsolutePath() + fs + cn.name + ".java");
|
||||||
tempDirectory.delete();
|
tempDirectory.delete();
|
||||||
tempJar.delete();
|
tempJar.delete();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
StringWriter sw = new StringWriter();
|
StringWriter sw = new StringWriter();
|
||||||
e.printStackTrace(new PrintWriter(sw));
|
e.printStackTrace(new PrintWriter(sw));
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
s += BytecodeViewer.nl + "Bytecode Viewer Version: " + BytecodeViewer.VERSION + BytecodeViewer.nl + BytecodeViewer.nl + sw;
|
s += nl + "Bytecode Viewer Version: " + VERSION + nl + nl + sw;
|
||||||
} finally {
|
} finally {
|
||||||
BytecodeViewer.sm.setBlocking();
|
BytecodeViewer.sm.setBlocking();
|
||||||
}
|
}
|
||||||
|
@ -236,7 +235,7 @@ public class KrakatauDecompiler extends Decompiler {
|
||||||
}
|
}
|
||||||
|
|
||||||
String ran = MiscUtils.randomString(32);
|
String ran = MiscUtils.randomString(32);
|
||||||
final File tempDirectory = new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + ran + BytecodeViewer.fs);
|
final File tempDirectory = new File(Constants.tempDirectory + fs + ran + fs);
|
||||||
tempDirectory.mkdir();
|
tempDirectory.mkdir();
|
||||||
|
|
||||||
|
|
||||||
|
@ -248,7 +247,7 @@ public class KrakatauDecompiler extends Decompiler {
|
||||||
ProcessBuilder pb = new ProcessBuilder(
|
ProcessBuilder pb = new ProcessBuilder(
|
||||||
BytecodeViewer.python,
|
BytecodeViewer.python,
|
||||||
"-O", //love you storyyeller <3
|
"-O", //love you storyyeller <3
|
||||||
BytecodeViewer.krakatauWorkingDirectory + BytecodeViewer.fs + "decompile.py",
|
krakatauWorkingDirectory + fs + "decompile.py",
|
||||||
"-skip", //love you storyyeller <3
|
"-skip", //love you storyyeller <3
|
||||||
"-nauto",
|
"-nauto",
|
||||||
"-path",
|
"-path",
|
||||||
|
|
|
@ -9,10 +9,13 @@ import java.io.StringWriter;
|
||||||
import me.konloch.kontainer.io.DiskReader;
|
import me.konloch.kontainer.io.DiskReader;
|
||||||
import org.objectweb.asm.tree.ClassNode;
|
import org.objectweb.asm.tree.ClassNode;
|
||||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
|
import the.bytecode.club.bytecodeviewer.Constants;
|
||||||
import the.bytecode.club.bytecodeviewer.util.JarUtils;
|
import the.bytecode.club.bytecodeviewer.util.JarUtils;
|
||||||
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
||||||
import the.bytecode.club.bytecodeviewer.util.ZipUtils;
|
import the.bytecode.club.bytecodeviewer.util.ZipUtils;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -50,15 +53,15 @@ public class KrakatauDisassembler extends Decompiler {
|
||||||
return "Set your paths";
|
return "Set your paths";
|
||||||
}
|
}
|
||||||
|
|
||||||
String s = "Bytecode Viewer Version: " + BytecodeViewer.VERSION + BytecodeViewer.nl + BytecodeViewer.nl +
|
String s = "Bytecode Viewer Version: " + VERSION + nl + nl +
|
||||||
"Please send this to konloch@gmail.com. " + BytecodeViewer.nl + BytecodeViewer.nl;
|
"Please send this to konloch@gmail.com. " + nl + nl;
|
||||||
|
|
||||||
BytecodeViewer.sm.stopBlocking();
|
BytecodeViewer.sm.stopBlocking();
|
||||||
try {
|
try {
|
||||||
ProcessBuilder pb = new ProcessBuilder(
|
ProcessBuilder pb = new ProcessBuilder(
|
||||||
BytecodeViewer.python,
|
BytecodeViewer.python,
|
||||||
"-O", //love you storyyeller <3
|
"-O", //love you storyyeller <3
|
||||||
BytecodeViewer.krakatauWorkingDirectory + BytecodeViewer.fs + "disassemble.py",
|
krakatauWorkingDirectory + fs + "disassemble.py",
|
||||||
"-path",
|
"-path",
|
||||||
krakatauTempJar.getAbsolutePath(),
|
krakatauTempJar.getAbsolutePath(),
|
||||||
"-out",
|
"-out",
|
||||||
|
@ -73,34 +76,34 @@ public class KrakatauDisassembler extends Decompiler {
|
||||||
InputStream is = process.getInputStream();
|
InputStream is = process.getInputStream();
|
||||||
InputStreamReader isr = new InputStreamReader(is);
|
InputStreamReader isr = new InputStreamReader(is);
|
||||||
BufferedReader br = new BufferedReader(isr);
|
BufferedReader br = new BufferedReader(isr);
|
||||||
StringBuilder log = new StringBuilder("Process:" + BytecodeViewer.nl + BytecodeViewer.nl);
|
StringBuilder log = new StringBuilder("Process:" + nl + nl);
|
||||||
String line;
|
String line;
|
||||||
while ((line = br.readLine()) != null) {
|
while ((line = br.readLine()) != null) {
|
||||||
log.append(BytecodeViewer.nl).append(line);
|
log.append(nl).append(line);
|
||||||
}
|
}
|
||||||
br.close();
|
br.close();
|
||||||
|
|
||||||
log.append(BytecodeViewer.nl).append(BytecodeViewer.nl).append("Error:").append(BytecodeViewer.nl)
|
log.append(nl).append(nl).append("Error:").append(nl)
|
||||||
.append(BytecodeViewer.nl);
|
.append(nl);
|
||||||
is = process.getErrorStream();
|
is = process.getErrorStream();
|
||||||
isr = new InputStreamReader(is);
|
isr = new InputStreamReader(is);
|
||||||
br = new BufferedReader(isr);
|
br = new BufferedReader(isr);
|
||||||
while ((line = br.readLine()) != null) {
|
while ((line = br.readLine()) != null) {
|
||||||
log.append(BytecodeViewer.nl).append(line);
|
log.append(nl).append(line);
|
||||||
}
|
}
|
||||||
br.close();
|
br.close();
|
||||||
|
|
||||||
int exitValue = process.waitFor();
|
int exitValue = process.waitFor();
|
||||||
log.append(BytecodeViewer.nl).append(BytecodeViewer.nl).append("Exit Value is ").append(exitValue);
|
log.append(nl).append(nl).append("Exit Value is ").append(exitValue);
|
||||||
s = log.toString();
|
s = log.toString();
|
||||||
|
|
||||||
//if the motherfucker failed this'll fail, aka wont set.
|
//if the motherfucker failed this'll fail, aka wont set.
|
||||||
s = DiskReader.loadAsString(krakatauTempDir.getAbsolutePath() + BytecodeViewer.fs + cn.name + ".j");
|
s = DiskReader.loadAsString(krakatauTempDir.getAbsolutePath() + fs + cn.name + ".j");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
StringWriter sw = new StringWriter();
|
StringWriter sw = new StringWriter();
|
||||||
e.printStackTrace(new PrintWriter(sw));
|
e.printStackTrace(new PrintWriter(sw));
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
s += BytecodeViewer.nl + "Bytecode Viewer Version: " + BytecodeViewer.VERSION + BytecodeViewer.nl + BytecodeViewer.nl + sw;
|
s += nl + "Bytecode Viewer Version: " + VERSION + nl + nl + sw;
|
||||||
} finally {
|
} finally {
|
||||||
BytecodeViewer.sm.setBlocking();
|
BytecodeViewer.sm.setBlocking();
|
||||||
}
|
}
|
||||||
|
@ -119,15 +122,12 @@ public class KrakatauDisassembler extends Decompiler {
|
||||||
return "Set your paths";
|
return "Set your paths";
|
||||||
}
|
}
|
||||||
|
|
||||||
String s = "Bytecode Viewer Version: " + BytecodeViewer.VERSION + BytecodeViewer.nl + BytecodeViewer.nl +
|
String s = "Bytecode Viewer Version: " + VERSION + nl + nl +
|
||||||
"Please send this to konloch@gmail.com. " + BytecodeViewer.nl + BytecodeViewer.nl;
|
"Please send this to konloch@gmail.com. " + nl + nl;
|
||||||
|
|
||||||
final File tempDirectory =
|
final File tempDirectory = new File(Constants.tempDirectory + fs + MiscUtils.randomString(32) + fs);
|
||||||
new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + MiscUtils.randomString(32) + BytecodeViewer.fs);
|
|
||||||
tempDirectory.mkdir();
|
tempDirectory.mkdir();
|
||||||
final File tempJar =
|
final File tempJar = new File(Constants.tempDirectory + fs + "temp" + MiscUtils.randomString(32) + ".jar");
|
||||||
new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + "temp" + MiscUtils.randomString(32) +
|
|
||||||
".jar");
|
|
||||||
JarUtils.saveAsJarClassesOnly(BytecodeViewer.getLoadedClasses(), tempJar.getAbsolutePath());
|
JarUtils.saveAsJarClassesOnly(BytecodeViewer.getLoadedClasses(), tempJar.getAbsolutePath());
|
||||||
|
|
||||||
BytecodeViewer.sm.stopBlocking();
|
BytecodeViewer.sm.stopBlocking();
|
||||||
|
@ -135,7 +135,7 @@ public class KrakatauDisassembler extends Decompiler {
|
||||||
ProcessBuilder pb = new ProcessBuilder(
|
ProcessBuilder pb = new ProcessBuilder(
|
||||||
BytecodeViewer.python,
|
BytecodeViewer.python,
|
||||||
"-O", //love you storyyeller <3
|
"-O", //love you storyyeller <3
|
||||||
BytecodeViewer.krakatauWorkingDirectory + BytecodeViewer.fs + "disassemble.py",
|
krakatauWorkingDirectory + fs + "disassemble.py",
|
||||||
"-path",
|
"-path",
|
||||||
tempJar.getAbsolutePath(),
|
tempJar.getAbsolutePath(),
|
||||||
"-out",
|
"-out",
|
||||||
|
@ -150,34 +150,33 @@ public class KrakatauDisassembler extends Decompiler {
|
||||||
InputStream is = process.getInputStream();
|
InputStream is = process.getInputStream();
|
||||||
InputStreamReader isr = new InputStreamReader(is);
|
InputStreamReader isr = new InputStreamReader(is);
|
||||||
BufferedReader br = new BufferedReader(isr);
|
BufferedReader br = new BufferedReader(isr);
|
||||||
StringBuilder log = new StringBuilder("Process:" + BytecodeViewer.nl + BytecodeViewer.nl);
|
StringBuilder log = new StringBuilder("Process:" + nl + nl);
|
||||||
String line;
|
String line;
|
||||||
while ((line = br.readLine()) != null) {
|
while ((line = br.readLine()) != null) {
|
||||||
log.append(BytecodeViewer.nl).append(line);
|
log.append(nl).append(line);
|
||||||
}
|
}
|
||||||
br.close();
|
br.close();
|
||||||
|
|
||||||
log.append(BytecodeViewer.nl).append(BytecodeViewer.nl).append("Error:").append(BytecodeViewer.nl)
|
log.append(nl).append(nl).append("Error:").append(nl).append(nl);
|
||||||
.append(BytecodeViewer.nl);
|
|
||||||
is = process.getErrorStream();
|
is = process.getErrorStream();
|
||||||
isr = new InputStreamReader(is);
|
isr = new InputStreamReader(is);
|
||||||
br = new BufferedReader(isr);
|
br = new BufferedReader(isr);
|
||||||
while ((line = br.readLine()) != null) {
|
while ((line = br.readLine()) != null) {
|
||||||
log.append(BytecodeViewer.nl).append(line);
|
log.append(nl).append(line);
|
||||||
}
|
}
|
||||||
br.close();
|
br.close();
|
||||||
|
|
||||||
int exitValue = process.waitFor();
|
int exitValue = process.waitFor();
|
||||||
log.append(BytecodeViewer.nl).append(BytecodeViewer.nl).append("Exit Value is ").append(exitValue);
|
log.append(nl).append(nl).append("Exit Value is ").append(exitValue);
|
||||||
s = log.toString();
|
s = log.toString();
|
||||||
|
|
||||||
//if the motherfucker failed this'll fail, aka wont set.
|
//if the motherfucker failed this'll fail, aka wont set.
|
||||||
s = DiskReader.loadAsString(tempDirectory.getAbsolutePath() + BytecodeViewer.fs + cn.name + ".j");
|
s = DiskReader.loadAsString(tempDirectory.getAbsolutePath() + fs + cn.name + ".j");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
StringWriter sw = new StringWriter();
|
StringWriter sw = new StringWriter();
|
||||||
e.printStackTrace(new PrintWriter(sw));
|
e.printStackTrace(new PrintWriter(sw));
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
s += BytecodeViewer.nl + "Bytecode Viewer Version: " + BytecodeViewer.VERSION + BytecodeViewer.nl + BytecodeViewer.nl + sw;
|
s += nl + "Bytecode Viewer Version: " + VERSION + nl + nl + sw;
|
||||||
} finally {
|
} finally {
|
||||||
BytecodeViewer.sm.setBlocking();
|
BytecodeViewer.sm.setBlocking();
|
||||||
}
|
}
|
||||||
|
@ -192,7 +191,7 @@ public class KrakatauDisassembler extends Decompiler {
|
||||||
}
|
}
|
||||||
|
|
||||||
String ran = MiscUtils.randomString(32);
|
String ran = MiscUtils.randomString(32);
|
||||||
final File tempDirectory = new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + ran + BytecodeViewer.fs);
|
final File tempDirectory = new File(Constants.tempDirectory + fs + ran + fs);
|
||||||
tempDirectory.mkdir();
|
tempDirectory.mkdir();
|
||||||
|
|
||||||
final File tempJar = new File(sourceJar);
|
final File tempJar = new File(sourceJar);
|
||||||
|
@ -202,7 +201,7 @@ public class KrakatauDisassembler extends Decompiler {
|
||||||
ProcessBuilder pb = new ProcessBuilder(
|
ProcessBuilder pb = new ProcessBuilder(
|
||||||
BytecodeViewer.python,
|
BytecodeViewer.python,
|
||||||
"-O", //love you storyyeller <3
|
"-O", //love you storyyeller <3
|
||||||
BytecodeViewer.krakatauWorkingDirectory + BytecodeViewer.fs + "disassemble.py",
|
krakatauWorkingDirectory + fs + "disassemble.py",
|
||||||
"-path",
|
"-path",
|
||||||
BytecodeViewer.rt + ";" + tempJar.getAbsolutePath(),
|
BytecodeViewer.rt + ";" + tempJar.getAbsolutePath(),
|
||||||
"-out",
|
"-out",
|
||||||
|
|
|
@ -35,6 +35,8 @@ import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
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.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -59,39 +61,24 @@ import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
||||||
* @author Konloch
|
* @author Konloch
|
||||||
* @author DeathMarine
|
* @author DeathMarine
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class ProcyonDecompiler extends Decompiler {
|
public class ProcyonDecompiler extends Decompiler {
|
||||||
|
|
||||||
public DecompilerSettings getDecompilerSettings() {
|
public DecompilerSettings getDecompilerSettings() {
|
||||||
DecompilerSettings settings = new DecompilerSettings();
|
DecompilerSettings settings = new DecompilerSettings();
|
||||||
settings.setAlwaysGenerateExceptionVariableForCatchBlocks(BytecodeViewer.viewer.chckbxmntmNewCheckItem_6
|
settings.setAlwaysGenerateExceptionVariableForCatchBlocks(BytecodeViewer.viewer.chckbxmntmNewCheckItem_6.isSelected());
|
||||||
.isSelected());
|
settings.setExcludeNestedTypes(BytecodeViewer.viewer.chckbxmntmNewCheckItem_11.isSelected());
|
||||||
settings.setExcludeNestedTypes(BytecodeViewer.viewer.chckbxmntmNewCheckItem_11
|
settings.setShowDebugLineNumbers(BytecodeViewer.viewer.chckbxmntmShowDebugLine.isSelected());
|
||||||
.isSelected());
|
settings.setIncludeLineNumbersInBytecode(BytecodeViewer.viewer.chckbxmntmNewCheckItem_3.isSelected());
|
||||||
settings.setShowDebugLineNumbers(BytecodeViewer.viewer.chckbxmntmShowDebugLine
|
settings.setIncludeErrorDiagnostics(BytecodeViewer.viewer.chckbxmntmNewCheckItem_4.isSelected());
|
||||||
.isSelected());
|
settings.setShowSyntheticMembers(BytecodeViewer.viewer.chckbxmntmNewCheckItem_7.isSelected());
|
||||||
settings.setIncludeLineNumbersInBytecode(BytecodeViewer.viewer.chckbxmntmNewCheckItem_3
|
settings.setSimplifyMemberReferences(BytecodeViewer.viewer.chckbxmntmSimplifyMemberReferences.isSelected());
|
||||||
.isSelected());
|
settings.setMergeVariables(BytecodeViewer.viewer.mnMergeVariables.isSelected());
|
||||||
settings.setIncludeErrorDiagnostics(BytecodeViewer.viewer.chckbxmntmNewCheckItem_4
|
settings.setForceExplicitTypeArguments(BytecodeViewer.viewer.chckbxmntmNewCheckItem_8.isSelected());
|
||||||
.isSelected());
|
settings.setForceExplicitImports(BytecodeViewer.viewer.chckbxmntmNewCheckItem_9.isSelected());
|
||||||
settings.setShowSyntheticMembers(BytecodeViewer.viewer.chckbxmntmNewCheckItem_7
|
settings.setFlattenSwitchBlocks(BytecodeViewer.viewer.chckbxmntmNewCheckItem_10.isSelected());
|
||||||
.isSelected());
|
settings.setRetainPointlessSwitches(BytecodeViewer.viewer.chckbxmntmNewCheckItem_2.isSelected());
|
||||||
settings.setSimplifyMemberReferences(BytecodeViewer.viewer.chckbxmntmSimplifyMemberReferences
|
settings.setRetainRedundantCasts(BytecodeViewer.viewer.chckbxmntmNewCheckItem_5.isSelected());
|
||||||
.isSelected());
|
settings.setUnicodeOutputEnabled(BytecodeViewer.viewer.chckbxmntmNewCheckItem_1.isSelected());
|
||||||
settings.setMergeVariables(BytecodeViewer.viewer.mnMergeVariables
|
|
||||||
.isSelected());
|
|
||||||
settings.setForceExplicitTypeArguments(BytecodeViewer.viewer.chckbxmntmNewCheckItem_8
|
|
||||||
.isSelected());
|
|
||||||
settings.setForceExplicitImports(BytecodeViewer.viewer.chckbxmntmNewCheckItem_9
|
|
||||||
.isSelected());
|
|
||||||
settings.setFlattenSwitchBlocks(BytecodeViewer.viewer.chckbxmntmNewCheckItem_10
|
|
||||||
.isSelected());
|
|
||||||
settings.setRetainPointlessSwitches(BytecodeViewer.viewer.chckbxmntmNewCheckItem_2
|
|
||||||
.isSelected());
|
|
||||||
settings.setRetainRedundantCasts(BytecodeViewer.viewer.chckbxmntmNewCheckItem_5
|
|
||||||
.isSelected());
|
|
||||||
settings.setUnicodeOutputEnabled(BytecodeViewer.viewer.chckbxmntmNewCheckItem_1
|
|
||||||
.isSelected());
|
|
||||||
settings.setJavaFormattingOptions(JavaFormattingOptions.createDefault());
|
settings.setJavaFormattingOptions(JavaFormattingOptions.createDefault());
|
||||||
return settings;
|
return settings;
|
||||||
}
|
}
|
||||||
|
@ -100,8 +87,7 @@ public class ProcyonDecompiler extends Decompiler {
|
||||||
public String decompileClassNode(ClassNode cn, byte[] b) {
|
public String decompileClassNode(ClassNode cn, byte[] b) {
|
||||||
String exception;
|
String exception;
|
||||||
try {
|
try {
|
||||||
String fileStart = BytecodeViewer.tempDirectory + BytecodeViewer.fs
|
String fileStart = tempDirectory + fs + "temp";
|
||||||
+ "temp";
|
|
||||||
|
|
||||||
final File tempClass = new File(MiscUtils.getUniqueName(fileStart, ".class") + ".class");
|
final File tempClass = new File(MiscUtils.getUniqueName(fileStart, ".class") + ".class");
|
||||||
|
|
||||||
|
@ -119,8 +105,7 @@ public class ProcyonDecompiler extends Decompiler {
|
||||||
|
|
||||||
LuytenTypeLoader typeLoader = new LuytenTypeLoader();
|
LuytenTypeLoader typeLoader = new LuytenTypeLoader();
|
||||||
MetadataSystem metadataSystem = new MetadataSystem(typeLoader);
|
MetadataSystem metadataSystem = new MetadataSystem(typeLoader);
|
||||||
TypeReference type = metadataSystem.lookupType(tempClass
|
TypeReference type = metadataSystem.lookupType(tempClass.getCanonicalPath());
|
||||||
.getCanonicalPath());
|
|
||||||
|
|
||||||
DecompilationOptions decompilationOptions = new DecompilationOptions();
|
DecompilationOptions decompilationOptions = new DecompilationOptions();
|
||||||
decompilationOptions.setSettings(settings);
|
decompilationOptions.setSettings(settings);
|
||||||
|
@ -130,6 +115,7 @@ public class ProcyonDecompiler extends Decompiler {
|
||||||
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);
|
||||||
|
|
||||||
|
@ -139,10 +125,11 @@ public class ProcyonDecompiler extends Decompiler {
|
||||||
e.printStackTrace(new PrintWriter(sw));
|
e.printStackTrace(new PrintWriter(sw));
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
||||||
exception =
|
exception = "Bytecode Viewer Version: " + VERSION + nl + nl + sw;
|
||||||
"Bytecode Viewer Version: " + BytecodeViewer.VERSION + BytecodeViewer.nl + BytecodeViewer.nl + sw;
|
|
||||||
}
|
}
|
||||||
return "Procyon error! Send the stacktrace to Konloch at https://the.bytecode.club or konloch@gmail.com" + BytecodeViewer.nl + BytecodeViewer.nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler." + BytecodeViewer.nl + BytecodeViewer.nl + exception;
|
return "Procyon error! Send the stacktrace to Konloch at https://the.bytecode.club or konloch@gmail.com"
|
||||||
|
+ nl + nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler."
|
||||||
|
+ nl + nl + exception;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -14,6 +14,8 @@ 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.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -42,7 +44,7 @@ public class SmaliDisassembler extends Decompiler {
|
||||||
|
|
||||||
public String decompileClassNode(FileContainer container, ClassNode cn, byte[] b) {
|
public String decompileClassNode(FileContainer container, ClassNode cn, byte[] b) {
|
||||||
String exception = "";
|
String exception = "";
|
||||||
String fileStart = BytecodeViewer.tempDirectory + BytecodeViewer.fs + "temp";
|
String fileStart = tempDirectory + fs + "temp";
|
||||||
|
|
||||||
String start = MiscUtils.getUniqueName(fileStart, ".class");
|
String start = MiscUtils.getUniqueName(fileStart, ".class");
|
||||||
|
|
||||||
|
@ -71,7 +73,7 @@ public class SmaliDisassembler extends Decompiler {
|
||||||
e.printStackTrace(new PrintWriter(sw));
|
e.printStackTrace(new PrintWriter(sw));
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
||||||
exception += "Bytecode Viewer Version: " + BytecodeViewer.VERSION + BytecodeViewer.nl + BytecodeViewer.nl + sw;
|
exception += "Bytecode Viewer Version: " + VERSION + nl + nl + sw;
|
||||||
}
|
}
|
||||||
|
|
||||||
File rename = new File(tempDex.getName().replaceFirst("\\.dex", "-out"));
|
File rename = new File(tempDex.getName().replaceFirst("\\.dex", "-out"));
|
||||||
|
@ -83,7 +85,7 @@ public class SmaliDisassembler extends Decompiler {
|
||||||
e.printStackTrace(new PrintWriter(sw));
|
e.printStackTrace(new PrintWriter(sw));
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
||||||
exception += "Bytecode Viewer Version: " + BytecodeViewer.VERSION + BytecodeViewer.nl + BytecodeViewer.nl + sw;
|
exception += "Bytecode Viewer Version: " + VERSION + nl + nl + sw;
|
||||||
}
|
}
|
||||||
|
|
||||||
File outputSmali = null;
|
File outputSmali = null;
|
||||||
|
@ -107,12 +109,12 @@ public class SmaliDisassembler extends Decompiler {
|
||||||
e.printStackTrace(new PrintWriter(sw));
|
e.printStackTrace(new PrintWriter(sw));
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
||||||
exception += "Bytecode Viewer Version: " + BytecodeViewer.VERSION + BytecodeViewer.nl + BytecodeViewer.nl + sw;
|
exception += "Bytecode Viewer Version: " + VERSION + nl + nl + sw;
|
||||||
}
|
}
|
||||||
|
|
||||||
return "Smali Disassembler error! Send the stacktrace to Konloch at https://the.bytecode.club or konloch@gmail"
|
return "Smali Disassembler error! Send the stacktrace to Konloch at https://the.bytecode.club or konloch@gmail.com"
|
||||||
+ ".com" + BytecodeViewer.nl + BytecodeViewer.nl + "Suggested Fix: Click refresh class, if it fails "
|
+ nl + nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler."
|
||||||
+ "again try another decompiler." + BytecodeViewer.nl + BytecodeViewer.nl + exception;
|
+ nl + nl + exception;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -11,6 +11,8 @@ import org.objectweb.asm.tree.MethodNode;
|
||||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
import the.bytecode.club.bytecodeviewer.decompilers.Decompiler;
|
import the.bytecode.club.bytecodeviewer.decompilers.Decompiler;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -65,21 +67,21 @@ public class ClassNodeDecompiler extends Decompiler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sb.append(" {");
|
sb.append(" {");
|
||||||
sb.append(BytecodeViewer.nl);
|
sb.append(nl);
|
||||||
sb.append(" ");
|
sb.append(" ");
|
||||||
sb.append("<ClassVersion=" + cn.version + ">");
|
sb.append("<ClassVersion=" + cn.version + ">");
|
||||||
sb.append(BytecodeViewer.nl);
|
sb.append(nl);
|
||||||
|
|
||||||
if (cn.sourceDebug != null) {
|
if (cn.sourceDebug != null) {
|
||||||
sb.append(" ");
|
sb.append(" ");
|
||||||
sb.append("<SourceDebug=" + cn.sourceDebug + ">");
|
sb.append("<SourceDebug=" + cn.sourceDebug + ">");
|
||||||
sb.append(BytecodeViewer.nl);
|
sb.append(nl);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cn.sourceFile != null) {
|
if (cn.sourceFile != null) {
|
||||||
sb.append(" ");
|
sb.append(" ");
|
||||||
sb.append("<SourceFile=" + cn.sourceFile + ">");
|
sb.append("<SourceFile=" + cn.sourceFile + ">");
|
||||||
sb.append(BytecodeViewer.nl);
|
sb.append(nl);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cn.signature != null) {
|
if (cn.signature != null) {
|
||||||
|
@ -88,15 +90,15 @@ public class ClassNodeDecompiler extends Decompiler {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (FieldNode fn : cn.fields) {
|
for (FieldNode fn : cn.fields) {
|
||||||
sb.append(BytecodeViewer.nl);
|
sb.append(nl);
|
||||||
sb.append(" ");
|
sb.append(" ");
|
||||||
FieldNodeDecompiler.decompile(sb, fn);
|
FieldNodeDecompiler.decompile(sb, fn);
|
||||||
}
|
}
|
||||||
if (cn.fields.size() > 0) {
|
if (cn.fields.size() > 0) {
|
||||||
sb.append(BytecodeViewer.nl);
|
sb.append(nl);
|
||||||
}
|
}
|
||||||
for (MethodNode mn : cn.methods) {
|
for (MethodNode mn : cn.methods) {
|
||||||
sb.append(BytecodeViewer.nl);
|
sb.append(nl);
|
||||||
MethodNodeDecompiler.decompile(sb, mn, cn);
|
MethodNodeDecompiler.decompile(sb, mn, cn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,10 +110,10 @@ public class ClassNodeDecompiler extends Decompiler {
|
||||||
ClassNode cn1 = BytecodeViewer.getClassNode(innerClassName);
|
ClassNode cn1 = BytecodeViewer.getClassNode(innerClassName);
|
||||||
if (cn1 != null) {
|
if (cn1 != null) {
|
||||||
sb.appendPrefix(" ");
|
sb.appendPrefix(" ");
|
||||||
sb.append(BytecodeViewer.nl + BytecodeViewer.nl);
|
sb.append(nl + nl);
|
||||||
sb = decompile(sb, decompiledClasses, cn1);
|
sb = decompile(sb, decompiledClasses, cn1);
|
||||||
sb.trimPrefix(5);
|
sb.trimPrefix(5);
|
||||||
sb.append(BytecodeViewer.nl);
|
sb.append(nl);
|
||||||
} else {
|
} else {
|
||||||
unableToDecompile.add(innerClassName);
|
unableToDecompile.add(innerClassName);
|
||||||
}
|
}
|
||||||
|
@ -124,11 +126,11 @@ public class ClassNodeDecompiler extends Decompiler {
|
||||||
sb.append(s);
|
sb.append(s);
|
||||||
sb.append(" ");
|
sb.append(" ");
|
||||||
}
|
}
|
||||||
sb.append(BytecodeViewer.nl);
|
sb.append(nl);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cn.attrs != null) {
|
if (cn.attrs != null) {
|
||||||
sb.append(BytecodeViewer.nl);
|
sb.append(nl);
|
||||||
for (Attribute attr : cn.attrs) {
|
for (Attribute attr : cn.attrs) {
|
||||||
//TODO: finish attributes
|
//TODO: finish attributes
|
||||||
sb.append(attr.type + ": ");// + attr.content.toString());
|
sb.append(attr.type + ": ");// + attr.content.toString());
|
||||||
|
|
|
@ -12,6 +12,8 @@ import org.objectweb.asm.tree.MethodNode;
|
||||||
import org.objectweb.asm.tree.TryCatchBlockNode;
|
import org.objectweb.asm.tree.TryCatchBlockNode;
|
||||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -98,7 +100,7 @@ public class MethodNodeDecompiler {
|
||||||
sb.append(" {}");
|
sb.append(" {}");
|
||||||
sb.append(" //");
|
sb.append(" //");
|
||||||
sb.append(m.desc);
|
sb.append(m.desc);
|
||||||
sb.append(BytecodeViewer.nl);
|
sb.append(nl);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
sb.append(" {");
|
sb.append(" {");
|
||||||
|
@ -113,7 +115,7 @@ public class MethodNodeDecompiler {
|
||||||
sb.append(" //");
|
sb.append(" //");
|
||||||
sb.append(m.desc);
|
sb.append(m.desc);
|
||||||
|
|
||||||
sb.append(BytecodeViewer.nl);
|
sb.append(nl);
|
||||||
|
|
||||||
if (m.signature != null) {
|
if (m.signature != null) {
|
||||||
sb.append(" <sig:").append(m.signature).append(">");
|
sb.append(" <sig:").append(m.signature).append(">");
|
||||||
|
@ -152,14 +154,14 @@ public class MethodNodeDecompiler {
|
||||||
sb.append(o.type);
|
sb.append(o.type);
|
||||||
else
|
else
|
||||||
sb.append("Type is null.");
|
sb.append("Type is null.");
|
||||||
sb.append(BytecodeViewer.nl);
|
sb.append(nl);
|
||||||
}
|
}
|
||||||
for (String insn : insnPrinter.createPrint()) {
|
for (String insn : insnPrinter.createPrint()) {
|
||||||
sb.append(" ");
|
sb.append(" ");
|
||||||
sb.append(insn);
|
sb.append(insn);
|
||||||
sb.append(BytecodeViewer.nl);
|
sb.append(nl);
|
||||||
}
|
}
|
||||||
sb.append(" }" + BytecodeViewer.nl);
|
sb.append(" }" + nl);
|
||||||
}
|
}
|
||||||
return sb;
|
return sb;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,9 @@ import javax.swing.JTextArea;
|
||||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
import the.bytecode.club.bytecodeviewer.Resources;
|
import the.bytecode.club.bytecodeviewer.Resources;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.BytecodeViewer.*;
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -44,7 +47,7 @@ public class AboutWindow extends JFrame {
|
||||||
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_322439757638784");
|
getContentPane().add(scrollPane, "name_845520934713596");
|
||||||
textArea.setWrapStyleWord(true);
|
textArea.setWrapStyleWord(true);
|
||||||
textArea.setEnabled(false);
|
textArea.setEnabled(false);
|
||||||
textArea.setDisabledTextColor(Color.BLACK);
|
textArea.setDisabledTextColor(Color.BLACK);
|
||||||
|
@ -57,39 +60,39 @@ public class AboutWindow extends JFrame {
|
||||||
public void setVisible(boolean b) {
|
public void setVisible(boolean b) {
|
||||||
super.setVisible(b);
|
super.setVisible(b);
|
||||||
textArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int) BytecodeViewer.viewer.fontSpinner.getValue()));
|
textArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int) BytecodeViewer.viewer.fontSpinner.getValue()));
|
||||||
textArea.setText("Bytecode Viewer " + BytecodeViewer.VERSION + " is an open source program developed and "
|
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 "
|
+ "maintained by Konloch (konloch@gmail.com) 100% free and open sourced licensed under GPL v3 "
|
||||||
+ "CopyLeft\r\n\r\n" +
|
+ "CopyLeft\r\n\r\n" +
|
||||||
"Settings:" + BytecodeViewer.nl +
|
"Settings:" + nl +
|
||||||
" Preview Copy: " + BytecodeViewer.PREVIEW_COPY + BytecodeViewer.nl +
|
" Preview Copy: " + PREVIEW_COPY + nl +
|
||||||
" Fat Jar: " + BytecodeViewer.FAT_JAR + BytecodeViewer.nl +
|
" Fat Jar: " + FAT_JAR + nl +
|
||||||
" Java: " + BytecodeViewer.java + BytecodeViewer.nl +
|
" Java: " + java + nl +
|
||||||
" Javac: " + BytecodeViewer.javac + BytecodeViewer.nl +
|
" Javac: " + javac + nl +
|
||||||
" BCV Dir: " + BytecodeViewer.getBCVDirectory() + BytecodeViewer.nl +
|
" BCV Dir: " + getBCVDirectory() + nl +
|
||||||
" Python 2.7 (or PyPy): " + BytecodeViewer.python + BytecodeViewer.nl +
|
" Python 2.7 (or PyPy): " + python + nl +
|
||||||
" Python 3.X (or PyPy): " + BytecodeViewer.python3 + BytecodeViewer.nl +
|
" Python 3.X (or PyPy): " + python3 + nl +
|
||||||
" RT.jar:" + BytecodeViewer.rt + BytecodeViewer.nl +
|
" RT.jar:" + rt + nl +
|
||||||
" Optional Lib: " + BytecodeViewer.library + BytecodeViewer.nl +
|
" Optional Lib: " + library + nl +
|
||||||
" BCV Krakatau: v" + BytecodeViewer.krakatauVersion + BytecodeViewer.nl +
|
" BCV Krakatau: v" + krakatauVersion + nl +
|
||||||
" Krakatau Dir: " + BytecodeViewer.krakatauWorkingDirectory + BytecodeViewer.nl +
|
" Krakatau Dir: " + krakatauWorkingDirectory + nl +
|
||||||
" BCV Enjarify: v" + BytecodeViewer.enjarifyVersion + BytecodeViewer.nl +
|
" BCV Enjarify: v" + enjarifyVersion + nl +
|
||||||
" Enjarify Dir: " + BytecodeViewer.enjarifyWorkingDirectory + BytecodeViewer.nl + BytecodeViewer.nl +
|
" Enjarify Dir: " + enjarifyWorkingDirectory + nl + nl +
|
||||||
"Command Line Input:" + BytecodeViewer.nl +
|
"Command Line Input:" + nl +
|
||||||
" -help Displays the help menu" + BytecodeViewer.nl +
|
" -help Displays the help menu" + nl +
|
||||||
" -list Displays the available decompilers" + BytecodeViewer.nl +
|
" -list Displays the available decompilers" + nl +
|
||||||
" -decompiler <decompiler> Selects the decompiler, procyon by default" + BytecodeViewer.nl +
|
" -decompiler <decompiler> Selects the decompiler, procyon by default" + nl +
|
||||||
" -i <input file> Selects the input file (Jar, Class, APK, ZIP, DEX all work "
|
" -i <input file> Selects the input file (Jar, Class, APK, ZIP, DEX all work "
|
||||||
+ "automatically)" + BytecodeViewer.nl +
|
+ "automatically)" + nl +
|
||||||
" -o <output file> Selects the output file (Java or Java-Bytecode)" + BytecodeViewer.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"
|
" -t <target classname> Must either be the fully qualified classname or \"all\" to decompile"
|
||||||
+ " all as zip" + BytecodeViewer.nl +
|
+ " all as zip" + nl +
|
||||||
" -nowait Doesn't wait for the user to read the CLI messages" + BytecodeViewer.nl + BytecodeViewer.nl +
|
" -nowait Doesn't wait for the user to read the CLI messages" + nl + nl +
|
||||||
"Keybinds:" + BytecodeViewer.nl +
|
"Keybinds:" + nl +
|
||||||
" CTRL + O: Open/add new jar/class/apk" + BytecodeViewer.nl +
|
" CTRL + O: Open/add new jar/class/apk" + nl +
|
||||||
" CTLR + N: Reset the workspace" + BytecodeViewer.nl +
|
" CTLR + N: Reset the workspace" + nl +
|
||||||
" CTRL + W: Closes the currently opened tab" + BytecodeViewer.nl +
|
" CTRL + W: Closes the currently opened tab" + nl +
|
||||||
" CTRL + T: Compile" + BytecodeViewer.nl +
|
" CTRL + T: Compile" + nl +
|
||||||
" CTRL + S: Save classes as zip" + BytecodeViewer.nl +
|
" CTRL + S: Save classes as zip" + nl +
|
||||||
" CTRL + R: Run (EZ-Inject) - dynamically load the classes and invoke a main class" +
|
" 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 "
|
"\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 "
|
+ "WaterWolf\r\n JHexPane by Sam Koivu\r\n RSynaxPane by Robert Futrell\r\n Commons IO by "
|
||||||
|
|
|
@ -57,6 +57,7 @@ import the.bytecode.club.bytecodeviewer.util.FileContainer;
|
||||||
import the.bytecode.club.bytecodeviewer.util.JarUtils;
|
import the.bytecode.club.bytecodeviewer.util.JarUtils;
|
||||||
import the.bytecode.club.bytecodeviewer.util.LazyNameUtil;
|
import the.bytecode.club.bytecodeviewer.util.LazyNameUtil;
|
||||||
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
|
@ -617,7 +618,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
||||||
ArrayList<File> reopen = new ArrayList<>();
|
ArrayList<File> reopen = new ArrayList<>();
|
||||||
|
|
||||||
for (FileContainer container : BytecodeViewer.files) {
|
for (FileContainer container : BytecodeViewer.files) {
|
||||||
File newFile = new File(container.file.getParent() + BytecodeViewer.fs + container.name);
|
File newFile = new File(container.file.getParent() + fs + container.name);
|
||||||
if (!container.file.getAbsolutePath().equals(newFile.getAbsolutePath()) &&
|
if (!container.file.getAbsolutePath().equals(newFile.getAbsolutePath()) &&
|
||||||
(container.file.getAbsolutePath().endsWith(".apk") || container.file.getAbsolutePath().endsWith(".dex"))) //APKs & dex get renamed
|
(container.file.getAbsolutePath().endsWith(".apk") || container.file.getAbsolutePath().endsWith(".dex"))) //APKs & dex get renamed
|
||||||
{
|
{
|
||||||
|
@ -769,8 +770,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
||||||
|
|
||||||
Thread t16 = new Thread(() -> {
|
Thread t16 = new Thread(() -> {
|
||||||
BytecodeViewer.viewer.setIcon(true);
|
BytecodeViewer.viewer.setIcon(true);
|
||||||
final String input =
|
final String input = tempDirectory + fs + BytecodeViewer.getRandomizedName() + ".jar";
|
||||||
BytecodeViewer.tempDirectory + BytecodeViewer.fs + BytecodeViewer.getRandomizedName() + ".jar";
|
|
||||||
JarUtils.saveAsJar(BytecodeViewer.getLoadedClasses(), input);
|
JarUtils.saveAsJar(BytecodeViewer.getLoadedClasses(), input);
|
||||||
|
|
||||||
Thread t15 = new Thread(() -> {
|
Thread t15 = new Thread(() -> {
|
||||||
|
@ -880,8 +880,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
||||||
|
|
||||||
Thread t14 = new Thread(() -> {
|
Thread t14 = new Thread(() -> {
|
||||||
BytecodeViewer.viewer.setIcon(true);
|
BytecodeViewer.viewer.setIcon(true);
|
||||||
final String input =
|
final String input = tempDirectory + fs + BytecodeViewer.getRandomizedName() + ".jar";
|
||||||
BytecodeViewer.tempDirectory + BytecodeViewer.fs + BytecodeViewer.getRandomizedName() + ".jar";
|
|
||||||
JarUtils.saveAsJar(BytecodeViewer.getLoadedClasses(), input);
|
JarUtils.saveAsJar(BytecodeViewer.getLoadedClasses(), input);
|
||||||
|
|
||||||
Thread t13 = new Thread(() -> {
|
Thread t13 = new Thread(() -> {
|
||||||
|
@ -952,8 +951,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
||||||
|
|
||||||
final File javaSucks = file;
|
final File javaSucks = file;
|
||||||
|
|
||||||
final String path = MiscUtils.append(file, ".zip"); // cheap hax cause
|
final String path = MiscUtils.append(file, ".zip"); // cheap hax cause string is final
|
||||||
// string is final
|
|
||||||
|
|
||||||
JOptionPane pane = new JOptionPane(
|
JOptionPane pane = new JOptionPane(
|
||||||
"What decompiler will you use?");
|
"What decompiler will you use?");
|
||||||
|
@ -971,8 +969,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
||||||
|
|
||||||
BytecodeViewer.viewer.setIcon(true);
|
BytecodeViewer.viewer.setIcon(true);
|
||||||
|
|
||||||
File tempZip =
|
File tempZip = new File(tempDirectory + fs + "temp_" + BytecodeViewer.getRandomizedName() + ".jar");
|
||||||
new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + "temp_" + BytecodeViewer.getRandomizedName() + ".jar");
|
|
||||||
if (tempZip.exists())
|
if (tempZip.exists())
|
||||||
tempZip.delete();
|
tempZip.delete();
|
||||||
|
|
||||||
|
@ -2001,11 +1998,11 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
|
||||||
mntmShowMainMethods.addActionListener(e -> PluginManager.runPlugin(new ShowMainMethods()));
|
mntmShowMainMethods.addActionListener(e -> PluginManager.runPlugin(new ShowMainMethods()));
|
||||||
|
|
||||||
setSize(new Dimension(800, 400));
|
setSize(new Dimension(800, 400));
|
||||||
if (BytecodeViewer.PREVIEW_COPY)
|
if (PREVIEW_COPY)
|
||||||
setTitle("Bytecode Viewer " + BytecodeViewer.VERSION + " Preview - https://bytecodeviewer.com | "
|
setTitle("Bytecode Viewer " + VERSION + " Preview - https://bytecodeviewer.com | "
|
||||||
+ "https://the.bytecode.club - @Konloch");
|
+ "https://the.bytecode.club - @Konloch");
|
||||||
else
|
else
|
||||||
setTitle("Bytecode Viewer " + BytecodeViewer.VERSION + " - https://bytecodeviewer.com | https://the"
|
setTitle("Bytecode Viewer " + VERSION + " - https://bytecodeviewer.com | https://the"
|
||||||
+ ".bytecode.club - @Konloch");
|
+ ".bytecode.club - @Konloch");
|
||||||
|
|
||||||
getContentPane().setLayout(
|
getContentPane().setLayout(
|
||||||
|
|
|
@ -21,6 +21,8 @@ import javax.swing.text.JTextComponent;
|
||||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
import the.bytecode.club.bytecodeviewer.Resources;
|
import the.bytecode.club.bytecodeviewer.Resources;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -139,7 +141,7 @@ public class SystemErrConsole extends JFrame {
|
||||||
String start = split[0] + "'" + split[1] + "', ";
|
String start = split[0] + "'" + split[1] + "', ";
|
||||||
s = s.substring(start.length());
|
s = s.substring(start.length());
|
||||||
}
|
}
|
||||||
replace.append(s).append(BytecodeViewer.nl);
|
replace.append(s).append(nl);
|
||||||
}
|
}
|
||||||
setText(replace.toString());
|
setText(replace.toString());
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,8 @@ import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
import the.bytecode.club.bytecodeviewer.util.FileChangeNotifier;
|
import the.bytecode.club.bytecodeviewer.util.FileChangeNotifier;
|
||||||
import the.bytecode.club.bytecodeviewer.util.FileContainer;
|
import the.bytecode.club.bytecodeviewer.util.FileContainer;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.BLOCK_TAB_MENU;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -111,7 +113,7 @@ public class WorkPane extends VisibleComponent implements ActionListener {
|
||||||
@Override
|
@Override
|
||||||
public void mousePressed(MouseEvent e) {
|
public void mousePressed(MouseEvent e) {
|
||||||
if (e.getButton() == 3) {
|
if (e.getButton() == 3) {
|
||||||
if (BytecodeViewer.BLOCK_TAB_MENU)
|
if (BLOCK_TAB_MENU)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Rectangle bounds = new Rectangle(1, 1, e.getX(), e.getY());
|
Rectangle bounds = new Rectangle(1, 1, e.getX(), e.getY());
|
||||||
|
@ -143,7 +145,7 @@ public class WorkPane extends VisibleComponent implements ActionListener {
|
||||||
pop_up.add(closetab);
|
pop_up.add(closetab);
|
||||||
|
|
||||||
|
|
||||||
if (!BytecodeViewer.BLOCK_TAB_MENU)
|
if (!BLOCK_TAB_MENU)
|
||||||
tabs.setComponentPopupMenu(pop_up);
|
tabs.setComponentPopupMenu(pop_up);
|
||||||
|
|
||||||
getContentPane().setLayout(new BorderLayout());
|
getContentPane().setLayout(new BorderLayout());
|
||||||
|
|
|
@ -16,6 +16,8 @@ import the.bytecode.club.bytecodeviewer.api.Plugin;
|
||||||
import the.bytecode.club.bytecodeviewer.api.PluginConsole;
|
import the.bytecode.club.bytecodeviewer.api.PluginConsole;
|
||||||
import the.bytecode.club.bytecodeviewer.gui.GraphicalReflectionKit;
|
import the.bytecode.club.bytecodeviewer.gui.GraphicalReflectionKit;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -273,8 +275,7 @@ public class EZInjection extends Plugin {
|
||||||
the.bytecode.club.bytecodeviewer.api.BytecodeViewer
|
the.bytecode.club.bytecodeviewer.api.BytecodeViewer
|
||||||
.getClassNodeLoader().addClass(cn);
|
.getClassNodeLoader().addClass(cn);
|
||||||
|
|
||||||
print("Invoking " + invokeMethodInformation + ":"
|
print("Invoking " + invokeMethodInformation + ":" + nl + nl);
|
||||||
+ BytecodeViewer.nl + BytecodeViewer.nl);
|
|
||||||
|
|
||||||
for (ClassNode classNode : classNodeList) {
|
for (ClassNode classNode : classNodeList) {
|
||||||
for (Object o : classNode.methods.toArray()) {
|
for (Object o : classNode.methods.toArray()) {
|
||||||
|
|
|
@ -14,6 +14,8 @@ import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
import the.bytecode.club.bytecodeviewer.api.Plugin;
|
import the.bytecode.club.bytecodeviewer.api.Plugin;
|
||||||
import the.bytecode.club.bytecodeviewer.api.PluginConsole;
|
import the.bytecode.club.bytecodeviewer.api.PluginConsole;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -80,7 +82,7 @@ public class MaliciousCodeScanner extends Plugin {
|
||||||
|| (LIP && s
|
|| (LIP && s
|
||||||
.matches("\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b")))
|
.matches("\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b")))
|
||||||
sb.append("Found LDC \"").append(s).append("\" at field ").append(classNode.name).append(".")
|
sb.append("Found LDC \"").append(s).append("\" at field ").append(classNode.name).append(".")
|
||||||
.append(f.name).append("(").append(f.desc).append(")").append(BytecodeViewer.nl);
|
.append(f.name).append("(").append(f.desc).append(")").append(nl);
|
||||||
}
|
}
|
||||||
if (v instanceof String[]) {
|
if (v instanceof String[]) {
|
||||||
for (int i = 0; i < ((String[]) v).length; i++) {
|
for (int i = 0; i < ((String[]) v).length; i++) {
|
||||||
|
@ -96,7 +98,7 @@ public class MaliciousCodeScanner extends Plugin {
|
||||||
.matches("\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b")))
|
.matches("\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b")))
|
||||||
sb.append("Found LDC \"").append(s).append("\" at field ").append(classNode.name)
|
sb.append("Found LDC \"").append(s).append("\" at field ").append(classNode.name)
|
||||||
.append(".").append(f.name).append("(").append(f.desc).append(")")
|
.append(".").append(f.name).append("(").append(f.desc).append(")")
|
||||||
.append(BytecodeViewer.nl);
|
.append(nl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -117,7 +119,7 @@ public class MaliciousCodeScanner extends Plugin {
|
||||||
|| (OIO && min.owner.startsWith("java/io"))) {
|
|| (OIO && min.owner.startsWith("java/io"))) {
|
||||||
sb.append("Found Method call to ").append(min.owner).append(".").append(min.name)
|
sb.append("Found Method call to ").append(min.owner).append(".").append(min.name)
|
||||||
.append("(").append(min.desc).append(") at ").append(classNode.name).append(".")
|
.append("(").append(min.desc).append(") at ").append(classNode.name).append(".")
|
||||||
.append(m.name).append("(").append(m.desc).append(")").append(BytecodeViewer.nl);
|
.append(m.name).append("(").append(m.desc).append(")").append(nl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (a instanceof LdcInsnNode) {
|
if (a instanceof LdcInsnNode) {
|
||||||
|
@ -134,7 +136,7 @@ public class MaliciousCodeScanner extends Plugin {
|
||||||
.matches("\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b"))) {
|
.matches("\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b"))) {
|
||||||
sb.append("Found LDC \"").append(s).append("\" at method ").append(classNode.name)
|
sb.append("Found LDC \"").append(s).append("\" at method ").append(classNode.name)
|
||||||
.append(".").append(m.name).append("(").append(m.desc).append(")")
|
.append(".").append(m.name).append("(").append(m.desc).append(")")
|
||||||
.append(BytecodeViewer.nl);
|
.append(nl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -152,7 +154,7 @@ public class MaliciousCodeScanner extends Plugin {
|
||||||
.equals("setSecurityManager"))) {
|
.equals("setSecurityManager"))) {
|
||||||
sb.append("Found Security Manager set to null at method ").append(classNode.name)
|
sb.append("Found Security Manager set to null at method ").append(classNode.name)
|
||||||
.append(".").append(m.name).append("(").append(m.desc).append(")")
|
.append(".").append(m.name).append("(").append(m.desc).append(")")
|
||||||
.append(BytecodeViewer.nl);
|
.append(nl);
|
||||||
prevInsn_aconst_null = false;
|
prevInsn_aconst_null = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -11,6 +11,8 @@ import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
import the.bytecode.club.bytecodeviewer.api.Plugin;
|
import the.bytecode.club.bytecodeviewer.api.Plugin;
|
||||||
import the.bytecode.club.bytecodeviewer.api.PluginConsole;
|
import the.bytecode.club.bytecodeviewer.api.PluginConsole;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -50,7 +52,7 @@ public class ShowAllStrings extends Plugin {
|
||||||
if (!s.isEmpty())
|
if (!s.isEmpty())
|
||||||
sb.append(classNode.name).append(".").append(f.name).append(f.desc).append(" -> \"")
|
sb.append(classNode.name).append(".").append(f.name).append(f.desc).append(" -> \"")
|
||||||
.append(s.replaceAll("\\n", "\\\\n").replaceAll("\\r", "\\\\r"))
|
.append(s.replaceAll("\\n", "\\\\n").replaceAll("\\r", "\\\\r"))
|
||||||
.append("\"").append(BytecodeViewer.nl);
|
.append("\"").append(nl);
|
||||||
}
|
}
|
||||||
if (v instanceof String[]) {
|
if (v instanceof String[]) {
|
||||||
for (int i = 0; i < ((String[]) v).length; i++) {
|
for (int i = 0; i < ((String[]) v).length; i++) {
|
||||||
|
@ -58,7 +60,7 @@ public class ShowAllStrings extends Plugin {
|
||||||
if (!s.isEmpty())
|
if (!s.isEmpty())
|
||||||
sb.append(classNode.name).append(".").append(f.name).append(f.desc).append("[").append(i)
|
sb.append(classNode.name).append(".").append(f.name).append(f.desc).append("[").append(i)
|
||||||
.append("] -> \"").append(s.replaceAll("\\n", "\\\\n").replaceAll("\\r", "\\\\r"))
|
.append("] -> \"").append(s.replaceAll("\\n", "\\\\n").replaceAll("\\r", "\\\\r"))
|
||||||
.append("\"").append(BytecodeViewer.nl);
|
.append("\"").append(nl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -74,7 +76,7 @@ public class ShowAllStrings extends Plugin {
|
||||||
if (!s.isEmpty())
|
if (!s.isEmpty())
|
||||||
sb.append(classNode.name).append(".").append(m.name).append(m.desc).append(" -> \"")
|
sb.append(classNode.name).append(".").append(m.name).append(m.desc).append(" -> \"")
|
||||||
.append(s.replaceAll("\\n", "\\\\n").replaceAll("\\r", "\\\\r"))
|
.append(s.replaceAll("\\n", "\\\\n").replaceAll("\\r", "\\\\r"))
|
||||||
.append("\"").append(BytecodeViewer.nl);
|
.append("\"").append(nl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,8 @@ import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
import the.bytecode.club.bytecodeviewer.api.Plugin;
|
import the.bytecode.club.bytecodeviewer.api.Plugin;
|
||||||
import the.bytecode.club.bytecodeviewer.api.PluginConsole;
|
import the.bytecode.club.bytecodeviewer.api.PluginConsole;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -44,8 +46,8 @@ public class ZStringArrayDecrypter extends Plugin {
|
||||||
@Override
|
@Override
|
||||||
public void execute(ArrayList<ClassNode> classNodeList) {
|
public void execute(ArrayList<ClassNode> classNodeList) {
|
||||||
JOptionPane pane = new JOptionPane(
|
JOptionPane pane = new JOptionPane(
|
||||||
"WARNING: This will load the classes into the JVM and execute the initialize function" + BytecodeViewer.nl +
|
"WARNING: This will load the classes into the JVM and execute the initialize function"
|
||||||
"for each class. IF THE FILE YOU'RE LOADING IS MALICIOUS, DO NOT CONTINUE."
|
+ nl + "for each class. IF THE FILE YOU'RE LOADING IS MALICIOUS, DO NOT CONTINUE."
|
||||||
);
|
);
|
||||||
Object[] options = new String[]{"Continue", "Cancel"};
|
Object[] options = new String[]{"Continue", "Cancel"};
|
||||||
pane.setOptions(options);
|
pane.setOptions(options);
|
||||||
|
@ -66,12 +68,12 @@ public class ZStringArrayDecrypter extends Plugin {
|
||||||
Field[] fields = debug.getDeclaredFields();
|
Field[] fields = debug.getDeclaredFields();
|
||||||
for (Field field : fields) {
|
for (Field field : fields) {
|
||||||
if (field.getName().equals("z")) {
|
if (field.getName().equals("z")) {
|
||||||
out.append(debug.getName()).append(":").append(BytecodeViewer.nl);
|
out.append(debug.getName()).append(":").append(nl);
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
if (field.get(null) != null && field.get(null) instanceof String[] && Modifier.isStatic(field.getModifiers()) && Modifier.isFinal(field.getModifiers())) {
|
if (field.get(null) != null && field.get(null) instanceof String[] && Modifier.isStatic(field.getModifiers()) && Modifier.isFinal(field.getModifiers())) {
|
||||||
String[] fieldVal = (String[]) field.get(null);
|
String[] fieldVal = (String[]) field.get(null);
|
||||||
for (int i = 0; i < fieldVal.length; i++) {
|
for (int i = 0; i < fieldVal.length; i++) {
|
||||||
out.append(" z[").append(i).append("] = ").append(fieldVal[i]).append(BytecodeViewer.nl);
|
out.append(" z[").append(i).append("] = ").append(fieldVal[i]).append(nl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -84,7 +86,8 @@ public class ZStringArrayDecrypter extends Plugin {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (needsWarning) {
|
if (needsWarning) {
|
||||||
BytecodeViewer.showMessage("Some classes failed to decrypt, if you'd like to decrypt all of them" + BytecodeViewer.nl + "makes sure you include ALL the libraries it requires.");
|
BytecodeViewer.showMessage("Some classes failed to decrypt, if you'd like to decrypt all of them"
|
||||||
|
+ nl + "makes sure you include ALL the libraries it requires.");
|
||||||
}
|
}
|
||||||
|
|
||||||
gui.setText(out.toString());
|
gui.setText(out.toString());
|
||||||
|
|
|
@ -4,6 +4,8 @@ import java.io.File;
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -29,16 +31,15 @@ public class APKTool {
|
||||||
|
|
||||||
public static synchronized void decodeResources(File input, File output, FileContainer container) {
|
public static synchronized void decodeResources(File input, File output, FileContainer container) {
|
||||||
try {
|
try {
|
||||||
File dir =
|
File dir = new File(tempDirectory + fs + MiscUtils.randomString(32) + fs + "Decoded Resources");
|
||||||
new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + MiscUtils.randomString(32) + BytecodeViewer.fs + "Decoded Resources");
|
|
||||||
dir.mkdirs();
|
dir.mkdirs();
|
||||||
|
|
||||||
File tempAPKPath = new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + MiscUtils.randomString(12));
|
File tempAPKPath = new File(tempDirectory + fs + MiscUtils.randomString(12));
|
||||||
tempAPKPath.mkdirs();
|
tempAPKPath.mkdirs();
|
||||||
brut.apktool.Main.main(new String[]{"r", "--frame-path", tempAPKPath.getAbsolutePath(), "d",
|
brut.apktool.Main.main(new String[]{"r", "--frame-path", tempAPKPath.getAbsolutePath(), "d",
|
||||||
input.getAbsolutePath(), "-o", dir.getAbsolutePath(), "-f"});
|
input.getAbsolutePath(), "-o", dir.getAbsolutePath(), "-f"});
|
||||||
|
|
||||||
File zip = new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + MiscUtils.randomString(12) + ".zip");
|
File zip = new File(tempDirectory + fs + MiscUtils.randomString(12) + ".zip");
|
||||||
ZipUtils.zipFolderAPKTool(dir.getAbsolutePath(), zip.getAbsolutePath());
|
ZipUtils.zipFolderAPKTool(dir.getAbsolutePath(), zip.getAbsolutePath());
|
||||||
|
|
||||||
if (zip.exists())
|
if (zip.exists())
|
||||||
|
@ -52,16 +53,16 @@ public class APKTool {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static synchronized void buildAPK(File input, File output, FileContainer container) {
|
public static synchronized void buildAPK(File input, File output, FileContainer container) {
|
||||||
String temp = BytecodeViewer.tempDirectory + BytecodeViewer.fs;
|
String temp = tempDirectory + fs;
|
||||||
File tempDir = new File(temp + BytecodeViewer.fs + BytecodeViewer.getRandomizedName() + BytecodeViewer.fs);
|
File tempDir = new File(temp + fs + BytecodeViewer.getRandomizedName() + fs);
|
||||||
tempDir.mkdirs();
|
tempDir.mkdirs();
|
||||||
|
|
||||||
|
|
||||||
File tempAPKPath = new File(BytecodeViewer.tempDirectory + BytecodeViewer.fs + MiscUtils.randomString(12));
|
File tempAPKPath = new File(tempDirectory + fs + MiscUtils.randomString(12));
|
||||||
tempAPKPath.mkdirs();
|
tempAPKPath.mkdirs();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
File smaliFolder = new File(container.APKToolContents.getAbsolutePath() + BytecodeViewer.fs + "smali");
|
File smaliFolder = new File(container.APKToolContents.getAbsolutePath() + fs + "smali");
|
||||||
FileUtils.deleteDirectory(smaliFolder);
|
FileUtils.deleteDirectory(smaliFolder);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,100 @@
|
||||||
|
package the.bytecode.club.bytecodeviewer.util;
|
||||||
|
|
||||||
|
import the.bytecode.club.bootloader.Boot;
|
||||||
|
import the.bytecode.club.bootloader.ILoader;
|
||||||
|
import the.bytecode.club.bootloader.resource.EmptyExternalResource;
|
||||||
|
import the.bytecode.club.bootloader.resource.ExternalResource;
|
||||||
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
|
import the.bytecode.club.bytecodeviewer.CommandLineInput;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.nl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Konloch
|
||||||
|
* @since 6/21/2021
|
||||||
|
*/
|
||||||
|
public class BootCheck implements Runnable
|
||||||
|
{
|
||||||
|
boolean finished = false;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||||
|
public void run() {
|
||||||
|
long start = System.currentTimeMillis();
|
||||||
|
|
||||||
|
while (!finished) {
|
||||||
|
if (System.currentTimeMillis() - start >= 7000) { //7 second failsafe
|
||||||
|
if (!Boot.completedboot && !Boot.downloading) {
|
||||||
|
File libsDir = Boot.libsDir();
|
||||||
|
File[] listFiles = libsDir.listFiles();
|
||||||
|
if (listFiles == null || listFiles.length <= 0) {
|
||||||
|
BytecodeViewer.showMessage(
|
||||||
|
"Github is loading extremely slow, BCV needs to download libraries from github in"
|
||||||
|
+ " order" + nl +
|
||||||
|
"to work, please try adjusting your network settings or manually "
|
||||||
|
+ "downloading these libraries" + nl +
|
||||||
|
"if this error persists.");
|
||||||
|
finished = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Boot.setState("Bytecode Viewer Boot Screen (OFFLINE MODE) - Unable to connect to github, "
|
||||||
|
+ "force booting...");
|
||||||
|
System.out.println("Unable to connect to github, force booting...");
|
||||||
|
List<String> libsFileList = new ArrayList<>();
|
||||||
|
for (File f : listFiles) {
|
||||||
|
libsFileList.add(f.getAbsolutePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
ILoader<?> loader = Boot.findLoader();
|
||||||
|
|
||||||
|
for (String s : libsFileList) {
|
||||||
|
if (s.endsWith(".jar")) {
|
||||||
|
File f = new File(s);
|
||||||
|
if (f.exists()) {
|
||||||
|
Boot.setState("Bytecode Viewer Boot Screen (OFFLINE MODE) - Force Loading Library"
|
||||||
|
+ " " + f.getName());
|
||||||
|
System.out.println("Force loading library " + f.getName());
|
||||||
|
|
||||||
|
try {
|
||||||
|
ExternalResource res = new EmptyExternalResource<>(f.toURI().toURL());
|
||||||
|
loader.bind(res);
|
||||||
|
System.out.println("Successfully loaded " + f.getName());
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
f.delete();
|
||||||
|
JOptionPane.showMessageDialog(null, "Error, Library " + f.getName() + " is "
|
||||||
|
+ "corrupt, please restart to redownload it.",
|
||||||
|
"Error", JOptionPane.ERROR_MESSAGE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Boot.checkEnjarify();
|
||||||
|
Boot.checkKrakatau();
|
||||||
|
|
||||||
|
Boot.globalstop = false;
|
||||||
|
Boot.hide();
|
||||||
|
|
||||||
|
if (CommandLineInput.parseCommandLine(BytecodeViewer.args) == CommandLineInput.OPEN_FILE)
|
||||||
|
BytecodeViewer.BOOT(false);
|
||||||
|
else {
|
||||||
|
BytecodeViewer.BOOT(true);
|
||||||
|
CommandLineInput.executeCommandLine(BytecodeViewer.args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finished = true;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Thread.sleep(100);
|
||||||
|
} catch (InterruptedException ignored) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,6 +3,8 @@ package the.bytecode.club.bytecodeviewer.util;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.enjarifyWorkingDirectory;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -59,7 +61,7 @@ public class Enjarify {
|
||||||
"-f"
|
"-f"
|
||||||
);
|
);
|
||||||
|
|
||||||
pb.directory(new File(BytecodeViewer.enjarifyWorkingDirectory));
|
pb.directory(new File(enjarifyWorkingDirectory));
|
||||||
Process process = pb.start();
|
Process process = pb.start();
|
||||||
BytecodeViewer.createdProcesses.add(process);
|
BytecodeViewer.createdProcesses.add(process);
|
||||||
process.waitFor();
|
process.waitFor();
|
||||||
|
|
|
@ -22,6 +22,8 @@ import org.objectweb.asm.ClassWriter;
|
||||||
import org.objectweb.asm.tree.ClassNode;
|
import org.objectweb.asm.tree.ClassNode;
|
||||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
@ -331,7 +333,7 @@ public class JarUtils {
|
||||||
ClassWriter cw = new ClassWriter(0);
|
ClassWriter cw = new ClassWriter(0);
|
||||||
cn.accept(cw);
|
cn.accept(cw);
|
||||||
|
|
||||||
String name = dir + BytecodeViewer.fs + cn.name + ".class";
|
String name = dir + fs + cn.name + ".class";
|
||||||
File f = new File(name);
|
File f = new File(name);
|
||||||
f.mkdirs();
|
f.mkdirs();
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,220 @@
|
||||||
|
package the.bytecode.club.bytecodeviewer.util;
|
||||||
|
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
|
import org.objectweb.asm.tree.ClassNode;
|
||||||
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
|
import the.bytecode.club.bytecodeviewer.api.ExceptionUI;
|
||||||
|
import the.bytecode.club.bytecodeviewer.gui.FileNavigationPane;
|
||||||
|
import the.bytecode.club.bytecodeviewer.gui.MainViewerGUI;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.tempDirectory;
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.fs;
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
* *
|
||||||
|
* This program is free software: you can redistribute it and/or modify *
|
||||||
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or *
|
||||||
|
* (at your option) any later version. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License *
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Konloch
|
||||||
|
*/
|
||||||
|
public class OpenFile implements Runnable
|
||||||
|
{
|
||||||
|
private boolean update = true;
|
||||||
|
private final File[] files;
|
||||||
|
|
||||||
|
public OpenFile(File[] files) {this.files = files;}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
for (final File f : files) {
|
||||||
|
final String fn = f.getName();
|
||||||
|
if (!f.exists()) {
|
||||||
|
update = false;
|
||||||
|
BytecodeViewer.showMessage("The file " + f.getAbsolutePath() + " could not be found.");
|
||||||
|
} else {
|
||||||
|
if (f.isDirectory()) {
|
||||||
|
FileContainer container = new FileContainer(f);
|
||||||
|
HashMap<String, byte[]> files1 = new HashMap<>();
|
||||||
|
boolean finished = false;
|
||||||
|
ArrayList<File> totalFiles = new ArrayList<>();
|
||||||
|
totalFiles.add(f);
|
||||||
|
String dir = f.getAbsolutePath();//f.getAbsolutePath().substring(0, f.getAbsolutePath
|
||||||
|
// ().length()-f.getName().length());
|
||||||
|
|
||||||
|
while (!finished) {
|
||||||
|
boolean added = false;
|
||||||
|
for (int i = 0; i < totalFiles.size(); i++) {
|
||||||
|
File child = totalFiles.get(i);
|
||||||
|
if (child.listFiles() != null)
|
||||||
|
for (File rocket : Objects.requireNonNull(child.listFiles()))
|
||||||
|
if (!totalFiles.contains(rocket)) {
|
||||||
|
totalFiles.add(rocket);
|
||||||
|
added = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!added) {
|
||||||
|
for (File child : totalFiles)
|
||||||
|
if (child.isFile()) {
|
||||||
|
String fileName = child.getAbsolutePath().substring(dir.length() + 1
|
||||||
|
).replaceAll("\\\\", "\\/");
|
||||||
|
|
||||||
|
|
||||||
|
files1.put(fileName,
|
||||||
|
Files.readAllBytes(Paths.get(child.getAbsolutePath())));
|
||||||
|
}
|
||||||
|
finished = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
container.files = files1;
|
||||||
|
BytecodeViewer.files.add(container);
|
||||||
|
} else {
|
||||||
|
if (fn.endsWith(".jar") || fn.endsWith(".zip") || fn.endsWith(".war")) {
|
||||||
|
try {
|
||||||
|
JarUtils.put(f);
|
||||||
|
} catch (IOException z) {
|
||||||
|
try {
|
||||||
|
JarUtils.put2(f);
|
||||||
|
} catch (final Exception e) {
|
||||||
|
new ExceptionUI(e);
|
||||||
|
update = false;
|
||||||
|
}
|
||||||
|
} catch (final Exception e) {
|
||||||
|
new ExceptionUI(e);
|
||||||
|
update = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (fn.endsWith(".class")) {
|
||||||
|
try {
|
||||||
|
byte[] bytes = JarUtils.getBytes(new FileInputStream(f));
|
||||||
|
String cafebabe = String.format("%02X", bytes[0]) + String.format("%02X",
|
||||||
|
bytes[1]) + String.format("%02X", bytes[2]) + String.format("%02X",
|
||||||
|
bytes[3]);
|
||||||
|
if (cafebabe.equalsIgnoreCase("cafebabe")) {
|
||||||
|
final ClassNode cn = JarUtils.getNode(bytes);
|
||||||
|
|
||||||
|
FileContainer container = new FileContainer(f);
|
||||||
|
container.classes.add(cn);
|
||||||
|
BytecodeViewer.files.add(container);
|
||||||
|
} else {
|
||||||
|
BytecodeViewer.showMessage(fn + ": Header does not start with CAFEBABE, ignoring.");
|
||||||
|
update = false;
|
||||||
|
}
|
||||||
|
} catch (final Exception e) {
|
||||||
|
new ExceptionUI(e);
|
||||||
|
update = false;
|
||||||
|
}
|
||||||
|
} else if (fn.endsWith(".apk")) {
|
||||||
|
try {
|
||||||
|
BytecodeViewer.viewer.setIcon(true);
|
||||||
|
|
||||||
|
File tempCopy = new File(tempDirectory + fs + MiscUtils.randomString(32) + ".apk");
|
||||||
|
|
||||||
|
FileUtils.copyFile(f, tempCopy);
|
||||||
|
|
||||||
|
FileContainer container = new FileContainer(tempCopy, f.getName());
|
||||||
|
|
||||||
|
if (BytecodeViewer.viewer.decodeAPKResources.isSelected()) {
|
||||||
|
File decodedResources =
|
||||||
|
new File(tempDirectory + fs + MiscUtils.randomString(32) + ".apk");
|
||||||
|
APKTool.decodeResources(tempCopy, decodedResources, container);
|
||||||
|
container.files = JarUtils.loadResources(decodedResources);
|
||||||
|
}
|
||||||
|
|
||||||
|
Objects.requireNonNull(container.files).putAll(JarUtils.loadResources(tempCopy)); //copy and rename
|
||||||
|
// to prevent unicode filenames
|
||||||
|
|
||||||
|
String name = BytecodeViewer.getRandomizedName() + ".jar";
|
||||||
|
File output = new File(tempDirectory + fs + name);
|
||||||
|
|
||||||
|
if (BytecodeViewer.viewer.apkConversionGroup.isSelected(BytecodeViewer.viewer.apkConversionDex.getModel()))
|
||||||
|
Dex2Jar.dex2Jar(tempCopy, output);
|
||||||
|
else if (BytecodeViewer.viewer.apkConversionGroup.isSelected(BytecodeViewer.viewer.apkConversionEnjarify.getModel()))
|
||||||
|
Enjarify.apk2Jar(tempCopy, output);
|
||||||
|
|
||||||
|
container.classes = JarUtils.loadClasses(output);
|
||||||
|
|
||||||
|
BytecodeViewer.viewer.setIcon(false);
|
||||||
|
BytecodeViewer.files.add(container);
|
||||||
|
} catch (final Exception e) {
|
||||||
|
new ExceptionUI(e);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} else if (fn.endsWith(".dex")) {
|
||||||
|
try {
|
||||||
|
BytecodeViewer.viewer.setIcon(true);
|
||||||
|
|
||||||
|
File tempCopy = new File(tempDirectory + fs + MiscUtils.randomString(32) +
|
||||||
|
".dex");
|
||||||
|
|
||||||
|
FileUtils.copyFile(f, tempCopy); //copy and rename to prevent unicode filenames
|
||||||
|
|
||||||
|
FileContainer container = new FileContainer(tempCopy, f.getName());
|
||||||
|
|
||||||
|
String name = BytecodeViewer.getRandomizedName() + ".jar";
|
||||||
|
File output = new File(tempDirectory + fs + name);
|
||||||
|
|
||||||
|
if (BytecodeViewer.viewer.apkConversionGroup.isSelected(BytecodeViewer.viewer.apkConversionDex.getModel()))
|
||||||
|
Dex2Jar.dex2Jar(tempCopy, output);
|
||||||
|
else if (BytecodeViewer.viewer.apkConversionGroup.isSelected(BytecodeViewer.viewer.apkConversionEnjarify.getModel()))
|
||||||
|
Enjarify.apk2Jar(tempCopy, output);
|
||||||
|
|
||||||
|
container.classes = JarUtils.loadClasses(output);
|
||||||
|
|
||||||
|
BytecodeViewer.viewer.setIcon(false);
|
||||||
|
BytecodeViewer.files.add(container);
|
||||||
|
} catch (final Exception e) {
|
||||||
|
new ExceptionUI(e);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
HashMap<String, byte[]> files1 = new HashMap<>();
|
||||||
|
byte[] bytes = JarUtils.getBytes(new FileInputStream(f));
|
||||||
|
files1.put(f.getName(), bytes);
|
||||||
|
|
||||||
|
|
||||||
|
FileContainer container = new FileContainer(f);
|
||||||
|
container.files = files1;
|
||||||
|
BytecodeViewer.files.add(container);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (final Exception e) {
|
||||||
|
new ExceptionUI(e);
|
||||||
|
} finally {
|
||||||
|
BytecodeViewer.viewer.setIcon(false);
|
||||||
|
|
||||||
|
if (update)
|
||||||
|
try {
|
||||||
|
Objects.requireNonNull(MainViewerGUI.getComponent(FileNavigationPane.class)).updateTree();
|
||||||
|
} catch (NullPointerException ignored) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,6 @@
|
||||||
package the.bytecode.club.bytecodeviewer;
|
package the.bytecode.club.bytecodeviewer.util;
|
||||||
|
|
||||||
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
|
|
||||||
import java.io.FileDescriptor;
|
import java.io.FileDescriptor;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
|
@ -103,7 +105,6 @@ public class SecurityMan extends SecurityManager {
|
||||||
public void checkAccess(ThreadGroup g) {
|
public void checkAccess(ThreadGroup g) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void checkAwtEventQueueAccess() {
|
public void checkAwtEventQueueAccess() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,7 +135,6 @@ public class SecurityMan extends SecurityManager {
|
||||||
public void checkLink(String lib) {
|
public void checkLink(String lib) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void checkMemberAccess(Class<?> clazz, int which) {
|
public void checkMemberAccess(Class<?> clazz, int which) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,7 +146,6 @@ public class SecurityMan extends SecurityManager {
|
||||||
public void checkMulticast(InetAddress maddr, byte ttl) {
|
public void checkMulticast(InetAddress maddr, byte ttl) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void checkPackageAccess(String pkg) {
|
public void checkPackageAccess(String pkg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,7 +185,6 @@ public class SecurityMan extends SecurityManager {
|
||||||
public void checkSetFactory() {
|
public void checkSetFactory() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void checkSystemClipboardAccess() {
|
public void checkSystemClipboardAccess() {
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,221 @@
|
||||||
|
package the.bytecode.club.bytecodeviewer.util;
|
||||||
|
|
||||||
|
import me.konloch.kontainer.io.HTTPRequest;
|
||||||
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
|
import the.bytecode.club.bytecodeviewer.api.ExceptionUI;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import javax.swing.filechooser.FileFilter;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
* *
|
||||||
|
* This program is free software: you can redistribute it and/or modify *
|
||||||
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or *
|
||||||
|
* (at your option) any later version. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License *
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Konloch
|
||||||
|
*/
|
||||||
|
public class VersionChecker implements Runnable
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
HTTPRequest r = new HTTPRequest(new URL("https://raw.githubusercontent.com/Konloch/bytecode-viewer/master/VERSION"));
|
||||||
|
final String version = r.readSingle();
|
||||||
|
final String localVersion = VERSION + 0;
|
||||||
|
try {
|
||||||
|
int simplemaths = Integer.parseInt(version.replace(".", ""));
|
||||||
|
int simplemaths2 = Integer.parseInt(localVersion.replace(".", ""));
|
||||||
|
System.out.println("DEBUG: " + simplemaths + " vs " + simplemaths2);
|
||||||
|
if (simplemaths2 > simplemaths)
|
||||||
|
return; //developer version
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!VERSION.equals(version)) {
|
||||||
|
JOptionPane pane = new JOptionPane(
|
||||||
|
"Your version: " + VERSION + ", latest version: "
|
||||||
|
+ version + nl + "What would you like to do?");
|
||||||
|
Object[] options = new String[]{"Open The Download Page", "Download The Updated Jar", "Do Nothing"};
|
||||||
|
pane.setOptions(options);
|
||||||
|
JDialog dialog = pane.createDialog(BytecodeViewer.viewer, "Bytecode Viewer - Outdated Version");
|
||||||
|
dialog.setVisible(true);
|
||||||
|
Object obj = pane.getValue();
|
||||||
|
int result = -1;
|
||||||
|
for (int k = 0; k < options.length; k++)
|
||||||
|
if (options[k].equals(obj))
|
||||||
|
result = k;
|
||||||
|
|
||||||
|
if (result == 0) {
|
||||||
|
if (Desktop.isDesktopSupported()) {
|
||||||
|
Desktop.getDesktop().browse(new URI("https://github.com/Konloch/bytecode-viewer/releases"));
|
||||||
|
} else {
|
||||||
|
BytecodeViewer.showMessage("Cannot open the page, please manually type it." + nl + "https://github.com/Konloch/bytecode-viewer/releases");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (result == 1) {
|
||||||
|
JFileChooser fc = new JFileChooser();
|
||||||
|
try {
|
||||||
|
fc.setCurrentDirectory(new File(".").getAbsoluteFile()); //set the current working directory
|
||||||
|
} catch (Exception e) {
|
||||||
|
new ExceptionUI(e);
|
||||||
|
}
|
||||||
|
fc.setFileFilter(new FileFilter() {
|
||||||
|
@Override
|
||||||
|
public boolean accept(File f) {
|
||||||
|
return f.isDirectory() || MiscUtils.extension(f.getAbsolutePath()).equals("zip");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDescription() {
|
||||||
|
return "Zip Archives";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
fc.setFileHidingEnabled(false);
|
||||||
|
fc.setAcceptAllFileFilterUsed(false);
|
||||||
|
int returnVal = fc.showSaveDialog(BytecodeViewer.viewer);
|
||||||
|
if (returnVal == JFileChooser.APPROVE_OPTION) {
|
||||||
|
File file = fc.getSelectedFile();
|
||||||
|
if (!file.getAbsolutePath().endsWith(".zip"))
|
||||||
|
file = new File(file.getAbsolutePath() + ".zip");
|
||||||
|
|
||||||
|
if (file.exists()) {
|
||||||
|
pane = new JOptionPane("The file " + file + " exists, would you like to overwrite it?");
|
||||||
|
options = new String[]{"Yes", "No"};
|
||||||
|
pane.setOptions(options);
|
||||||
|
dialog = pane.createDialog(BytecodeViewer.viewer,
|
||||||
|
"Bytecode Viewer - Overwrite File");
|
||||||
|
dialog.setVisible(true);
|
||||||
|
obj = pane.getValue();
|
||||||
|
result = -1;
|
||||||
|
for (int k = 0; k < options.length; k++)
|
||||||
|
if (options[k].equals(obj))
|
||||||
|
result = k;
|
||||||
|
|
||||||
|
if (result != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
file.delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
final File finalFile = file;
|
||||||
|
Thread downloadThread = new Thread(() -> {
|
||||||
|
try {
|
||||||
|
InputStream is = new URL("https://github.com/Konloch/bytecode-viewer/releases/download/v" + version + "/BytecodeViewer." + version + ".zip").openConnection().getInputStream();
|
||||||
|
FileOutputStream fos = new FileOutputStream(finalFile);
|
||||||
|
try {
|
||||||
|
System.out.println("Downloading from https://github.com/Konloch/bytecode-viewer/releases/download/v" + version + "/BytecodeViewer." + version + ".zip");
|
||||||
|
byte[] buffer = new byte[8192];
|
||||||
|
int len;
|
||||||
|
int downloaded = 0;
|
||||||
|
boolean flag = false;
|
||||||
|
BytecodeViewer.showMessage("Downloading the jar in the background, when it's finished "
|
||||||
|
+ "you will be alerted with another message box." + nl + nl +
|
||||||
|
"Expect this to take several minutes.");
|
||||||
|
while ((len = is.read(buffer)) > 0) {
|
||||||
|
fos.write(buffer, 0, len);
|
||||||
|
fos.flush();
|
||||||
|
downloaded += 8192;
|
||||||
|
int mbs = downloaded / 1048576;
|
||||||
|
if (mbs % 5 == 0 && mbs != 0) {
|
||||||
|
if (!flag)
|
||||||
|
System.out.println("Downloaded " + mbs + "MBs so far");
|
||||||
|
flag = true;
|
||||||
|
} else
|
||||||
|
flag = false;
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if (is != null) {
|
||||||
|
is.close();
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
fos.flush();
|
||||||
|
fos.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
System.out.println("Download finished!");
|
||||||
|
BytecodeViewer.showMessage("Download successful! You can find the updated program at " + finalFile.getAbsolutePath());
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
try {
|
||||||
|
InputStream is = new URL("https://github.com/Konloch/bytecode-viewer/releases/download/v" + version + "/BytecodeViewer." + version + ".jar"
|
||||||
|
).openConnection().getInputStream();
|
||||||
|
FileOutputStream fos = new FileOutputStream(finalFile);
|
||||||
|
try {
|
||||||
|
System.out.println("Downloading from https://github.com/Konloch/bytecode-viewer/releases/download/v" + version + "/BytecodeViewer." + version + ".jar");
|
||||||
|
byte[] buffer = new byte[8192];
|
||||||
|
int len;
|
||||||
|
int downloaded = 0;
|
||||||
|
boolean flag = false;
|
||||||
|
BytecodeViewer.showMessage("Downloading the jar in the background, when it's "
|
||||||
|
+ "finished you will be alerted with another message box." + nl + nl + "Expect this to take several minutes.");
|
||||||
|
while ((len = is.read(buffer)) > 0) {
|
||||||
|
fos.write(buffer, 0, len);
|
||||||
|
fos.flush();
|
||||||
|
downloaded += 8192;
|
||||||
|
int mbs = downloaded / 1048576;
|
||||||
|
if (mbs % 5 == 0 && mbs != 0) {
|
||||||
|
if (!flag)
|
||||||
|
System.out.println("Downloaded " + mbs + "MBs so far");
|
||||||
|
flag = true;
|
||||||
|
} else
|
||||||
|
flag = false;
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if (is != null) {
|
||||||
|
is.close();
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
fos.flush();
|
||||||
|
fos.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
System.out.println("Download finished!");
|
||||||
|
BytecodeViewer.showMessage("Download successful! You can find the updated program at " + finalFile.getAbsolutePath());
|
||||||
|
} catch (FileNotFoundException ex) {
|
||||||
|
BytecodeViewer.showMessage("Unable to download, the zip file has not been uploaded yet, "
|
||||||
|
+ "please try again in about 10 minutes.");
|
||||||
|
} catch (Exception ex) {
|
||||||
|
new ExceptionUI(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
new ExceptionUI(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
downloadThread.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue