diff --git a/pom.xml b/pom.xml
index 3c85fb4..7640c2e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -112,7 +112,7 @@
2.4.1
- fat
+ jar-with-dependencies
diff --git a/src/main/java/org/parabot/Landing.java b/src/main/java/org/parabot/Landing.java
index 3f1d249..4ca6c03 100644
--- a/src/main/java/org/parabot/Landing.java
+++ b/src/main/java/org/parabot/Landing.java
@@ -112,14 +112,7 @@ public final class Landing {
Directories.setServerCompiledDirectory(new File(args[++i]));
break;
case "-clearcache":
- File[] cache = Directories.getCachePath().listFiles();
- if (cache != null) {
- for (File f : cache) {
- if (f.exists() && f.canWrite()) {
- f.delete();
- }
- }
- }
+ Directories.clearCache();
break;
case "-mac":
byte[] mac = new byte[6];
diff --git a/src/main/java/org/parabot/Test.java b/src/main/java/org/parabot/Test.java
new file mode 100644
index 0000000..706c8fe
--- /dev/null
+++ b/src/main/java/org/parabot/Test.java
@@ -0,0 +1,243 @@
+package org.parabot;
+
+import org.objectweb.asm.tree.MethodNode;
+import org.parabot.core.Context;
+import org.parabot.core.reflect.RefClass;
+import org.parabot.core.reflect.RefMethod;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * Created by jeroen on 01/01/16.
+ */
+public class Test {
+
+ private static Class noparams[] = {};
+ private static Class[] paramShort = new Class[3];
+ private static Class[] paramShort2 = new Class[2];
+
+ static {
+ paramShort[0] = int.class;
+ paramShort2[0] = int.class;
+ paramShort[1] = int.class;
+ paramShort2[1] = long.class;
+ paramShort[2] = int.class;
+ }
+
+ public static void main(String[] args) {
+ System.out.println(C5("_aUm\u0017{\\xXzX|Vz"));
+ }
+
+ public static String C5(final String a) {
+ final int n = 1 << 3;
+ final int n2 = (0x2 ^ 0x5) << 3 ^ 0x1;
+ final int length = a.length();
+ final char[] array = new char[length];
+ int n3;
+ int i = n3 = length - 1;
+ final char[] array2 = array;
+ final char c = (char)n2;
+ final int n4 = n;
+ while (i >= 0) {
+ final char[] array3 = array2;
+ final int n5 = n3;
+ final char char1 = a.charAt(n5);
+ --n3;
+ array3[n5] = (char)(char1 ^ n4);
+ if (n3 < 0) {
+ break;
+ }
+ final char[] array4 = array2;
+ final int n6 = n3--;
+ array4[n6] = (char)(a.charAt(n6) ^ c);
+ i = n3;
+ }
+ return new String(array2);
+ }
+
+ public static String C4(final String a) {
+ final int n = 5 << 4 ^ 3 << 1;
+ final int n2 = (0x2 ^ 0x5) << 3 ^ (0x2 ^ 0x5);
+ final int length = a.length();
+ final char[] array = new char[length];
+ int n3;
+ int i = n3 = length - 1;
+ final char[] array2 = array;
+ final char c = (char)n2;
+ final int n4 = n;
+ while (i >= 0) {
+ final char[] array3 = array2;
+ final int n5 = n3;
+ final char char1 = a.charAt(n5);
+ --n3;
+ array3[n5] = (char)(char1 ^ n4);
+ if (n3 < 0) {
+ break;
+ }
+ final char[] array4 = array2;
+ final int n6 = n3--;
+ array4[n6] = (char)(a.charAt(n6) ^ c);
+ i = n3;
+ }
+ return new String(array2);
+ }
+
+ public static String C2(final String a) {
+ final int n = 4;
+ final int n2 = n << n ^ 2 << 1;
+ final int n3 = 3;
+ final int n4 = n3 << n3 ^ 0x3;
+ final int length = a.length();
+ final char[] array = new char[length];
+ int n5;
+ int i = n5 = length - 1;
+ final char[] array2 = array;
+ final char c = (char)n4;
+ final int n6 = n2;
+ while (i >= 0) {
+ final char[] array3 = array2;
+ final int n7 = n5;
+ final char char1 = a.charAt(n7);
+ --n5;
+ array3[n7] = (char)(char1 ^ n6);
+ if (n5 < 0) {
+ break;
+ }
+ final char[] array4 = array2;
+ final int n8 = n5--;
+ array4[n8] = (char)(a.charAt(n8) ^ c);
+ i = n5;
+ }
+ return new String(array2);
+ }
+
+ public static String C(final String a) {
+ final int n = 2 << 3 ^ (0x2 ^ 0x5);
+ final int n2 = (0x2 ^ 0x5) << 4;
+ final int n3 = 2;
+ final int n4 = n2 ^ (n3 << n3 ^ 0x1);
+ final int length = a.length();
+ final char[] array = new char[length];
+ int n5;
+ int i = n5 = length - 1;
+ final char[] array2 = array;
+ final char c = (char)n4;
+ final int n6 = n;
+ while (i >= 0) {
+ final char[] array3 = array2;
+ final int n7 = n5;
+ final char char1 = a.charAt(n7);
+ --n5;
+ array3[n7] = (char)(char1 ^ n6);
+ if (n5 < 0) {
+ break;
+ }
+ final char[] array4 = array2;
+ final int n8 = n5--;
+ array4[n8] = (char)(a.charAt(n8) ^ c);
+ i = n5;
+ }
+ return new String(array2);
+ }
+
+ public static String C3(final String a) {
+ final int n = (0x3 ^ 0x5) << 4 ^ (0x2 ^ 0x5);
+ final int n2 = (0x3 ^ 0x5) << 4 ^ 3 << 1;
+ final int length = a.length();
+ final char[] array = new char[length];
+ int n3;
+ int i = n3 = length - 1;
+ final char[] array2 = array;
+ final char c = (char)n2;
+ final int n4 = n;
+ while (i >= 0) {
+ final char[] array3 = array2;
+ final int n5 = n3;
+ final char char1 = a.charAt(n5);
+ --n3;
+ array3[n5] = (char)(char1 ^ n4);
+ if (n3 < 0) {
+ break;
+ }
+ final char[] array4 = array2;
+ final int n6 = n3--;
+ array4[n6] = (char)(a.charAt(n6) ^ c);
+ i = n3;
+ }
+ return new String(array2);
+ }
+
+ public static void invokeD(Class clazz, Object client) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, ClassNotFoundException {
+ Class> c = Context.getInstance().getASMClassLoader()
+ .loadClass("a/a/c/q");
+ Method method = c.getDeclaredMethod("d", noparams);
+ if(method != null){
+ method.invoke(c, null);
+ }
+
+ System.out.println("InvokeD");
+ }
+
+ public static void invokeQC(Class clazz, Object client) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, ClassNotFoundException {
+ Class> c = Context.getInstance().getASMClassLoader()
+ .loadClass("a/a/c/q");
+ Method method = c.getDeclaredMethod("C", noparams);
+ if(method != null){
+ method.invoke(c, null);
+ }
+
+ System.out.println("InvokeD");
+ }
+
+ public static void invokeU(Class clazz, Object client) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, ClassNotFoundException, NoSuchFieldException {
+ Method method = Context.getInstance().getClient().getClass().getDeclaredMethod("f", noparams);
+ if(method != null){
+ method.setAccessible(true);
+ method.invoke(Context.getInstance().getClient(), null);
+ }
+
+ Field fieldEF = Context.getInstance().getClient().getClass().getDeclaredField("eF");
+ Field fieldRC = Context.getInstance().getClient().getClass().getDeclaredField("Rc");
+ Field fieldCD = Context.getInstance().getClient().getClass().getDeclaredField("cd");
+
+ fieldEF.set(Context.getInstance().getClient(), 0);
+ fieldRC.set(Context.getInstance().getClient(), 765);
+ fieldCD.set(Context.getInstance().getClient(), 503);
+
+ System.out.println("invokeU");
+ }
+
+ public static void invokeXD(Class clazz, Object client) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, ClassNotFoundException {
+ Class> c = Context.getInstance().getASMClassLoader()
+ .loadClass("a/a/l/x");
+ Method method = c.getDeclaredMethod("d", noparams);
+ if(method != null){
+ method.invoke(c, null);
+ }
+
+
+ System.out.println("invokeXD");
+ }
+
+ /**
+ * Settings the size of the client
+ * @param clazz
+ * @param client
+ * @throws NoSuchMethodException
+ * @throws InvocationTargetException
+ * @throws IllegalAccessException
+ * @throws ClassNotFoundException
+ */
+ public static void invokeTB(Class clazz, Object client) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, ClassNotFoundException {
+ Method method = Context.getInstance().getClient().getClass().getDeclaredMethod("d", paramShort);
+
+ if(method != null){
+ method.setAccessible(true);
+ method.invoke(Context.getInstance().getClient(), 0, 765, 503);
+ }
+
+ System.out.println("invokeTB");
+ }
+}
diff --git a/src/main/java/org/parabot/core/Context.java b/src/main/java/org/parabot/core/Context.java
index 75c5dce..7f71892 100644
--- a/src/main/java/org/parabot/core/Context.java
+++ b/src/main/java/org/parabot/core/Context.java
@@ -1,6 +1,7 @@
package org.parabot.core;
import org.json.simple.parser.JSONParser;
+import org.parabot.Test;
import org.parabot.core.asm.ASMClassLoader;
import org.parabot.core.classpath.ClassPath;
import org.parabot.core.desc.ServerProviderInfo;
@@ -229,6 +230,16 @@ public class Context {
BotDialog.getInstance().validate();
+ try {
+ Test.invokeQC(getClient().getClass(), getClient());
+ Test.invokeD(getClient().getClass(), getClient());
+ Test.invokeU(getClient().getClass(), getClient());
+ Test.invokeXD(getClient().getClass(), getClient());
+ Test.invokeTB(getClient().getClass(), getClient());
+ } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException | ClassNotFoundException | NoSuchFieldException e) {
+// e.printStackTrace(); // This is just for testing purpose
+ }
+
System.setOut(this.defaultOut);
System.setErr(this.defaultErr);
}
diff --git a/src/main/java/org/parabot/core/Directories.java b/src/main/java/org/parabot/core/Directories.java
index 284b5eb..d8223b1 100644
--- a/src/main/java/org/parabot/core/Directories.java
+++ b/src/main/java/org/parabot/core/Directories.java
@@ -7,10 +7,7 @@ import org.parabot.environment.api.utils.StringUtils;
import org.parabot.environment.api.utils.WebUtil;
import javax.swing.*;
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
+import java.io.*;
import java.util.*;
/**
@@ -54,27 +51,39 @@ public class Directories {
File cache;
tempDir = StringUtils.randomString(12);
try {
- if ((cache = new File(Directories.getCachePath(), "cache.json")).exists()){
+ if ((cache = new File(Directories.getSettingsPath(), "cache.json")).exists()){
JSONObject object = (JSONObject) WebUtil.getJsonParser().parse(new FileReader(cache));
String temp;
if ((temp = (String) object.get("homedir")) != null){
cached.put("Home", new File(cached.get("Root"), "/" + temp + "/"));
}
}else{
- cache.createNewFile();
- JSONObject object = new JSONObject();
- object.put("homedir", tempDir);
- FileWriter file = new FileWriter(cache);
- file.write(object.toJSONString());
- file.flush();
- file.close();
- cached.put("Home", new File(cached.get("Root"), "/" + tempDir + "/"));
+ cached.put("Home", createCacheDirectory(cache));
}
} catch (IOException | ParseException ignored) {
cached.put("Home", new File(cached.get("Root"), "/" + tempDir + "/"));
}
- System.out.println("Setting server cache directory to: " + cached.get("Home"));
- cached.get("Home").mkdirs();
+ if (!cached.get("Home").exists()) {
+ cached.get("Home").mkdirs();
+ }
+ System.out.println("Set temporary cache directory to: " + cached.get("Home"));
+ }
+
+ private static File createCacheDirectory(File cacheFile) throws IOException {
+ cacheFile.createNewFile();
+ JSONObject object = new JSONObject();
+ object.put("homedir", tempDir);
+ FileWriter file = new FileWriter(cacheFile);
+ file.write(object.toJSONString());
+ file.flush();
+ file.close();
+
+ File cacheDir = new File(cached.get("Root"), "/" + tempDir + "/");
+ if (!cacheDir.exists()) {
+ cacheDir.mkdirs();
+ }
+
+ return cacheDir;
}
/**
@@ -221,8 +230,9 @@ public class Directories {
* Clears the cache based on the latest modification
*
* @param remove A long that represents the amount of seconds that a file may have since the latest modification
+ * @param force Defines if the cache folder, within user.home, should also be removed
*/
- private static void clearCache(int remove) {
+ public static void clearCache(int remove, boolean force){
File[] cache = getCachePath().listFiles();
if (cache != null) {
for (File f : cache) {
@@ -232,14 +242,59 @@ public class Directories {
}
}
}
+
+ if (force){
+ File cacheFile;
+
+ if ((cacheFile = new File(Directories.getSettingsPath(), "cache.json")).exists()){
+ try {
+ JSONObject jsonObject = (JSONObject) WebUtil.getJsonParser().parse(new FileReader(cacheFile));
+ if (jsonObject != null){
+ Object dirObject;
+ if ((dirObject = jsonObject.get("homedir")) != null) {
+ String dir = (String) dirObject;
+ if (dir.length() > 0) {
+ File cacheDir = new File(cached.get("Root"), "/" + dir + "/");
+ removeDirectory(cacheDir);
+ createCacheDirectory(cacheFile);
+ }
+ }
+ }
+
+ } catch (IOException | ParseException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ private static void clearCache(int remove) {
+ clearCache(remove, false);
}
public static void clearCache() {
- File[] cache = getCachePath().listFiles();
- if (cache != null) {
- for (File f : cache) {
- Core.verbose("Clearing " + f.getName() + " from cache...");
- f.delete();
+ clearCache(0, true);
+ }
+
+ /**
+ * TODO Solve this
+ *
+ * @param file Directory to be removed
+ */
+ private static void removeDirectory(File file){
+ File[] files;
+ if ((files = file.listFiles()) != null){
+ for(File f : files){
+ if (f != null){
+ File[] dirFiles;
+ if (f.isDirectory() && (dirFiles = f.listFiles()) != null && dirFiles.length > 0){
+ System.out.println(dirFiles.length);
+ removeDirectory(f);
+ }else{
+ System.out.println("Deleting " + f.getAbsolutePath());
+ f.delete();
+ }
+ }
}
}
}
diff --git a/src/main/java/org/parabot/core/asm/RedirectClassAdapter.java b/src/main/java/org/parabot/core/asm/RedirectClassAdapter.java
index 9cf9999..fce88ff 100644
--- a/src/main/java/org/parabot/core/asm/RedirectClassAdapter.java
+++ b/src/main/java/org/parabot/core/asm/RedirectClassAdapter.java
@@ -3,6 +3,7 @@ package org.parabot.core.asm;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
+import org.parabot.Test;
import org.parabot.core.Core;
import org.parabot.core.Directories;
import org.parabot.core.asm.redirect.*;
@@ -20,7 +21,7 @@ public class RedirectClassAdapter extends ClassVisitor implements Opcodes {
private String className;
- private static PrintStream str_out, class_out;
+ private static PrintStream str_out, class_out, dec_out;
static {
redirects.put("java/awt/Toolkit", ToolkitRedirect.class);
@@ -40,6 +41,7 @@ public class RedirectClassAdapter extends ClassVisitor implements Opcodes {
if (str_out == null && Core.shouldDump())
try {
str_out = new PrintStream(new FileOutputStream(new File(Directories.getWorkspace(),"strings.txt")));
+ dec_out = new PrintStream(new FileOutputStream(new File(Directories.getWorkspace(),"decrypted_strings.txt")));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
@@ -89,8 +91,15 @@ public class RedirectClassAdapter extends ClassVisitor implements Opcodes {
@Override
public void visitLdcInsn(Object o) {
- if (o instanceof String && str_out != null)
+ if (o instanceof String && str_out != null) {
str_out.println(className + " " + o);
+ if (!className.toLowerCase().contains("parabot")) {
+ dec_out.println(o + ":");
+ dec_out.println("\t" + Test.C((String) o));
+ dec_out.println("\t" + Test.C2((String) o));
+ dec_out.println();
+ }
+ }
super.visitLdcInsn(o);
}