aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gq/malwarefight/nosession/NoSessionLoadingPlugin.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gq/malwarefight/nosession/NoSessionLoadingPlugin.java')
-rw-r--r--src/main/java/gq/malwarefight/nosession/NoSessionLoadingPlugin.java111
1 files changed, 78 insertions, 33 deletions
diff --git a/src/main/java/gq/malwarefight/nosession/NoSessionLoadingPlugin.java b/src/main/java/gq/malwarefight/nosession/NoSessionLoadingPlugin.java
index b61665f..9e0eb27 100644
--- a/src/main/java/gq/malwarefight/nosession/NoSessionLoadingPlugin.java
+++ b/src/main/java/gq/malwarefight/nosession/NoSessionLoadingPlugin.java
@@ -1,24 +1,28 @@
package gq.malwarefight.nosession;
+import gq.malwarefight.nosession.linux.bwrap.BubblewrapBuilder;
+import gq.malwarefight.nosession.linux.libc.Libc;
import gq.malwarefight.nosession.relaunch.Relaunch;
import gq.malwarefight.nosession.tweaks.initial.InitialTweaker;
import gq.malwarefight.nosession.utils.Utils;
+import net.minecraft.launchwrapper.Launch;
+import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin;
+import org.apache.commons.lang3.SystemUtils;
+import org.apache.logging.log4j.LogManager;
+
+import java.io.File;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
-import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import net.minecraft.launchwrapper.Launch;
-import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin;
+@SuppressWarnings("unused")
@IFMLLoadingPlugin.MCVersion("1.8.9")
@IFMLLoadingPlugin.Name("NoSession trolling")
@IFMLLoadingPlugin.SortingIndex(0)
@@ -39,20 +43,14 @@ public class NoSessionLoadingPlugin implements IFMLLoadingPlugin {
}
@Override
- public void injectData(Map<String, Object> map) {}
+ public void injectData(Map<String, Object> map) {
+ }
@Override
public String getAccessTransformerClass() {
return null;
}
- public static void shutdown() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
- Class<?> shutdown = Class.forName("java.lang.Shutdown");
- Method m = shutdown.getDeclaredMethod("exit", int.class);
- m.setAccessible(true);
- m.invoke(null, 0);
- }
-
@SuppressWarnings("unchecked")
public static void injectTweaker() {
ArrayList<String> tweakClassList = (ArrayList<String>) Launch.blackboard.get("TweakClasses");
@@ -65,7 +63,7 @@ public class NoSessionLoadingPlugin implements IFMLLoadingPlugin {
public static ArrayList<String> constructLaunchArgs(HashMap<String, String> args) {
ArrayList<String> constructedArgs = new ArrayList<>();
- for (Entry<String, String> entry: args.entrySet()) {
+ for (Entry<String, String> entry : args.entrySet()) {
if (entry.getKey().equals("--accessToken")) {
constructedArgs.add(entry.getKey());
constructedArgs.add("<noSessionAccessToken>");
@@ -77,31 +75,75 @@ public class NoSessionLoadingPlugin implements IFMLLoadingPlugin {
return constructedArgs;
}
+ public static void relaunchProcess(Matcher m) throws Exception {
+ RuntimeMXBean rmb = ManagementFactory.getRuntimeMXBean();
+ if (!SystemUtils.IS_OS_LINUX) {
+ ArrayList<String> args = new ArrayList<>();
+ args.add(Utils.getJavaExe());
+ args.add("-cp");
+ args.add(System.getProperty("java.class.path"));
+ args.addAll(rmb.getInputArguments());
+ String newArgs = m.replaceAll("--accessToken <noSessionAccessToken>");
+ args.addAll(Arrays.asList(newArgs.split(" ")));
+ ProcessBuilder processBuilder = new ProcessBuilder(
+ args.toArray(new String[0])
+ ).inheritIO();
+ try {
+ processBuilder.start();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ } else {
+ BubblewrapBuilder builder = new BubblewrapBuilder()
+ .setCommand(Utils.getJavaExe())
+ .unshareAll()
+ .shareNet()
+ .setHostname("nosession-on-top")
+ .readOnlyBind("/usr", "/usr")
+ .mountTmpfs("/tmp")
+ .mountTmpfs("/var")
+ .mountProc("/proc")
+ .mountDev("/dev")
+ .readOnlyBind("/etc/resolv.conf", "/etc/resolv.conf")
+ .addSymlink("usr/lib", "/lib")
+ .addSymlink("usr/lib64", "/lib64")
+ .addSymlink("usr/bin", "/bin")
+ .addSymlink("usr/sbin", "/sbin")
+ .createDir("/run/user/" + Libc.geteuid())
+ .setEnv("XDG_RUNTIME_DIR", "/run/user/" + Libc.geteuid())
+ .readOnlyBind(System.getProperty("java.home"), System.getProperty("java.home"))
+ .bind(Launch.minecraftHome.getAbsolutePath(), Launch.minecraftHome.getAbsolutePath())
+ .bind(Launch.assetsDir.getAbsolutePath(), Launch.assetsDir.getAbsolutePath())
+ .readOnlyBind(Utils.getLibraryPathAsFile(NoSessionLoadingPlugin.class).getAbsolutePath(), Utils.getLibraryPathAsFile(NoSessionLoadingPlugin.class).getAbsolutePath());
+ if (System.getenv("XDG_SESSION_TYPE").equals("x11")) {
+ LogManager.getLogger().warn("X11 detected, enabling X11 passthrough, which could allow keyloggers to work");
+ }
+ builder.bind("/tmp/.X11-unix/X" + System.getenv("DISPLAY").substring(1), "/tmp/.X11-unix/X0")
+ .setEnv("DISPLAY", ":0");
+ // add all the entries on the classpath read only
+ String classPath = rmb.getClassPath();
+ for (String path : classPath.split(System.getProperty("path.separator"))) {
+ File lib = new File(path);
+ builder.readOnlyBind(lib.getAbsolutePath(), lib.getAbsolutePath());
+ }
+ builder.addArgs("-cp", rmb.getClassPath(), "net.minecraft.launchwrapper.Launch");
+ // blackboard erases the type, but we are sure that launchArgs will always be a HashMap<String, String>
+ //noinspection unchecked
+ builder.addArgs(constructLaunchArgs((HashMap<String, String>) Launch.blackboard.get("launchArgs")));
+ builder.addArgs("--tweakClass", "net.minecraftforge.fml.common.launcher.FMLTweaker");
+ builder.build().start();
+ }
+ Utils.shutdown();
+ }
+
static {
addSelfToClassLoader();
try {
- Properties p = Utils.getJavaProperties();
Pattern mcJWT = Pattern.compile("--accessToken +(?<token>eyJhbGciOiJIUzI1NiJ9\\.[A-Za-z0-9-_]*\\.[A-Za-z0-9-_]*)");
- Matcher m = mcJWT.matcher(p.getProperty("sun.java.command"));
+ Matcher m = mcJWT.matcher(System.getProperty("sun.java.command"));
if (m.find()) {
Utils.setToken(m.group("token"));
- RuntimeMXBean rmb = ManagementFactory.getRuntimeMXBean();
- ArrayList<String> args = new ArrayList<>();
- args.add(Utils.getJavaExe(p));
- args.add("-cp");
- args.add(p.getProperty("java.class.path"));
- args.addAll(rmb.getInputArguments());
- String newArgs = m.replaceAll("--accessToken <noSessionAccessToken>");
- args.addAll(Arrays.asList(newArgs.split(" ")));
- ProcessBuilder processBuilder = new ProcessBuilder(
- args.toArray(new String[0])
- ).inheritIO();
- try {
- processBuilder.start();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- shutdown();
+ relaunchProcess(m);
} else {
// test if we can find the token in Launch.blackboard.get("launchArgs")
//noinspection unchecked
@@ -114,6 +156,9 @@ public class NoSessionLoadingPlugin implements IFMLLoadingPlugin {
System.out.println("=======================");
System.out.println("NoSession: relaunching without the token");
System.out.println("=======================");
+ if (SystemUtils.IS_OS_LINUX) {
+ relaunchProcess(m);
+ }
try {
Relaunch.relaunch(constructLaunchArgs(launchArgs));
} catch (Exception e) {