Autodetect Python CLI
Still a WIP
This commit is contained in:
parent
106549658f
commit
b81577c6f0
8 changed files with 161 additions and 119 deletions
|
@ -633,8 +633,6 @@ public class BytecodeViewer
|
|||
|
||||
/**
|
||||
* because Smali and Baksmali System.exit if it failed
|
||||
*
|
||||
* @param i
|
||||
*/
|
||||
public static void exit(int i) { }
|
||||
}
|
||||
|
|
|
@ -193,6 +193,8 @@ public class SettingsSerializer
|
|||
save(BytecodeViewer.viewer.viewPane3.isPaneEditable());
|
||||
|
||||
save(Configuration.javaTools);
|
||||
save(Configuration.python2Extra);
|
||||
save(Configuration.python3Extra);
|
||||
} catch (Exception e) {
|
||||
BytecodeViewer.handleException(e);
|
||||
}
|
||||
|
@ -352,6 +354,8 @@ public class SettingsSerializer
|
|||
BytecodeViewer.viewer.viewPane3.setPaneEditable(asBoolean(133));
|
||||
|
||||
Configuration.javaTools = asString(134);
|
||||
Configuration.python2Extra = asString(135);
|
||||
Configuration.python3Extra = asString(136);
|
||||
} catch (Exception e) {
|
||||
//ignore because errors are expected, first start up and outdated settings.
|
||||
e.printStackTrace();
|
||||
|
|
|
@ -8,6 +8,7 @@ import java.util.Objects;
|
|||
|
||||
import me.konloch.kontainer.io.DiskWriter;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||
import the.bytecode.club.bytecodeviewer.Configuration;
|
||||
import the.bytecode.club.bytecodeviewer.Constants;
|
||||
|
@ -46,7 +47,7 @@ public class KrakatauAssembler extends InternalCompiler
|
|||
|
||||
@Override
|
||||
public byte[] compile(String contents, String name) {
|
||||
if(!ExternalResources.getSingleton().hasSetPythonCommand())
|
||||
if(!ExternalResources.getSingleton().hasSetPython2Command())
|
||||
return null;
|
||||
|
||||
String origName = MiscUtils.randomString(20);
|
||||
|
@ -68,14 +69,19 @@ public class KrakatauAssembler extends InternalCompiler
|
|||
try
|
||||
{
|
||||
BytecodeViewer.sm.pauseBlocking();
|
||||
ProcessBuilder pb = new ProcessBuilder(
|
||||
Configuration.python2,
|
||||
|
||||
String[] pythonCommands = new String[]{Configuration.python2};
|
||||
if(!Configuration.python2Extra.isEmpty())
|
||||
pythonCommands = ArrayUtils.addAll(pythonCommands, Configuration.python2Extra);
|
||||
|
||||
ProcessBuilder pb = new ProcessBuilder(ArrayUtils.addAll(
|
||||
pythonCommands,
|
||||
"-O", //love you storyyeller <3
|
||||
krakatauWorkingDirectory + fs + "assemble.py",
|
||||
"-out",
|
||||
tempDirectory.getAbsolutePath(),
|
||||
tempJ.getAbsolutePath()
|
||||
);
|
||||
));
|
||||
|
||||
Process process = pb.start();
|
||||
BytecodeViewer.createdProcesses.add(process);
|
||||
|
|
|
@ -9,8 +9,8 @@ import java.io.StringWriter;
|
|||
import java.util.Arrays;
|
||||
import java.util.stream.Collectors;
|
||||
import me.konloch.kontainer.io.DiskReader;
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
import the.bytecode.club.bootloader.resource.ExternalResource;
|
||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||
import the.bytecode.club.bytecodeviewer.Configuration;
|
||||
import the.bytecode.club.bytecodeviewer.Constants;
|
||||
|
@ -69,7 +69,7 @@ public class KrakatauDecompiler extends InternalDecompiler
|
|||
|
||||
public String decompileClassNode(File krakatauTempJar, File krakatauTempDir, ClassNode cn)
|
||||
{
|
||||
if(!ExternalResources.getSingleton().hasSetPythonCommand())
|
||||
if(!ExternalResources.getSingleton().hasSetPython2Command())
|
||||
return "You need to set your Python 2.7 path!";
|
||||
|
||||
ExternalResources.getSingleton().rtCheck();
|
||||
|
@ -93,8 +93,13 @@ public class KrakatauDecompiler extends InternalDecompiler
|
|||
|
||||
try {
|
||||
BytecodeViewer.sm.pauseBlocking();
|
||||
ProcessBuilder pb = new ProcessBuilder(
|
||||
Configuration.python2,
|
||||
|
||||
String[] pythonCommands = new String[]{Configuration.python2};
|
||||
if(!Configuration.python2Extra.isEmpty())
|
||||
pythonCommands = ArrayUtils.addAll(pythonCommands, Configuration.python2Extra);
|
||||
|
||||
ProcessBuilder pb = new ProcessBuilder(ArrayUtils.addAll(
|
||||
pythonCommands,
|
||||
"-O", //love you storyyeller <3
|
||||
krakatauWorkingDirectory + fs + "decompile.py",
|
||||
"-skip", //love you storyyeller <3
|
||||
|
@ -104,7 +109,7 @@ public class KrakatauDecompiler extends InternalDecompiler
|
|||
"-out",
|
||||
krakatauTempDir.getAbsolutePath(),
|
||||
cn.name + ".class"
|
||||
);
|
||||
));
|
||||
|
||||
Process process = pb.start();
|
||||
BytecodeViewer.createdProcesses.add(process);
|
||||
|
@ -149,7 +154,7 @@ public class KrakatauDecompiler extends InternalDecompiler
|
|||
|
||||
@Override
|
||||
public String decompileClassNode(ClassNode cn, byte[] b) {
|
||||
if(!ExternalResources.getSingleton().hasSetPythonCommand())
|
||||
if(!ExternalResources.getSingleton().hasSetPython2Command())
|
||||
return "You need to set your Python 2.7 path!";
|
||||
|
||||
if (Configuration.rt.isEmpty()) {
|
||||
|
@ -173,8 +178,13 @@ public class KrakatauDecompiler extends InternalDecompiler
|
|||
|
||||
try {
|
||||
BytecodeViewer.sm.pauseBlocking();
|
||||
ProcessBuilder pb = new ProcessBuilder(
|
||||
Configuration.python2,
|
||||
|
||||
String[] pythonCommands = new String[]{Configuration.python2};
|
||||
if(!Configuration.python2Extra.isEmpty())
|
||||
pythonCommands = ArrayUtils.addAll(pythonCommands, Configuration.python2Extra);
|
||||
|
||||
ProcessBuilder pb = new ProcessBuilder(ArrayUtils.addAll(
|
||||
pythonCommands,
|
||||
"-O", //love you storyyeller <3
|
||||
krakatauWorkingDirectory + fs + "decompile.py",
|
||||
"-skip", //love you storyyeller <3
|
||||
|
@ -184,7 +194,7 @@ public class KrakatauDecompiler extends InternalDecompiler
|
|||
"-out",
|
||||
tempDirectory.getAbsolutePath(),
|
||||
cn.name + ".class"
|
||||
);
|
||||
));
|
||||
|
||||
Process process = pb.start();
|
||||
BytecodeViewer.createdProcesses.add(process);
|
||||
|
@ -232,7 +242,7 @@ public class KrakatauDecompiler extends InternalDecompiler
|
|||
|
||||
@Override
|
||||
public void decompileToZip(String sourceJar, String zipName) {
|
||||
if(!ExternalResources.getSingleton().hasSetPythonCommand())
|
||||
if(!ExternalResources.getSingleton().hasSetPython2Command())
|
||||
return;
|
||||
|
||||
ExternalResources.getSingleton().rtCheck();
|
||||
|
@ -250,8 +260,13 @@ public class KrakatauDecompiler extends InternalDecompiler
|
|||
|
||||
try {
|
||||
BytecodeViewer.sm.pauseBlocking();
|
||||
ProcessBuilder pb = new ProcessBuilder(
|
||||
Configuration.python2,
|
||||
|
||||
String[] pythonCommands = new String[]{Configuration.python2};
|
||||
if(!Configuration.python2Extra.isEmpty())
|
||||
pythonCommands = ArrayUtils.addAll(pythonCommands, Configuration.python2Extra);
|
||||
|
||||
ProcessBuilder pb = new ProcessBuilder(ArrayUtils.addAll(
|
||||
pythonCommands,
|
||||
"-O", //love you storyyeller <3
|
||||
krakatauWorkingDirectory + fs + "decompile.py",
|
||||
"-skip", //love you storyyeller <3
|
||||
|
@ -261,7 +276,7 @@ public class KrakatauDecompiler extends InternalDecompiler
|
|||
"-out",
|
||||
tempDirectory.getAbsolutePath(),
|
||||
tempJar.getAbsolutePath()
|
||||
);
|
||||
));
|
||||
|
||||
Process process = pb.start();
|
||||
BytecodeViewer.createdProcesses.add(process);
|
||||
|
|
|
@ -7,6 +7,7 @@ import java.io.InputStreamReader;
|
|||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import me.konloch.kontainer.io.DiskReader;
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||
import the.bytecode.club.bytecodeviewer.Configuration;
|
||||
|
@ -48,7 +49,7 @@ public class KrakatauDisassembler extends InternalDecompiler
|
|||
{
|
||||
@Override
|
||||
public String decompileClassNode(ClassNode cn, byte[] b) {
|
||||
if(!ExternalResources.getSingleton().hasSetPythonCommand())
|
||||
if(!ExternalResources.getSingleton().hasSetPython2Command())
|
||||
return "You need to set your Python 2.7 path!";
|
||||
|
||||
String s = ExceptionUI.SEND_STACKTRACE_TO_NL;
|
||||
|
@ -60,8 +61,13 @@ public class KrakatauDisassembler extends InternalDecompiler
|
|||
|
||||
try {
|
||||
BytecodeViewer.sm.pauseBlocking();
|
||||
ProcessBuilder pb = new ProcessBuilder(
|
||||
Configuration.python2,
|
||||
|
||||
String[] pythonCommands = new String[]{Configuration.python2};
|
||||
if(!Configuration.python2Extra.isEmpty())
|
||||
pythonCommands = ArrayUtils.addAll(pythonCommands, Configuration.python2Extra);
|
||||
|
||||
ProcessBuilder pb = new ProcessBuilder(ArrayUtils.addAll(
|
||||
pythonCommands,
|
||||
"-O", //love you storyyeller <3
|
||||
krakatauWorkingDirectory + fs + "disassemble.py",
|
||||
"-path",
|
||||
|
@ -69,7 +75,7 @@ public class KrakatauDisassembler extends InternalDecompiler
|
|||
"-out",
|
||||
tempDirectory.getAbsolutePath(),
|
||||
cn.name + ".class"
|
||||
);
|
||||
));
|
||||
|
||||
Process process = pb.start();
|
||||
BytecodeViewer.createdProcesses.add(process);
|
||||
|
@ -113,7 +119,7 @@ public class KrakatauDisassembler extends InternalDecompiler
|
|||
|
||||
@Override
|
||||
public void decompileToZip(String sourceJar, String zipName) {
|
||||
if(!ExternalResources.getSingleton().hasSetPythonCommand())
|
||||
if(!ExternalResources.getSingleton().hasSetPython2Command())
|
||||
return;
|
||||
|
||||
String ran = MiscUtils.randomString(32);
|
||||
|
@ -124,8 +130,13 @@ public class KrakatauDisassembler extends InternalDecompiler
|
|||
|
||||
try {
|
||||
BytecodeViewer.sm.pauseBlocking();
|
||||
ProcessBuilder pb = new ProcessBuilder(
|
||||
Configuration.python2,
|
||||
|
||||
String[] pythonCommands = new String[]{Configuration.python2};
|
||||
if(!Configuration.python2Extra.isEmpty())
|
||||
pythonCommands = ArrayUtils.addAll(pythonCommands, Configuration.python2Extra);
|
||||
|
||||
ProcessBuilder pb = new ProcessBuilder(ArrayUtils.addAll(
|
||||
pythonCommands,
|
||||
"-O", //love you storyyeller <3
|
||||
krakatauWorkingDirectory + fs + "disassemble.py",
|
||||
"-path",
|
||||
|
@ -133,7 +144,7 @@ public class KrakatauDisassembler extends InternalDecompiler
|
|||
"-out",
|
||||
tempDirectory.getAbsolutePath(),
|
||||
tempJar.getAbsolutePath()
|
||||
);
|
||||
));
|
||||
|
||||
Process process = pb.start();
|
||||
BytecodeViewer.createdProcesses.add(process);
|
||||
|
|
|
@ -34,8 +34,8 @@ public class HTMLPane extends JEditorPane
|
|||
text = text.replace("{java}", Configuration.java);
|
||||
text = text.replace("{javac}", Configuration.javac);
|
||||
text = text.replace("{bcvDir}", BCVDir.getAbsolutePath());
|
||||
text = text.replace("{python}", Configuration.python2);
|
||||
text = text.replace("{python3}", Configuration.python3);
|
||||
text = text.replace("{python}", Configuration.python2+" " + Configuration.python2Extra);
|
||||
text = text.replace("{python3}", Configuration.python3 + " " + Configuration.python3Extra);
|
||||
text = text.replace("{rt}", Configuration.rt);
|
||||
text = text.replace("{lib}", Configuration.library);
|
||||
text = text.replace("{krakatauVersion}", krakatauVersion);
|
||||
|
|
|
@ -49,36 +49,21 @@ public class ExternalResources
|
|||
}
|
||||
|
||||
/**
|
||||
* Auto-detect the Java command
|
||||
* Auto-detect Java via command-line
|
||||
*/
|
||||
public String getJavaCommand(boolean blockTillSelected)
|
||||
{
|
||||
boolean empty = Configuration.java.isEmpty();
|
||||
|
||||
if(!empty)
|
||||
if(!Configuration.java.isEmpty())
|
||||
return Configuration.java;
|
||||
|
||||
try
|
||||
{
|
||||
BytecodeViewer.sm.pauseBlocking();
|
||||
//read the version output to verify it exists
|
||||
ProcessBuilder pb = new ProcessBuilder("java", "-version");
|
||||
Process p = pb.start();
|
||||
p.waitFor();
|
||||
|
||||
if(readProcess(p).toLowerCase().contains("java version"))
|
||||
{
|
||||
Configuration.java = "java"; //java is set
|
||||
//check CLI for java
|
||||
testCommand(new String[]{"java", "-version"}, "java version", ()->{
|
||||
Configuration.java = "java";
|
||||
});
|
||||
if(!Configuration.java.isEmpty())
|
||||
return Configuration.java;
|
||||
}
|
||||
}
|
||||
catch (Exception e) { } //ignore
|
||||
finally
|
||||
{
|
||||
BytecodeViewer.sm.resumeBlocking();
|
||||
}
|
||||
|
||||
//TODO auto-detect the Java path
|
||||
//TODO auto-detect the JRE path
|
||||
boolean block = true;
|
||||
while (Configuration.java.isEmpty() && block)
|
||||
{
|
||||
|
@ -92,7 +77,7 @@ public class ExternalResources
|
|||
}
|
||||
|
||||
/**
|
||||
* Check if the python command has been set
|
||||
* Check if java tools has been set
|
||||
*/
|
||||
public boolean hasJavaToolsSet()
|
||||
{
|
||||
|
@ -100,7 +85,7 @@ public class ExternalResources
|
|||
}
|
||||
|
||||
/**
|
||||
* Auto-detect the Java command
|
||||
* Auto-detect Java tools.jar
|
||||
*/
|
||||
public String getJavaTools(boolean blockTillSelected)
|
||||
{
|
||||
|
@ -109,7 +94,7 @@ public class ExternalResources
|
|||
if(!empty)
|
||||
return Configuration.javaTools;
|
||||
|
||||
//TODO auto-detect the Java path
|
||||
//TODO auto-detect the JDK path
|
||||
boolean block = true;
|
||||
while (Configuration.javaTools.isEmpty() && block)
|
||||
{
|
||||
|
@ -123,75 +108,44 @@ public class ExternalResources
|
|||
}
|
||||
|
||||
/**
|
||||
* Check if the python command has been set
|
||||
* Check if the python 2 command has been set
|
||||
*/
|
||||
public boolean hasSetPythonCommand()
|
||||
public boolean hasSetPython2Command()
|
||||
{
|
||||
return !getPythonCommand(false).isEmpty();
|
||||
return !getPython2Command(false).isEmpty();
|
||||
}
|
||||
|
||||
/**
|
||||
* Auto-detect the Java command
|
||||
* Auto-detect python 2 via command-line
|
||||
*/
|
||||
public String getPythonCommand(boolean blockTillSelected)
|
||||
public String getPython2Command(boolean blockTillSelected)
|
||||
{
|
||||
boolean empty = Configuration.java.isEmpty();
|
||||
if(!Configuration.python2.isEmpty())
|
||||
return Configuration.python2;
|
||||
|
||||
if(!empty)
|
||||
return Configuration.java;
|
||||
|
||||
//check using python CLI flag
|
||||
try
|
||||
{
|
||||
BytecodeViewer.sm.pauseBlocking();
|
||||
|
||||
//read the version output to verify python 2
|
||||
ProcessBuilder pb = new ProcessBuilder("python", "-2", "--version");
|
||||
Process p = pb.start();
|
||||
p.waitFor();
|
||||
|
||||
//set python path
|
||||
if(readProcess(p).toLowerCase().contains("python 2"))
|
||||
{
|
||||
testCommand(new String[]{"python", "-2", "--version"}, "python 2", ()->{
|
||||
Configuration.python2 = "python";
|
||||
Configuration.python2Extra = "-2";
|
||||
});
|
||||
if(!Configuration.python2.isEmpty())
|
||||
return Configuration.python2;
|
||||
}
|
||||
}
|
||||
catch (Exception e) { } //ignore
|
||||
finally
|
||||
{
|
||||
BytecodeViewer.sm.resumeBlocking();
|
||||
}
|
||||
|
||||
|
||||
//check if 'python' command is bound as python 2.X
|
||||
try
|
||||
{
|
||||
BytecodeViewer.sm.pauseBlocking();
|
||||
|
||||
//read the version output to verify python 2
|
||||
ProcessBuilder pb = new ProcessBuilder("python", "--version");
|
||||
Process p = pb.start();
|
||||
p.waitFor();
|
||||
|
||||
//set python path
|
||||
if(readProcess(p).toLowerCase().contains("python 2"))
|
||||
{
|
||||
testCommand(new String[]{"python", "--version"}, "python 2", ()->{
|
||||
Configuration.python2 = "python";
|
||||
});
|
||||
if(!Configuration.python2.isEmpty())
|
||||
return Configuration.python2;
|
||||
}
|
||||
}
|
||||
catch (Exception e) { } //ignore
|
||||
finally
|
||||
{
|
||||
BytecodeViewer.sm.resumeBlocking();
|
||||
}
|
||||
|
||||
//TODO auto-detect the Python path
|
||||
|
||||
//TODO auto-detect the Python path (C:/Program Files/Python)
|
||||
boolean block = true;
|
||||
while (Configuration.python2.isEmpty() && block)
|
||||
{
|
||||
BytecodeViewer.showMessage("You need to set your Python (or PyPy for speed) 2.7 executable path.");
|
||||
BytecodeViewer.showMessage("You need to set your Python 2.7 (or PyPy 2.7 for speed) executable path.");
|
||||
selectPython2();
|
||||
block = !blockTillSelected; //signal block flag off
|
||||
}
|
||||
|
@ -199,6 +153,39 @@ public class ExternalResources
|
|||
return Configuration.python2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the python 3 command has been set
|
||||
*/
|
||||
public boolean hasSetPython3Command()
|
||||
{
|
||||
return !getPython3Command(false).isEmpty();
|
||||
}
|
||||
|
||||
/**
|
||||
* Auto-detect python 3 via command-line
|
||||
*/
|
||||
public String getPython3Command(boolean blockTillSelected)
|
||||
{
|
||||
//check if 'python' command is bound as python 2.X
|
||||
testCommand(new String[]{"python", "--version"}, "python 3", ()->{
|
||||
Configuration.python3 = "python";
|
||||
});
|
||||
if(!Configuration.python3.isEmpty())
|
||||
return Configuration.python3;
|
||||
|
||||
|
||||
//TODO auto-detect the Python path (C:/Program Files/Python)
|
||||
boolean block = true;
|
||||
while (Configuration.python3.isEmpty() && block)
|
||||
{
|
||||
BytecodeViewer.showMessage("You need to set your Python 3.x (or PyPy 3.x for speed) executable path.");
|
||||
selectPython3();
|
||||
block = !blockTillSelected; //signal block flag off
|
||||
}
|
||||
|
||||
return Configuration.python3;
|
||||
}
|
||||
|
||||
//rt.jar check
|
||||
public synchronized void rtCheck()
|
||||
{
|
||||
|
@ -220,7 +207,7 @@ public class ExternalResources
|
|||
public void selectPython2()
|
||||
{
|
||||
final File file = DialogueUtils.fileChooser("Select Python 2.7 Executable",
|
||||
"Python (Or PyPy for speed) 2.7 Executable",
|
||||
"Python 2.7 (Or PyPy 2.7 for speed) Executable",
|
||||
"everything");
|
||||
|
||||
if(file == null)
|
||||
|
@ -233,7 +220,7 @@ public class ExternalResources
|
|||
public void selectPython3()
|
||||
{
|
||||
final File file = DialogueUtils.fileChooser("Select Python 3.x Executable",
|
||||
"Python (Or PyPy for speed) 3.x Executable",
|
||||
"Python 3.x (Or PyPy 3.x for speed) Executable",
|
||||
"everything");
|
||||
|
||||
if(file == null)
|
||||
|
@ -344,6 +331,33 @@ public class ExternalResources
|
|||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to test the command-line for compatibility
|
||||
*/
|
||||
public void testCommand(String[] command, String matchingText, Runnable onMatch)
|
||||
{
|
||||
try
|
||||
{
|
||||
BytecodeViewer.sm.pauseBlocking();
|
||||
|
||||
//read the version output
|
||||
ProcessBuilder pb = new ProcessBuilder(command);
|
||||
Process p = pb.start();
|
||||
p.waitFor();
|
||||
|
||||
//check for matching text
|
||||
if(readProcess(p).toLowerCase().contains(matchingText))
|
||||
{
|
||||
onMatch.run();
|
||||
}
|
||||
}
|
||||
catch (Exception e) { } //ignore
|
||||
finally
|
||||
{
|
||||
BytecodeViewer.sm.resumeBlocking();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @author https://stackoverflow.com/a/16714180
|
||||
*/
|
||||
|
@ -352,6 +366,7 @@ public class ExternalResources
|
|||
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
|
||||
StringBuilder builder = new StringBuilder();
|
||||
String line;
|
||||
|
||||
while ((line = reader.readLine()) != null)
|
||||
{
|
||||
builder.append(line);
|
||||
|
|
|
@ -40,15 +40,8 @@ public class Enjarify {
|
|||
* @param output the output .jar file
|
||||
*/
|
||||
public static synchronized void apk2Jar(File input, File output) {
|
||||
if (Configuration.python3.isEmpty()) {
|
||||
BytecodeViewer.showMessage("You need to set your Python (or PyPy for speed) 3.x executable path.");
|
||||
ExternalResources.getSingleton().selectPython3();
|
||||
}
|
||||
|
||||
if (Configuration.python3.isEmpty()) {
|
||||
BytecodeViewer.showMessage("You need to set Python!");
|
||||
if(!ExternalResources.getSingleton().hasSetPython3Command())
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
BytecodeViewer.sm.pauseBlocking();
|
||||
|
|
Loading…
Reference in a new issue