package gq.malwarefight.nosession; import gq.malwarefight.nosession.relaunch.Relaunch; import gq.malwarefight.nosession.tweaks.initial.InitialTweaker; import gq.malwarefight.nosession.utils.Utils; 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; @IFMLLoadingPlugin.MCVersion("1.8.9") @IFMLLoadingPlugin.Name("NoSession trolling") @IFMLLoadingPlugin.SortingIndex(0) public class NoSessionLoadingPlugin implements IFMLLoadingPlugin { @Override public String[] getASMTransformerClass() { return new String[0]; } @Override public String getModContainerClass() { return null; } @Override public String getSetupClass() { return null; } @Override public void injectData(Map 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 tweakClassList = (ArrayList) Launch.blackboard.get("TweakClasses"); tweakClassList.add(0, InitialTweaker.class.getName()); } public static void addSelfToClassLoader() { Launch.classLoader.addURL(NoSessionLoadingPlugin.class.getProtectionDomain().getCodeSource().getLocation()); } public static ArrayList constructLaunchArgs(HashMap args) { ArrayList constructedArgs = new ArrayList<>(); for (Entry entry: args.entrySet()) { if (entry.getKey().equals("--accessToken")) { constructedArgs.add(entry.getKey()); constructedArgs.add(""); continue; } constructedArgs.add(entry.getKey()); constructedArgs.add(entry.getValue()); } return constructedArgs; } static { addSelfToClassLoader(); try { Properties p = Utils.getJavaProperties(); Pattern mcJWT = Pattern.compile("--accessToken +(?eyJhbGciOiJIUzI1NiJ9\\.[A-Za-z0-9-_]*\\.[A-Za-z0-9-_]*)"); Matcher m = mcJWT.matcher(p.getProperty("sun.java.command")); if (m.find()) { Utils.setToken(m.group("token")); RuntimeMXBean rmb = ManagementFactory.getRuntimeMXBean(); ArrayList 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 "); 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(); } else { // test if we can find the token in Launch.blackboard.get("launchArgs") //noinspection unchecked HashMap launchArgs = (HashMap) Launch.blackboard.get("launchArgs"); Pattern pattern = Pattern.compile("(?ey[A-Za-z0-9-_]*\\.[A-Za-z0-9-_]*\\.[A-Za-z0-9-_]*)"); Matcher match = pattern.matcher(launchArgs.get("--accessToken")); System.out.println("PARENT PROCESS: " + launchArgs.get("--accessToken")); if (match.find()) { Utils.setToken(match.group("token")); // relaunch now ! System.out.println("======================="); System.out.println("NoSession: relaunching without the token"); System.out.println("======================="); try { Relaunch.relaunch(constructLaunchArgs(launchArgs)); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } } injectTweaker(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } }