aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gq/malwarefight/nosession/mixin
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gq/malwarefight/nosession/mixin')
-rw-r--r--src/main/java/gq/malwarefight/nosession/mixin/BlankTweaker.java29
-rw-r--r--src/main/java/gq/malwarefight/nosession/mixin/InitialTweaker.java209
-rw-r--r--src/main/java/gq/malwarefight/nosession/mixin/L2Tweaker.java68
-rw-r--r--src/main/java/gq/malwarefight/nosession/mixin/Utils.java122
-rw-r--r--src/main/java/gq/malwarefight/nosession/mixin/asm/ReplacingMethodVisitor.java22
-rw-r--r--src/main/java/gq/malwarefight/nosession/mixin/client/YggdrasilSessionMixin.java5
6 files changed, 3 insertions, 452 deletions
diff --git a/src/main/java/gq/malwarefight/nosession/mixin/BlankTweaker.java b/src/main/java/gq/malwarefight/nosession/mixin/BlankTweaker.java
deleted file mode 100644
index 2c9109b..0000000
--- a/src/main/java/gq/malwarefight/nosession/mixin/BlankTweaker.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package gq.malwarefight.nosession.mixin;
-
-import net.minecraft.launchwrapper.ITweaker;
-import net.minecraft.launchwrapper.LaunchClassLoader;
-
-import java.io.File;
-import java.util.List;
-
-public class BlankTweaker implements ITweaker {
- @Override
- public void acceptOptions(List<String> args, File gameDir, File assetsDir, String profile) {
-
- }
-
- @Override
- public void injectIntoClassLoader(LaunchClassLoader classLoader) {
-
- }
-
- @Override
- public String getLaunchTarget() {
- return null;
- }
-
- @Override
- public String[] getLaunchArguments() {
- return new String[0];
- }
-}
diff --git a/src/main/java/gq/malwarefight/nosession/mixin/InitialTweaker.java b/src/main/java/gq/malwarefight/nosession/mixin/InitialTweaker.java
deleted file mode 100644
index 51425fc..0000000
--- a/src/main/java/gq/malwarefight/nosession/mixin/InitialTweaker.java
+++ /dev/null
@@ -1,209 +0,0 @@
-package gq.malwarefight.nosession.mixin;
-
-import com.google.common.annotations.Beta;
-import com.google.common.collect.ForwardingMultimap;
-import com.google.gson.Gson;
-import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService;
-import net.minecraft.launchwrapper.ITweaker;
-import net.minecraft.launchwrapper.Launch;
-import net.minecraft.launchwrapper.LaunchClassLoader;
-import net.minecraft.launchwrapper.LogWrapper;
-import org.apache.commons.io.ByteOrderMark;
-import org.apache.commons.lang3.CharEncoding;
-import org.apache.commons.lang3.Validate;
-import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.objectweb.asm.Opcodes;
-import org.spongepowered.asm.launch.MixinBootstrap;
-import org.spongepowered.asm.mixin.MixinEnvironment;
-import org.spongepowered.asm.mixin.Mixins;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.Socket;
-import java.net.URISyntaxException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.FileAlreadyExistsException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Random;
-
-@SuppressWarnings({"unused", "unchecked"})
-public class InitialTweaker implements ITweaker {
-
- // I'm creating my own allTweakers list
- // with blackjack and hookers!
- public final ArrayList<ITweaker> allTweakers = new ArrayList<>();
-
- public InitialTweaker() {}
-
- public String getLibraryPath(Class<?> c) throws URISyntaxException {
- return new File(c.getProtectionDomain().getCodeSource().getLocation().toURI()).getAbsolutePath();
- }
-
- public String getClasspath() throws URISyntaxException {
- return String.join(
- System.getProperty("path.separator"),
- getLibraryPath(InitialTweaker.class),
- getLibraryPath(YggdrasilAuthenticationService.class),
- getLibraryPath(Gson.class),
- getLibraryPath(LogManager.class),
- getLibraryPath(Validate.class),
- getLibraryPath(ForwardingMultimap.class),
- getLibraryPath(Beta.class),
- getLibraryPath(CharEncoding.class),
- getLibraryPath(ByteOrderMark.class),
- getLibraryPath(Logger.class),
- getLibraryPath(Opcodes.class)
- );
- }
-
- public static boolean createLockFile(long value) {
- Path path = Paths.get(System.getProperty("java.io.tmpdir"), "NoSessionLock" + value);
- try {
- Files.createFile(path);
- } catch (FileAlreadyExistsException e) {
- System.out.println("You won the lottery! Two NoSession instances used the same ID. The chance that a new NoSession instance uses the same ID as an old one is (NoSession instances) / 2^64");
- return false;
- } catch (IOException e) {
- LogManager.getLogger().warn("Failed to create lockfile " + e.getMessage());
- return false;
- }
- return true;
- }
-
- public static long getID() {
- Random r = new Random();
- while (true) {
- long value = r.nextLong();
- if (createLockFile(value)) {
- Runtime.getRuntime().addShutdownHook(
- new Thread(() -> {
- try {
- Files.delete(Paths.get(System.getProperty("java.io.tmpdir"), "NoSessionLock" + value));
- } catch (Exception ignored) {}
- })
- );
- return value;
- }
- }
- }
-
- public void setToken(String token) throws IOException, URISyntaxException {
- long value = getID();
- Utils.ID = value;
- File javaExecutable = Paths.get(System.getProperty("java.home"), "bin", "java").toFile();
- ProcessBuilder processBuilder = new ProcessBuilder(
- javaExecutable.getAbsolutePath(), "-cp", getClasspath(), "gq.malwarefight.tokenapp.Main", Long.toString(value)
- );
- processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT).redirectError(ProcessBuilder.Redirect.INHERIT);
- Process c = processBuilder.start();
- c.getOutputStream().write((token + "\n").getBytes(StandardCharsets.UTF_8));
- c.getOutputStream().flush();
- Runtime.getRuntime().addShutdownHook(
- new Thread(() -> {
- try {
- Socket socket = Utils.getProperSocket();
- socket.getOutputStream().write("fullquit\n".getBytes(StandardCharsets.UTF_8));
- socket.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- })
- );
- }
-
- /**
- * This handles the launch arguments passed towards minecraft
- * @param args The launch arguments
- * @param gameDir The game directory (ie: .minecraft)
- * @param assetsDir The assets directory
- * @param profile The game profile
- */
- @Override
- @SuppressWarnings("unchecked")
- public final void acceptOptions(List<String> args, File gameDir, File assetsDir, String profile) {
- ArrayList<String> argsCopy = new ArrayList<>(args);
- for (int i = 0; i < argsCopy.size(); i++) {
- if (argsCopy.get(i).equals("--accessToken")) {
- try {
- setToken(args.get(i + 1));
- } catch (IOException | URISyntaxException e) {
- throw new RuntimeException(e);
- }
- argsCopy.set(i + 1, "<noSessionAccessToken>");
- }
- }
- boolean any = false;
- // in order to prevent other mods from seeing the true list of args with the token
- // we will just call all the other tweakers from here
- ArrayList<ITweaker> tweakers = (ArrayList<ITweaker>) Launch.blackboard.get("Tweaks");
- for (final ITweaker tweaker : tweakers) {
- if (tweaker == this)
- continue;
-
- LogWrapper.log(Level.INFO, "Calling tweak class %s", tweaker.getClass().getName());
- tweaker.acceptOptions(argsCopy, gameDir, assetsDir, profile);
- tweaker.injectIntoClassLoader(Launch.classLoader);
- allTweakers.add(tweaker);
- tweakers.set(tweakers.indexOf(tweaker), new BlankTweaker());
- any = true;
- }
- if (any) {
- ((ArrayList<String>) Launch.blackboard.get("TweakClasses")).add(0,
- Utils.getUniqueClassName()
- );
- }
- }
-
- /**
- * Inject into the MC class loader
- * @param classLoader The class loader
- */
- @Override
- public final void injectIntoClassLoader(LaunchClassLoader classLoader) {
- MixinBootstrap.init();
- MixinEnvironment environment = MixinEnvironment.getDefaultEnvironment();
- Mixins.addConfiguration("mixins.nosession.json");
- // Check if the obfuscation context is null
- if (environment.getObfuscationContext() == null) {
- environment.setObfuscationContext("notch");
- }
- // This is a client side, client :)
- environment.setSide(MixinEnvironment.Side.CLIENT);
- }
-
- @Override
- public String getLaunchTarget() {
- return MixinBootstrap.getPlatform().getLaunchTarget();
- }
-
- @Override
- public String[] getLaunchArguments() {
-
- ArrayList<String> argsFromOurTweakers = new ArrayList<>();
-
- for (ITweaker i: allTweakers) {
- argsFromOurTweakers.addAll(Arrays.asList(i.getLaunchArguments()));
- }
-
- //noinspection unchecked
- ArrayList<String> launchArgs = (ArrayList<String>) Launch.blackboard.get("ArgumentList");
- for (int i = 0; i < launchArgs.size(); i++) {
- if (launchArgs.get(i).equals("--accessToken")) {
- launchArgs.set(i + 1, "<noSessionAccessToken>");
- }
- }
- if (!launchArgs.contains("--accessToken")) {
- argsFromOurTweakers.add("--accessToken");
- argsFromOurTweakers.add("<noSessionAccessToken>");
- }
-
- return argsFromOurTweakers.toArray(new String[0]);
- }
-}
diff --git a/src/main/java/gq/malwarefight/nosession/mixin/L2Tweaker.java b/src/main/java/gq/malwarefight/nosession/mixin/L2Tweaker.java
deleted file mode 100644
index 8736ca4..0000000
--- a/src/main/java/gq/malwarefight/nosession/mixin/L2Tweaker.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package gq.malwarefight.nosession.mixin;
-
-import net.minecraft.launchwrapper.ITweaker;
-import net.minecraft.launchwrapper.Launch;
-import net.minecraft.launchwrapper.LaunchClassLoader;
-import net.minecraft.launchwrapper.LogWrapper;
-import org.apache.logging.log4j.Level;
-import org.spongepowered.asm.launch.MixinBootstrap;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-@SuppressWarnings("unused") // is used, but not mentioned directly
-public class L2Tweaker implements ITweaker {
-
- public final ArrayList<ITweaker> allTweakers = new ArrayList<>();
-
- @Override
- @SuppressWarnings("unchecked")
- public void acceptOptions(List<String> args, File gameDir, File assetsDir, String profile) {
- ArrayList<String> argsCopy = new ArrayList<>(args);
- for (int i = 0; i < argsCopy.size(); i++) {
- if (argsCopy.get(i).equals("--accessToken")) {
- argsCopy.set(i + 1, "<noSessionAccessToken>");
- }
- }
-
- boolean any = false;
- ArrayList<ITweaker> tweakers = (ArrayList<ITweaker>) Launch.blackboard.get("Tweaks");
- // in order to prevent other mods from seeing the true list of args with the token
- // we will just call all the other tweakers from here
- for (final ITweaker tweaker : tweakers) {
- if (tweaker == this)
- continue;
- LogWrapper.log(Level.INFO, "Calling tweak class %s", tweaker.getClass().getName());
- tweaker.acceptOptions(argsCopy, gameDir, assetsDir, profile);
- tweaker.injectIntoClassLoader(Launch.classLoader);
- allTweakers.add(tweaker);
- tweakers.set(tweakers.indexOf(tweaker), new BlankTweaker());
- any = true;
- }
- if (any) {
- ((ArrayList<String>) Launch.blackboard.get("TweakClasses")).add(0,
- Utils.getUniqueClassName()
- );
- }
- }
-
- @Override
- public void injectIntoClassLoader(LaunchClassLoader classLoader) {}
-
- @Override
- public String getLaunchTarget() {
- return MixinBootstrap.getPlatform().getLaunchTarget();
- }
-
- @Override
- public String[] getLaunchArguments() {
- ArrayList<String> argsFromOurTweakers = new ArrayList<>();
-
- for (ITweaker i: allTweakers) {
- argsFromOurTweakers.addAll(Arrays.asList(i.getLaunchArguments()));
- }
- return argsFromOurTweakers.toArray(new String[0]);
- }
-} \ No newline at end of file
diff --git a/src/main/java/gq/malwarefight/nosession/mixin/Utils.java b/src/main/java/gq/malwarefight/nosession/mixin/Utils.java
deleted file mode 100644
index 2aaec37..0000000
--- a/src/main/java/gq/malwarefight/nosession/mixin/Utils.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package gq.malwarefight.nosession.mixin;
-
-import gq.malwarefight.nosession.mixin.asm.ReplacingMethodVisitor;
-import net.minecraft.launchwrapper.Launch;
-import org.objectweb.asm.*;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-
-public class Utils {
- static int num = 0;
- static int PORT = -1;
- static long ID = -1;
- private static final int BASE_PORT = 47777;
-
- public static byte[] read(InputStream i, Character delimiter) throws IOException {
- byte[] buffer = new byte[512];
- int index = 0;
- while (true) {
- int in = i.read();
- if (in == -1 || (delimiter != null && delimiter == in)) {
- return Arrays.copyOfRange(buffer, 0, index);
- }
- if (index == buffer.length) {
- // grow the buffer
- byte[] newBuffer = new byte[buffer.length * 2];
- System.arraycopy(
- buffer, 0, newBuffer, 0, buffer.length
- );
- buffer = newBuffer;
- }
- buffer[index] = (byte) in;
- index++;
- }
- }
-
- public static String readString(InputStream i, Character delimiter) throws IOException {
- return new String(read(i, delimiter), StandardCharsets.UTF_8);
- }
-
- public static void createClass(byte[] classArray, String name) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
- Method m = ClassLoader.class.getDeclaredMethod(
- "defineClass", String.class, byte[].class, int.class, int.class);
- m.setAccessible(true);
- m.invoke(Launch.classLoader, name, classArray, 0, classArray.length);
- }
-
- public static String getUniqueClassName() {
-
- String className = "gq.malwarefight.nosession.mixin.L2TweakerClone" + num;
-
- byte[] L2TweakerBytes;
- try {
- //noinspection ConstantConditions
- L2TweakerBytes = read(Utils.class.getResourceAsStream("/gq/malwarefight/nosession/mixin/L2Tweaker.class"), null);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
-
- ClassReader cr = new ClassReader(L2TweakerBytes);
- ClassWriter cw = new ClassWriter(cr, 0);
- cr.accept(new ClassVisitor(Opcodes.ASM5, cw) {
- @Override
- public void visit(int version, int access, String name,
- String signature, String superName, String[] interfaces) {
- super.visit(version, access, className.replace(".", "/"), signature, superName, interfaces);
- }
-
- @Override
- public MethodVisitor visitMethod(int access, String name, String desc,
- String signature, String[] exceptions) {
- return new ReplacingMethodVisitor(super.visitMethod(access, name, desc, signature, exceptions), L2Tweaker.class.getName().replace(".", "/"), className.replace(".", "/"));
- }
- }, 0);
-
- byte[] code = cw.toByteArray();
- try {
- createClass(code, className);
- } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
- throw new RuntimeException(e);
- }
- num++;
- return className;
- }
-
- public static Socket getProperSocket() {
- if (PORT == -1) {
- Socket socket = null;
- int port = 0;
- for (int i = BASE_PORT; i < BASE_PORT + 10; i++) {
- try {
- socket = new Socket();
- socket.connect(new InetSocketAddress(InetAddress.getLoopbackAddress(), i));
- socket.getOutputStream().write("id\n".getBytes(StandardCharsets.UTF_8));
- String value = readString(socket.getInputStream(), '\n');
- if (value.equals(Long.toString(ID))) {
- port = i;
- break;
- }
- } catch (Exception ignored) {}
- }
- PORT = port;
- return socket;
- } else {
- try {
- Socket socket = new Socket();
- socket.connect(new InetSocketAddress(InetAddress.getLoopbackAddress(), PORT));
- return socket;
- } catch (IOException e) {
- PORT = -1;
- return getProperSocket();
- }
- }
- }
-}
diff --git a/src/main/java/gq/malwarefight/nosession/mixin/asm/ReplacingMethodVisitor.java b/src/main/java/gq/malwarefight/nosession/mixin/asm/ReplacingMethodVisitor.java
deleted file mode 100644
index d8c3005..0000000
--- a/src/main/java/gq/malwarefight/nosession/mixin/asm/ReplacingMethodVisitor.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package gq.malwarefight.nosession.mixin.asm;
-
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-
-public class ReplacingMethodVisitor extends MethodVisitor implements Opcodes {
-
- final String newName;
- final String oldName;
- public ReplacingMethodVisitor(MethodVisitor mv, String oldName, String newName) {
- super(ASM5, mv);
- this.oldName = oldName;
- this.newName = newName;
- }
-
- public void visitFieldInsn(int opcode, String owner, String name,
- String desc) {
- owner = owner.replace(oldName, newName);
- super.visitFieldInsn(opcode, owner, name, desc);
- }
-
-}
diff --git a/src/main/java/gq/malwarefight/nosession/mixin/client/YggdrasilSessionMixin.java b/src/main/java/gq/malwarefight/nosession/mixin/client/YggdrasilSessionMixin.java
index 48327fe..5451c26 100644
--- a/src/main/java/gq/malwarefight/nosession/mixin/client/YggdrasilSessionMixin.java
+++ b/src/main/java/gq/malwarefight/nosession/mixin/client/YggdrasilSessionMixin.java
@@ -1,9 +1,10 @@
package gq.malwarefight.nosession.mixin.client;
+import com.google.common.primitives.Booleans;
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.exceptions.AuthenticationException;
import com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService;
-import gq.malwarefight.nosession.mixin.Utils;
+import gq.malwarefight.nosession.utils.Utils;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
@@ -46,4 +47,4 @@ public class YggdrasilSessionMixin {
} catch (IOException ignored) {}
}
}
-}
+} \ No newline at end of file