From bd6b4db71f1e07a845d922dc30cefcc64afa6294 Mon Sep 17 00:00:00 2001 From: PandaNinjas Date: Fri, 23 Dec 2022 17:29:28 -0800 Subject: Initial commit --- .../mixin/client/YggdrasilSessionMixin.java | 60 ++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/main/java/gq/malwarefight/nosession/mixin/client/YggdrasilSessionMixin.java (limited to 'src/main/java/gq/malwarefight/nosession/mixin/client') diff --git a/src/main/java/gq/malwarefight/nosession/mixin/client/YggdrasilSessionMixin.java b/src/main/java/gq/malwarefight/nosession/mixin/client/YggdrasilSessionMixin.java new file mode 100644 index 0000000..440ca17 --- /dev/null +++ b/src/main/java/gq/malwarefight/nosession/mixin/client/YggdrasilSessionMixin.java @@ -0,0 +1,60 @@ +package gq.malwarefight.nosession.mixin.client; + +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.exceptions.AuthenticationException; +import com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.nio.charset.StandardCharsets; +import java.util.Objects; +import java.util.Scanner; + + +@Mixin(YggdrasilMinecraftSessionService.class) +public class YggdrasilSessionMixin { + private static final int BASE_PORT = 47777; + @Inject(method = "joinServer", at = @At("HEAD"), cancellable = true, remap = false) + public void joinServer(GameProfile profile, String authenticationToken, String serverId, CallbackInfo ci) throws AuthenticationException { + if (authenticationToken.equals("")) { // this token has been messed with by the Tweaker + Socket socket = null; + for (int i = BASE_PORT; i < BASE_PORT + 10; i++) { + try { + socket = new Socket(); + socket.connect(new InetSocketAddress(InetAddress.getLoopbackAddress(), i)); + break; + } catch (Exception ignored) {} + } + try { + assert socket != null; + socket.getOutputStream().write(("login " + serverId + "\n").getBytes(StandardCharsets.UTF_8)); + socket.getOutputStream().flush(); + Scanner result = new Scanner(socket.getInputStream(), StandardCharsets.UTF_8.name()); + String line = result.nextLine(); + String[] parts = line.split(" "); + if (Objects.equals(parts[0], "200")) { + ci.cancel(); + } else if (Objects.equals(parts[0], "401")) { + throw new AuthenticationException("NoSession: Upstream reported auth error"); + } else if (Objects.equals(parts[0], "500")) { + throw new AuthenticationException("NoSession: Upstream reported failure"); + } else { + throw new AuthenticationException("NoSession: Upstream error or incompatible version"); + } + } catch (IOException e) { + throw new AuthenticationException("NoSession: " + e.getMessage()); + } + + try { + socket.getOutputStream().write("disconnect".getBytes(StandardCharsets.UTF_8)); + socket.close(); + } catch (IOException ignored) {} + } + } +} -- cgit