diff --git a/.gitignore b/.gitignore index b740e72..00d3afc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ # Project exclude paths /.gradle/ -/build/ \ No newline at end of file +/build/ +/obf/ +/Obf/ diff --git a/Client/build.gradle b/Client/build.gradle index 990447e..127750f 100644 --- a/Client/build.gradle +++ b/Client/build.gradle @@ -75,7 +75,7 @@ dependencies { } compileJava { - def targetFile = file("src/main/java/com/baseband/client/Main.java") + def targetFile = file("src/main/java/com/baseband/client/BaseBand.java") def content = targetFile.text def updatedContent = content.replaceFirst("buildNumber = (\\d+)", { _, value -> "buildNumber = ${value.toInteger() + 1}" }) targetFile.text = updatedContent diff --git a/Client/src/main/java/com/baseband/client/Main.java b/Client/src/main/java/com/baseband/client/BaseBand.java similarity index 90% rename from Client/src/main/java/com/baseband/client/Main.java rename to Client/src/main/java/com/baseband/client/BaseBand.java index be18a1b..5263d53 100644 --- a/Client/src/main/java/com/baseband/client/Main.java +++ b/Client/src/main/java/com/baseband/client/BaseBand.java @@ -3,6 +3,7 @@ package com.baseband.client; import com.baseband.client.command.CommandManager; import com.baseband.client.event.EventBus; +import com.baseband.client.event.events.SafeTickEvent; import com.baseband.client.module.ModuleRegistry; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; @@ -15,13 +16,14 @@ import org.apache.logging.log4j.Logger; import java.awt.*; -public class Main { - public static int buildNumber = 3; +public class BaseBand { + public static int buildNumber = 71; public static final String name = "BaseBand"; public static ModuleRegistry moduleRegistry; public static CommandManager commandRegistry; public static EventBus eventBus; + public static Config configManager; public static final Logger log = LogManager.getLogger("BaseBand"); public static boolean authed = true; //TODO: make this update along with whatever protection Daniella's figuring out @@ -29,6 +31,8 @@ public class Main { moduleRegistry = new ModuleRegistry(); commandRegistry = new CommandManager(); eventBus = new EventBus(); + configManager = new Config(); + log.info("BaseBand Instantiated."); } @@ -36,8 +40,7 @@ public class Main { @SubscribeEvent public void tick(TickEvent.ClientTickEvent e) { if(isIngame()) { - //EVENT_MANAGER.publish(new SafeTickEvent()); - //TODO: implement better event manager + eventBus.publish(new SafeTickEvent()); } } diff --git a/Client/src/main/java/com/baseband/client/Config.java b/Client/src/main/java/com/baseband/client/Config.java new file mode 100644 index 0000000..60c156e --- /dev/null +++ b/Client/src/main/java/com/baseband/client/Config.java @@ -0,0 +1,58 @@ +package com.baseband.client; + +import com.baseband.client.module.Module; +import com.baseband.client.setting.Setting; + +import java.io.*; +import java.util.List; + +public class Config { + //TODO: replace + + public Config() { + File directory = new File("BaseBand"); + directory.mkdir(); + + + + Runtime.getRuntime().addShutdownHook(new Thread(()->{ + for(Module m : BaseBand.moduleRegistry.getModuleList()) { + Config.saveSettingsToFile(m.getSettings(), new File(directory, m.getName()).getPath()); + } + BaseBand.log.info("Saved settings"); + })); + + + for(Module m : BaseBand.moduleRegistry.getModuleList()) { + try { + m.setSettings(Config.loadSettingsFromFile(new File(directory, m.getName()).getPath())); + BaseBand.log.info("Loaded settings"); + }catch (Exception e) { + Config.saveSettingsToFile(m.getSettings(), new File(directory, m.getName()).getPath()); + BaseBand.log.info("Created settings"); + } + } + } + + // Save a list of Setting to a file + public static void saveSettingsToFile(List> settings, String filePath) { + try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath))) { + oos.writeObject(settings); + System.out.println("Settings saved to " + filePath); + } catch (IOException e) { + e.printStackTrace(); + } + } + + // Load a list of Setting from a file + public static List> loadSettingsFromFile(String filePath) { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) { + List> settings = (List>) ois.readObject(); + System.out.println("Settings loaded from " + filePath); + return settings; + } catch (IOException | ClassNotFoundException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/Client/src/main/java/com/baseband/client/MotionUtil.java b/Client/src/main/java/com/baseband/client/MotionUtil.java new file mode 100644 index 0000000..fb262c2 --- /dev/null +++ b/Client/src/main/java/com/baseband/client/MotionUtil.java @@ -0,0 +1,82 @@ +package com.baseband.client; + +import net.minecraft.client.Minecraft; +import net.minecraft.init.MobEffects; + +import java.util.Objects; + + +public class MotionUtil { + //Needed for Speed, thanks Doogie. + + static final Minecraft mc = Minecraft.getMinecraft(); + + public static double applySpeed(double speed) { + + if (mc.player.isPotionActive(MobEffects.SPEED)) { + + double amp = Objects.requireNonNull(mc.player.getActivePotionEffect(MobEffects.SPEED)).getAmplifier() + 1; + speed *= 1.0f + 0.2f * amp; + + } + + return speed; + + } + + public static double applyJumpBoost(double height) { + + if (mc.player.isPotionActive(MobEffects.JUMP_BOOST)) { + return height + (Objects.requireNonNull(mc.player.getActivePotionEffect(MobEffects.JUMP_BOOST)).getAmplifier() + 1) * 0.1f; + } + + return height; + + } + + private static float getRotationYaw() { + + return Minecraft.getMinecraft().player.rotationYaw; + + } + + public static double[] getMotion(double speed) { + + if (mc.player.moveForward == 0 && mc.player.moveStrafing == 0) + return new double[]{0, 0}; + + int strafing = 0; + int forward = 0; + + if (mc.player.moveStrafing < 0) + strafing = -1; + else if (mc.player.moveStrafing > 0) + strafing = 1; + + if (mc.player.moveForward < 0) + forward = -1; + else if (mc.player.moveForward > 0) + forward = 1; + + float strafe = 90 * strafing; + strafe *= (forward != 0F) ? forward * 0.5F : 1; + + float yaw = getRotationYaw() - strafe; + yaw -= (mc.player.moveForward < 0F) ? 180 : 0; + + return getMotion(speed, yaw); + } + + public static double[] getMotion(double speed, float yaw) { + + // to radians + yaw *= 0.017452006980803f; + + double x = (-Math.sin(yaw) * speed); + double z = (Math.cos(yaw) * speed); + + return new double[]{x, z}; + + } + +} diff --git a/Client/src/main/java/com/baseband/client/Utils.java b/Client/src/main/java/com/baseband/client/Utils.java index c69847f..d8d75d0 100644 --- a/Client/src/main/java/com/baseband/client/Utils.java +++ b/Client/src/main/java/com/baseband/client/Utils.java @@ -5,9 +5,9 @@ import net.minecraft.util.text.TextComponentString; public class Utils { public static void sendChatMessage(String e) { - if (Main.isIngame()) { + if (BaseBand.isIngame()) { try { - Minecraft.getMinecraft().player.sendMessage(new TextComponentString("[" + "§a" + Main.name + "§r" + "]" + " " + e)); + Minecraft.getMinecraft().player.sendMessage(new TextComponentString("[" + "§a" + BaseBand.name + "§r" + "]" + " " + e)); } catch (Exception ee) { ee.printStackTrace(); } diff --git a/Client/src/main/java/com/baseband/client/command/CommandManager.java b/Client/src/main/java/com/baseband/client/command/CommandManager.java index 76a881f..cc5e4d4 100644 --- a/Client/src/main/java/com/baseband/client/command/CommandManager.java +++ b/Client/src/main/java/com/baseband/client/command/CommandManager.java @@ -1,9 +1,7 @@ package com.baseband.client.command; import com.baseband.client.Utils; -import com.baseband.client.command.commands.CreditsCommand; -import com.baseband.client.command.commands.HelpCommand; -import com.baseband.client.command.commands.ToggleCommand; +import com.baseband.client.command.commands.*; import net.minecraftforge.client.event.ClientChatEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -28,6 +26,7 @@ public class CommandManager { commands.add(new CreditsCommand()); commands.add(new HelpCommand()); commands.add(new ToggleCommand()); + commands.add(new SetCommand()); } @SubscribeEvent diff --git a/Client/src/main/java/com/baseband/client/command/commands/CreditsCommand.java b/Client/src/main/java/com/baseband/client/command/commands/CreditsCommand.java index cef5329..63ca7ce 100644 --- a/Client/src/main/java/com/baseband/client/command/commands/CreditsCommand.java +++ b/Client/src/main/java/com/baseband/client/command/commands/CreditsCommand.java @@ -9,8 +9,11 @@ public class CreditsCommand extends Command { @Override public String run(String[] args) { - return "Base and most of the loader written by JessSystemV, " + - "\nJohn200410 helped with the loader. " + - "\nTudbuT made the GUI."; + return "Credits:" + + "\nBase and most of the loader written by JessSystemV, " + + "\nJohn200410 helped with the loader, " + + "\nTudbuT made the GUI, " + + "\nDoogie13 provided the PacketFly."; + } } diff --git a/Client/src/main/java/com/baseband/client/command/commands/HelpCommand.java b/Client/src/main/java/com/baseband/client/command/commands/HelpCommand.java index 71a9ce8..90eb172 100644 --- a/Client/src/main/java/com/baseband/client/command/commands/HelpCommand.java +++ b/Client/src/main/java/com/baseband/client/command/commands/HelpCommand.java @@ -1,6 +1,6 @@ package com.baseband.client.command.commands; -import com.baseband.client.Main; +import com.baseband.client.BaseBand; import com.baseband.client.command.Command; public class HelpCommand extends Command { @@ -10,7 +10,7 @@ public class HelpCommand extends Command { @Override public String run(String[] args) { - return "BaseBand Rewrite Build" + Main.buildNumber + + return "BaseBand Rewrite B" + BaseBand.buildNumber + "\nCopyright JessSystemV & TudbuT (2023)" + "\nAll rights reserved."; } diff --git a/Client/src/main/java/com/baseband/client/command/commands/SetCommand.java b/Client/src/main/java/com/baseband/client/command/commands/SetCommand.java new file mode 100644 index 0000000..d17b454 --- /dev/null +++ b/Client/src/main/java/com/baseband/client/command/commands/SetCommand.java @@ -0,0 +1,45 @@ +package com.baseband.client.command.commands; + +import com.baseband.client.BaseBand; +import com.baseband.client.command.Command; +import com.baseband.client.module.Module; +import com.baseband.client.setting.Setting; + +public class SetCommand extends Command { + public SetCommand() { + super("set"); + } + + @Override + public String run(String[] argz) { + String module; + String settingName; + String value; + try { + module = argz[0]; + settingName = argz[1]; + value = argz[2]; + }catch (ArrayIndexOutOfBoundsException e) { + return "Command usage, =set ModuleName SettingName Value"; + } + + Module m = BaseBand.moduleRegistry.getModule(module); + + if(m==null) { + return "Cannot find module."; + } + + Setting setting = m.getSetting(settingName); + if(setting == null) { + return "Cannot find setting."; + } + try { + setting.setByClass(value); + }catch (Exception e) { + return e.getLocalizedMessage(); + } + + return "Succeeded. (Set "+settingName+" to "+value+")"; + } + +} diff --git a/Client/src/main/java/com/baseband/client/command/commands/ToggleCommand.java b/Client/src/main/java/com/baseband/client/command/commands/ToggleCommand.java index e795d57..ffc6ea3 100644 --- a/Client/src/main/java/com/baseband/client/command/commands/ToggleCommand.java +++ b/Client/src/main/java/com/baseband/client/command/commands/ToggleCommand.java @@ -1,6 +1,6 @@ package com.baseband.client.command.commands; -import com.baseband.client.Main; +import com.baseband.client.BaseBand; import com.baseband.client.command.Command; import com.baseband.client.module.Module; @@ -14,7 +14,7 @@ public class ToggleCommand extends Command { if (args.length != 1) { return "Please specify a module name."; } - Module module = Main.moduleRegistry.getModule(args[0]); + Module module = BaseBand.moduleRegistry.getModule(args[0]); if (module == null) { return "Cannot find module."; } diff --git a/Client/src/main/java/com/baseband/client/event/events/MoveEvent.java b/Client/src/main/java/com/baseband/client/event/events/MoveEvent.java new file mode 100644 index 0000000..ed55d17 --- /dev/null +++ b/Client/src/main/java/com/baseband/client/event/events/MoveEvent.java @@ -0,0 +1,18 @@ +package com.baseband.client.event.events; + +import com.baseband.client.event.CancellableEvent; +import net.minecraft.entity.MoverType; + +public class MoveEvent extends CancellableEvent { + public MoverType type; + public double x; + public double y; + public double z; + + public MoveEvent(MoverType type, double x, double y, double z) { + this.type = type; + this.x = x; + this.y = y; + this.z = z; + } +} diff --git a/Client/src/main/java/com/baseband/client/event/events/SafeTickEvent.java b/Client/src/main/java/com/baseband/client/event/events/SafeTickEvent.java new file mode 100644 index 0000000..e88dcba --- /dev/null +++ b/Client/src/main/java/com/baseband/client/event/events/SafeTickEvent.java @@ -0,0 +1,6 @@ +package com.baseband.client.event.events; + +import com.baseband.client.event.CancellableEvent; + +public class SafeTickEvent extends CancellableEvent { +} diff --git a/Client/src/main/java/com/baseband/client/mixins/ISPacketPlayerPosLook.java b/Client/src/main/java/com/baseband/client/mixins/ISPacketPlayerPosLook.java new file mode 100644 index 0000000..e116c3b --- /dev/null +++ b/Client/src/main/java/com/baseband/client/mixins/ISPacketPlayerPosLook.java @@ -0,0 +1,25 @@ +package com.baseband.client.mixins; + +import net.minecraft.network.play.server.SPacketPlayerPosLook; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(SPacketPlayerPosLook.class) +public interface ISPacketPlayerPosLook { + + @Accessor("x") + void setX(double x); + + @Accessor("y") + void setY(double y); + + @Accessor("z") + void setZ(double z); + + @Accessor("yaw") + void setYaw(float yaw); + + @Accessor("pitch") + void setPitch(float pitch); + +} \ No newline at end of file diff --git a/Client/src/main/java/com/baseband/client/mixins/MixinEntityPlayerSP.java b/Client/src/main/java/com/baseband/client/mixins/MixinEntityPlayerSP.java new file mode 100644 index 0000000..ea1ca30 --- /dev/null +++ b/Client/src/main/java/com/baseband/client/mixins/MixinEntityPlayerSP.java @@ -0,0 +1,32 @@ +package com.baseband.client.mixins; + +import com.baseband.client.BaseBand; +import com.baseband.client.event.events.MoveEvent; +import com.mojang.authlib.GameProfile; +import net.minecraft.client.entity.AbstractClientPlayer; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.entity.MoverType; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(EntityPlayerSP.class) +public class MixinEntityPlayerSP extends AbstractClientPlayer { + + public MixinEntityPlayerSP(World worldIn, GameProfile playerProfile) { + super(worldIn, playerProfile); + } + + + @Redirect(method = "move", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/entity/AbstractClientPlayer;move(Lnet/minecraft/entity/MoverType;DDD)V")) + public void move(AbstractClientPlayer abstractClientPlayer, MoverType type, double x, double y, double z) { + MoveEvent event = new MoveEvent(type, x, y, z); + BaseBand.eventBus.publish(event); + + if(!event.isCancelled()) { + super.move(event.type, event.x, event.y, event.z); + } + } + +} \ No newline at end of file diff --git a/Client/src/main/java/com/baseband/client/mixins/MixinMinecraft.java b/Client/src/main/java/com/baseband/client/mixins/MixinMinecraft.java index a649930..a7d2d81 100644 --- a/Client/src/main/java/com/baseband/client/mixins/MixinMinecraft.java +++ b/Client/src/main/java/com/baseband/client/mixins/MixinMinecraft.java @@ -1,6 +1,6 @@ package com.baseband.client.mixins; -import com.baseband.client.Main; +import com.baseband.client.BaseBand; import net.minecraft.client.Minecraft; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -14,6 +14,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; public class MixinMinecraft { @Inject(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;checkGLError(Ljava/lang/String;)V", ordinal = 1, shift = At.Shift.AFTER)) private void onInit(CallbackInfo ci) { - Main.onInit(); + BaseBand.onInit(); } } diff --git a/Client/src/main/java/com/baseband/client/mixins/MixinNetworkManager.java b/Client/src/main/java/com/baseband/client/mixins/MixinNetworkManager.java index 36c291f..bc9fc47 100644 --- a/Client/src/main/java/com/baseband/client/mixins/MixinNetworkManager.java +++ b/Client/src/main/java/com/baseband/client/mixins/MixinNetworkManager.java @@ -1,6 +1,6 @@ package com.baseband.client.mixins; -import com.baseband.client.Main; +import com.baseband.client.BaseBand; import com.baseband.client.event.events.PacketEvent; import io.netty.channel.ChannelHandlerContext; import net.minecraft.network.NetworkManager; @@ -16,7 +16,7 @@ public class MixinNetworkManager { @Inject(method = "channelRead0", at = @At("HEAD"), cancellable = true) public void channelRead0(ChannelHandlerContext p_channelRead0_1_, Packet p_channelRead0_2_, CallbackInfo ci) { PacketEvent.Read event = new PacketEvent.Read(p_channelRead0_2_); - Main.eventBus.publish(event); + BaseBand.eventBus.publish(event); if (event.isCancelled()) ci.cancel(); @@ -25,7 +25,7 @@ public class MixinNetworkManager { @Inject(method = "sendPacket(Lnet/minecraft/network/Packet;)V", at = @At("HEAD"), cancellable = true) public void channelRead0(Packet packetIn, CallbackInfo ci) { PacketEvent.Write event = new PacketEvent.Write(packetIn); - Main.eventBus.publish(event); + BaseBand.eventBus.publish(event); if (event.isCancelled()) ci.cancel(); diff --git a/Client/src/main/java/com/baseband/client/module/Module.java b/Client/src/main/java/com/baseband/client/module/Module.java index be260bd..005fd9a 100644 --- a/Client/src/main/java/com/baseband/client/module/Module.java +++ b/Client/src/main/java/com/baseband/client/module/Module.java @@ -1,11 +1,19 @@ package com.baseband.client.module; -import com.baseband.client.Main; +import com.baseband.client.BaseBand; +import com.baseband.client.setting.Setting; + +import net.minecraft.client.Minecraft; +import net.minecraftforge.common.MinecraftForge; + +import java.util.ArrayList; +import java.util.List; public class Module { String name; boolean isEnabled = false; int key = 0; + List> settings = new ArrayList<>(); public Module(String name) { this.name = name; @@ -19,13 +27,39 @@ public class Module { isEnabled=enabled; if(isEnabled) { enable(); - Main.eventBus.register(this); - }else { + BaseBand.eventBus.register(this); + MinecraftForge.EVENT_BUS.register(this); + } else { disable(); - Main.eventBus.unregister(this); + BaseBand.eventBus.unregister(this); + MinecraftForge.EVENT_BUS.unregister(this); } } + public static Minecraft mc = Minecraft.getMinecraft(); + + public > T register(T setting) { + settings.add(setting); + return setting; + } + + public void setSettings(List> settings) { + this.settings = settings; + } + + public Setting getSetting(String name) { + for (Setting setting : settings) { + if (setting != null && setting.getName() != null && setting.getName().equalsIgnoreCase(name)) { + return setting; + } + } + return null; + } + + public List> getSettings() { + return settings; + } + public void setKey(int key) { this.key = key; } diff --git a/Client/src/main/java/com/baseband/client/module/ModuleRegistry.java b/Client/src/main/java/com/baseband/client/module/ModuleRegistry.java index 3960c49..ab5bca4 100644 --- a/Client/src/main/java/com/baseband/client/module/ModuleRegistry.java +++ b/Client/src/main/java/com/baseband/client/module/ModuleRegistry.java @@ -1,9 +1,6 @@ package com.baseband.client.module; -import com.baseband.client.module.modules.Brightness; -import com.baseband.client.module.modules.ClickGUI; -import com.baseband.client.module.modules.HUD; -import com.baseband.client.module.modules.PacketTest; +import com.baseband.client.module.modules.*; import net.minecraft.client.Minecraft; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -24,8 +21,10 @@ public class ModuleRegistry { modules.add(new Brightness()); modules.add(new PacketTest()); modules.add(new HUD()); - modules.add(new ClickGUI()); + //modules.add(new ClickGUI()); modules.add(new PacketTest()); + modules.add(new PacketFly()); + modules.add(new Speed()); } @SubscribeEvent diff --git a/Client/src/main/java/com/baseband/client/module/modules/Brightness.java b/Client/src/main/java/com/baseband/client/module/modules/Brightness.java index b3a3185..6621eba 100644 --- a/Client/src/main/java/com/baseband/client/module/modules/Brightness.java +++ b/Client/src/main/java/com/baseband/client/module/modules/Brightness.java @@ -1,6 +1,6 @@ package com.baseband.client.module.modules; -import com.baseband.client.Main; +import com.baseband.client.BaseBand; import com.baseband.client.module.Module; import net.minecraft.client.Minecraft; @@ -11,14 +11,14 @@ public class Brightness extends Module { public void enable() { - if(Main.isIngame()) { + if(BaseBand.isIngame()) { Minecraft.getMinecraft().gameSettings.gammaSetting=100f; } } public void disable() { - if(Main.isIngame()) { + if(BaseBand.isIngame()) { Minecraft.getMinecraft().gameSettings.gammaSetting=1f; } } diff --git a/Client/src/main/java/com/baseband/client/module/modules/HUD.java b/Client/src/main/java/com/baseband/client/module/modules/HUD.java index 0a533ff..89e86b2 100644 --- a/Client/src/main/java/com/baseband/client/module/modules/HUD.java +++ b/Client/src/main/java/com/baseband/client/module/modules/HUD.java @@ -1,6 +1,6 @@ package com.baseband.client.module.modules; -import com.baseband.client.Main; +import com.baseband.client.BaseBand; import com.baseband.client.module.Module; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; @@ -18,11 +18,11 @@ public class HUD extends Module { @SubscribeEvent public void text(RenderGameOverlayEvent.Text e) { FontRenderer fr = Minecraft.getMinecraft().fontRenderer; - fr.drawStringWithShadow("BaseBand B" + Main.buildNumber, 2, 2, Color.GREEN.getRGB()); + fr.drawStringWithShadow("BaseBand B" + BaseBand.buildNumber, 2, 2, Color.GREEN.getRGB()); int y = 12; - for (Module m : Main.moduleRegistry.getModuleList()) { + for (Module m : BaseBand.moduleRegistry.getModuleList()) { if(m.isEnabled()) { - fr.drawStringWithShadow(m.getName(), 2, 2, Color.GREEN.getRGB()); + fr.drawStringWithShadow(m.getName(), 2, y, Color.GREEN.getRGB()); y=y+fr.FONT_HEIGHT; } } diff --git a/Client/src/main/java/com/baseband/client/module/modules/PacketFly.java b/Client/src/main/java/com/baseband/client/module/modules/PacketFly.java new file mode 100644 index 0000000..b38a142 --- /dev/null +++ b/Client/src/main/java/com/baseband/client/module/modules/PacketFly.java @@ -0,0 +1,286 @@ +package com.baseband.client.module.modules; + +import com.baseband.client.event.Subscribe; +import com.baseband.client.event.events.MoveEvent; +import com.baseband.client.event.events.PacketEvent; +import com.baseband.client.mixins.ISPacketPlayerPosLook; +import com.baseband.client.module.Module; +import com.baseband.client.setting.NumberSetting; +import net.minecraft.network.play.client.CPacketConfirmTeleport; +import net.minecraft.network.play.client.CPacketPlayer; +import net.minecraft.network.play.server.SPacketPlayerPosLook; +import net.minecraft.util.math.Vec3d; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; + +public class PacketFly extends Module { + //Doogie13 made this, ported in with permission + public PacketFly() { + super("PacketFly"); + } + + + // setting for Factor with bounds 0.1 to 5.0 and a precision of 0.1 + // for 2b2tpvp.net, default value of 1.3 is recommended when using this for flying + // when phasing, you may wish to use something closer to 2 or 3 + final NumberSetting factor = register(new NumberSetting<>("Factor", 1.3f, 0.1f, 5f)); + + final NumberSetting boundValue = register(new NumberSetting<>("Bounds", 512, -1024, 1024)); + + // current teleport ID + int tpID = -1; + + // set of packets we allow + Set allowedCPacketPlayers = new HashSet<>(); + + + // map of IDs and positions where we can ignore server rubberbands + HashMap allowedPositionsAndIDs = new HashMap<>(); + + @Override + public void disable() { + // clear these so they don't take up memory + allowedCPacketPlayers.clear(); + allowedPositionsAndIDs.clear(); + } + + @Override + public void enable() { + // we will not have been tracking tpID so we must reset it + tpID = -1; + } + + // this can be any event which will let us set player motion + @Subscribe + public void onMotion(MoveEvent event) { + + // first we must get motion + double motionX, motionY = 0, motionZ; + + // store whether we are anti-kicking + boolean antiKicking = false; + + // Handle motion Y + // check if we need to do anti-kick + // we do not need to anti-kick when inside blocks + if (mc.player.ticksExisted % 10 == 0 && !mc.world.collidesWithAnyBlock(mc.player.getEntityBoundingBox())) { + // 0.04 is the distance we must fall before being kicked for flying + // net.minecraft.network.NetHandlerPlayServer line 182 + motionY = -.04; + antiKicking = true; + } else { + + // we MUST allow the player to prioritise going up as it allows us to manipulate our bounding box with sneaking + // NCP will flag SurvivalFly for anything larger than 0.0625 so we use 0.0624 to be on the safe side + // I believe this to be because the server doesn't process movement slower than 0.0625 in the same way but I can't find evidence for this + if (mc.gameSettings.keyBindJump.isKeyDown()) + motionY = .0624; + else if (mc.gameSettings.keyBindSneak.isKeyDown()) + motionY = -.0624; + + } + + // Handle Motion X, Z + // we will handle them as one speed and split them into X and Z based on rotation and keys pressed + double motionH; + + // If we are inside blocks, we must use speed slower than 0.0625 so vanilla doesn't set us back + // net.minecraft.network.NetHandlerPlayServer line 560 + + boolean walls = mc.world.collidesWithAnyBlock(mc.player.getEntityBoundingBox()); + + if (walls) { + + motionH = .0624; + + if (motionY != 0) { + + // this means the hypotenuse of our position is always under .625; + double multiply = 1 / Math.sqrt(2); + + motionY *= multiply; + motionH *= multiply; + + } + + } else { + + // base air move speed + motionH = .2873; + + // we cannot move up if we are moving horizontally since NCP will notice + boolean movingHorizontally = mc.player.moveForward != 0 || mc.player.moveStrafing != 0; + + if (movingHorizontally) + motionY = Math.min(0, motionY); + + } + + // we now split motionH into motionX and motionZ + // this should really be in a util + // we use dir because tradition + double[] dir = new double[]{0,0}; + + // if we aren't moving we can just use 0 motion + if (!(mc.player.moveForward == 0 && mc.player.moveStrafing == 0)) { + + int strafing = 0; + int forward = 0; + + // make moveForward and moveStrafing rounded to the nearest 1 + if (mc.player.moveStrafing < 0) + strafing = -1; + else if (mc.player.moveStrafing > 0) + strafing = 1; + + if (mc.player.moveForward < 0) + forward = -1; + else if (mc.player.moveForward > 0) + forward = 1; + + float strafe = 90 * strafing; + strafe *= (forward != 0F) ? forward * 0.5F : 1; + + float yaw = mc.player.rotationYaw - strafe; + yaw -= (mc.player.moveForward < 0F) ? 180 : 0; + + // to radians + yaw *= 1 / (180 / Math.PI); + + // get X and Z split + double x = (-Math.sin(yaw) * motionH); + double z = (Math.cos(yaw) * motionH); + + dir = new double[]{x, z}; + + } + + motionX = dir[0]; + motionZ = dir[1]; + + // get the lowest possible factor + int factorInt = (int) Math.floor(factor.getValue()); + + // check if we should send more packets + // decimal place is how much we should factorise more + if (mc.player.ticksExisted % 10 < 10 * (factor.getValue() - factorInt)) + factorInt++; + + // send packets + Vec3d motion = send(motionX, motionY, motionZ, antiKicking, factorInt); + + event.x=(motion.x); + event.y=(motion.y); + event.z=(motion.z); + + // allows us to phase + mc.player.noClip = true; + + } + + // this can be repeated multiple times to move faster + Vec3d send(double motionX, double motionY, double motionZ, boolean antiKick, int factor) { + + for (int i = 1; i < factor + 1; i++) { + + // only anti-kick once per loop as doing it multiple times is a waste of height + if (antiKick && factor != 1) + motionY = 0; + + // get the absolute position + Vec3d pos = mc.player.getPositionVector().add(motionX * i, motionY * i, motionZ * i); + + // create a movement packet + // we use onGround true to prevent fall damage on some servers + CPacketPlayer.Position packet = new CPacketPlayer.Position(pos.x, pos.y, pos.z, true); + + // create a "bounds" packet + // this is just any packet over 100 blocks away from current position or 300 when elytra is open + // net.minecraft.network.NetHandlerPlayServer line 529 + CPacketPlayer.Position bounds = new CPacketPlayer.Position(pos.x, pos.y + boundValue.getValue(), pos.z, true); + + // allow normal packet and "bounds" packet to be sent (handled later) + allowedCPacketPlayers.add(packet); + allowedCPacketPlayers.add(bounds); + + // send packets + mc.player.connection.sendPacket(packet); + mc.player.connection.sendPacket(bounds); + + // we must have a correct teleport ID to save, we use the "bounds" packet to get one anyways if not + if (tpID < 0) + break; + + // iterate tpID as bounds will have caused rubberband + tpID++; + + // send a tpID packet confirming the bounds packet + mc.player.connection.sendPacket(new CPacketConfirmTeleport(tpID)); + + // add move vector and tpID to the map + allowedPositionsAndIDs.put(tpID, pos); + } + + // return a vec of our motion + return new Vec3d(motionX * factor, motionY * (antiKick ? 1 : factor), motionZ * factor); + + } + + @Subscribe + public void onPacketSend(PacketEvent.Write event) { + + // we only cancel CPacketPlayers + if (event.getPacket() instanceof CPacketPlayer) + // check if we are allowing the packet through + // cancel if not + if (!allowedCPacketPlayers.contains((CPacketPlayer) event.getPacket())) + event.setCancelled(true); + + } + + @Subscribe + public void onPacketReceive(PacketEvent.Write event) { + + // check if the packet is a player pos look + if (event.getPacket() instanceof SPacketPlayerPosLook) { + + SPacketPlayerPosLook packet = (SPacketPlayerPosLook) event.getPacket(); + int id = packet.getTeleportId(); + + // check if saved history contains the packet ID + if (allowedPositionsAndIDs.containsKey(id)) { + + // check if saved packet with that ID has the corresponding position + // this would mean the packet lines up and we can ignore the packet + if (allowedPositionsAndIDs.get(id).equals(new Vec3d(packet.getX(), packet.getY(), packet.getZ()))) { + + // remove the entry + allowedPositionsAndIDs.remove(id); + + // confirm the packet + mc.player.connection.sendPacket(new CPacketConfirmTeleport(id)); + + // cancel the event + event.setCancelled(true); + return; + + } + + } + + // update our teleport ID + tpID = id; + + // prevent jittery rotation + ((ISPacketPlayerPosLook) packet).setYaw(mc.player.rotationYaw); + ((ISPacketPlayerPosLook) packet).setPitch(mc.player.rotationPitch); + + // we MUST confirm this packet + mc.player.connection.sendPacket(new CPacketConfirmTeleport(id)); + + } + + } +} diff --git a/Client/src/main/java/com/baseband/client/module/modules/PacketTest.java b/Client/src/main/java/com/baseband/client/module/modules/PacketTest.java index 33d3485..dc5174f 100644 --- a/Client/src/main/java/com/baseband/client/module/modules/PacketTest.java +++ b/Client/src/main/java/com/baseband/client/module/modules/PacketTest.java @@ -4,12 +4,35 @@ import com.baseband.client.Utils; import com.baseband.client.event.Subscribe; import com.baseband.client.event.events.PacketEvent; import com.baseband.client.module.Module; +import com.baseband.client.setting.EnumSetting; +import com.baseband.client.setting.NumberSetting; +import com.baseband.client.setting.Setting; +import com.baseband.client.setting.StringSetting; public class PacketTest extends Module { public PacketTest() { super("PacketTest"); } + Setting intSetting = register(new NumberSetting<>("IntSetting", 1,2,0)); + + Setting floatSetting = register(new NumberSetting<>("FloatSetting",1f,2f,0f)); + + Setting doubleSetting = register(new NumberSetting<>("DoubleSetting",1d,2d,0d)); + + Setting stringSetting = register(new StringSetting("StringSetting","s")); + + Setting levelSetting = register(new EnumSetting<>("Level", Level.HIGH)); + + enum Level { + LOW, + MEDIUM, + HIGH + } + + + + @Subscribe public void handleEventA(PacketEvent.Read event) { Utils.sendChatMessage(event.getPacket().getClass().getName()); diff --git a/Client/src/main/java/com/baseband/client/module/modules/Speed.java b/Client/src/main/java/com/baseband/client/module/modules/Speed.java new file mode 100644 index 0000000..f5ac15f --- /dev/null +++ b/Client/src/main/java/com/baseband/client/module/modules/Speed.java @@ -0,0 +1,158 @@ +package com.baseband.client.module.modules; + +import com.baseband.client.MotionUtil; +import com.baseband.client.event.Subscribe; +import com.baseband.client.event.events.MoveEvent; +import com.baseband.client.event.events.PacketEvent; +import com.baseband.client.event.events.SafeTickEvent; +import com.baseband.client.module.Module; +import com.baseband.client.setting.BooleanSetting; +import com.baseband.client.setting.NumberSetting; +import net.minecraft.network.play.server.SPacketEntityVelocity; +import net.minecraft.network.play.server.SPacketExplosion; +import net.minecraft.network.play.server.SPacketPlayerPosLook; +import net.minecraft.util.math.BlockPos; + +public class Speed extends Module { + public Speed() { + super("Speed"); + } + + + //final ModeSetting bunnyMode = register(new ModeSetting("NCP Mode", "Normal", Arrays.asList("Normal", "Updated")).setDescription("How to accelerate when jumping")); + final BooleanSetting boost = register(new BooleanSetting("Boost", true)); + final NumberSetting boostReduction = register(new NumberSetting<>("Boost Reduction", 0f, 0f, 1f)); + + boolean slow = false; + int jumps = 0; + double bunnySpeed = .2873; + int groundTick = 0; + + double lastDist = 0; + double dmgBoost = 0; + boolean isDmgBoostAbsolute = false; + + + @Override + public void enable() { + bunnySpeed = lastDist = dmgBoost = jumps = 0; + } + + @Subscribe + public final void onUpdate(SafeTickEvent event) { + //parent.setTickLength(50f / 1.088f); + lastDist = Math.hypot(mc.player.posX - mc.player.prevPosX, mc.player.posZ - mc.player.prevPosZ); + } + + @Subscribe + public void onPacketReceive(PacketEvent.Read event) { + + if (event.getPacket() instanceof SPacketPlayerPosLook) { + bunnySpeed = 0; + } + + if (mc.player.isInWater() || mc.player.isInLava()) + return; + + if (!boost.getValue()) + return; + + if (event.getPacket() instanceof SPacketExplosion) { + + SPacketExplosion packet = (SPacketExplosion) event.getPacket(); + + dmgBoost = Math.hypot(packet.getMotionX(), packet.getMotionZ()); + + } else if (event.getPacket() instanceof SPacketEntityVelocity) { + + SPacketEntityVelocity packet = (SPacketEntityVelocity) event.getPacket(); + + if (packet.getEntityID() == mc.player.getEntityId()) { + dmgBoost = Math.hypot(packet.getMotionX() / 8000D, packet.getMotionZ() / 8000D); + isDmgBoostAbsolute = false; + } + + } + + } + + @Subscribe + public void onMove(MoveEvent event) { + + if (mc.player.isInWater() || mc.player.isInLava()) + return; + + double xzSpeed; + + double base = MotionUtil.applySpeed(.2873); + + if (mc.player.moveForward == 0 && mc.player.moveStrafing == 0 || mc.player.collidedHorizontally) + jumps = 0; + + if (mc.player.onGround && (mc.player.moveForward != 0 || mc.player.moveStrafing != 0)) { + + bunnySpeed = Math.max( + // current speed multiplied by a condensed version of mc friction code + bunnySpeed = .2 + bunnySpeed * (double) (mc.world.getBlockState(BlockPos.PooledMutableBlockPos.retain(mc.player.posX, mc.player.getEntityBoundingBox().minY - 1.0D, mc.player.posZ).setPos(mc.player.posX, mc.player.getEntityBoundingBox().minY - 1.0D, mc.player.posZ)).getBlock().getSlipperiness(mc.world.getBlockState(BlockPos.PooledMutableBlockPos.retain(mc.player.posX, mc.player.getEntityBoundingBox().minY - 1.0D, mc.player.posZ).setPos(mc.player.posX, mc.player.getEntityBoundingBox().minY - 1.0D, mc.player.posZ)), mc.world, BlockPos.PooledMutableBlockPos.retain(mc.player.posX, mc.player.getEntityBoundingBox().minY - 1.0D, mc.player.posZ), mc.player) * 0.91F), + getBunnySpeed(MotionUtil.applySpeed(.2873)) + ); + + // jump + event.y=(mc.player.motionY = MotionUtil.applyJumpBoost(.42F)); + + groundTick = 0; + slow = true; + + if (++jumps == 1) + bunnySpeed *= .95; + + } else if (slow || mc.player.collidedHorizontally) { + + // https://github.com/NoCheatPlus/NoCheatPlus/blob/f7b2c017fd66838ed2542fba483d7268ff01c2cf/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/player/SurvivalFly.java#L1692 + bunnySpeed -= 0.66 * base; + slow = false; + + } else + // https://github.com/NoCheatPlus/NoCheatPlus/blob/f7b2c017fd66838ed2542fba483d7268ff01c2cf/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/player/SurvivalFly.java#L1698 + // we use a little less so that we don't flag + bunnySpeed = lastDist - lastDist / 159; + + double oldSpeed = bunnySpeed; + if (dmgBoost >= 0) { + if (isDmgBoostAbsolute) { + bunnySpeed = dmgBoost - ((dmgBoost - bunnySpeed) * (1 - boostReduction.getValue())); + } else { + bunnySpeed += dmgBoost * (1 - boostReduction.getValue()); + } + dmgBoost = 0; + } + + bunnySpeed = Math.max(oldSpeed, bunnySpeed); + + xzSpeed = bunnySpeed = Math.max(base, bunnySpeed); + + // should never happen + + //event.setMotion(true); + + if (xzSpeed == Double.MIN_VALUE) + return; + + double[] dir = MotionUtil.getMotion(xzSpeed); + event.x=(dir[0]); + event.z=(dir[1]); + + } + + double getBunnySpeed(double base) { + + // prevent too aggressive acceleration causing flags + base = Math.min(1, base); + + //if (bunnyMode.getValue().equals("Normal")) + return base * 1.935; + //else + // return base * 1.87; + + } +} diff --git a/Client/src/main/java/com/baseband/client/setting/BooleanSetting.java b/Client/src/main/java/com/baseband/client/setting/BooleanSetting.java new file mode 100644 index 0000000..d6c2406 --- /dev/null +++ b/Client/src/main/java/com/baseband/client/setting/BooleanSetting.java @@ -0,0 +1,12 @@ +package com.baseband.client.setting; + +public class BooleanSetting extends Setting { + public BooleanSetting(String name, Boolean value) { + super(name, value); + } + + @Override + public void setByClass(String value) { + this.setValue(Boolean.parseBoolean(value)); + } +} diff --git a/Client/src/main/java/com/baseband/client/setting/EnumSetting.java b/Client/src/main/java/com/baseband/client/setting/EnumSetting.java new file mode 100644 index 0000000..8a85228 --- /dev/null +++ b/Client/src/main/java/com/baseband/client/setting/EnumSetting.java @@ -0,0 +1,12 @@ +package com.baseband.client.setting; + +public class EnumSetting > extends Setting { + public EnumSetting(String name, T value) { + super(name, value); + } + + @Override + public void setByClass(String value) { + + } +} \ No newline at end of file diff --git a/Client/src/main/java/com/baseband/client/setting/NumberSetting.java b/Client/src/main/java/com/baseband/client/setting/NumberSetting.java new file mode 100644 index 0000000..db9836d --- /dev/null +++ b/Client/src/main/java/com/baseband/client/setting/NumberSetting.java @@ -0,0 +1,67 @@ +package com.baseband.client.setting; + +public class NumberSetting extends Setting { + + T max; + T min; + + + public NumberSetting(String name, T value, T max, T min) { + super(name, value); + this.max= max; + this.min = min; + } + + + @Override + public void setByClass(String value) { + try { + T parsedValue = parseValue(value); + this.setValue(parsedValue); + } catch (NumberFormatException e) { + System.err.println("Invalid value format for " + this.getName()); + } + } + + @SuppressWarnings("unchecked") + private T parseValue(String value) { + if (getValue() instanceof Integer) { + return (T) Integer.valueOf(value); + } else if (getValue() instanceof Double) { + return (T) Double.valueOf(value); + } else if (getValue() instanceof Float) { + return (T) Float.valueOf(value); + } else if (getValue() instanceof Long) { + return (T) Long.valueOf(value); + } // Add additional checks for other Number subclasses as needed + return null; + } + + public void setValue(T value) { + if (max != null && min != null) { + Number maxNumber = max; + Number minNumber = min; + + double valueToMax = Math.abs(value.doubleValue() - maxNumber.doubleValue()); + double valueToMin = Math.abs(value.doubleValue() - minNumber.doubleValue()); + + if (valueToMax < valueToMin) { + this.value = max; + } else { + this.value = min; + } + + } else { + this.value = value; + } + } + + + public T getMin() { + return min; + } + + public T getMax() { + return max; + } +} diff --git a/Client/src/main/java/com/baseband/client/setting/Setting.java b/Client/src/main/java/com/baseband/client/setting/Setting.java new file mode 100644 index 0000000..f1b04a7 --- /dev/null +++ b/Client/src/main/java/com/baseband/client/setting/Setting.java @@ -0,0 +1,26 @@ +package com.baseband.client.setting; + +public abstract class Setting { + String name; + T value; + + + public Setting(String name, T value) { + this.name=name; + this.value=value; + } + + public abstract void setByClass(String value); + + public T getValue() { + return value; + } + + public void setValue(T value) { + this.value=value; + } + + public String getName() { + return name; + } +} diff --git a/Client/src/main/java/com/baseband/client/setting/StringSetting.java b/Client/src/main/java/com/baseband/client/setting/StringSetting.java new file mode 100644 index 0000000..de5f159 --- /dev/null +++ b/Client/src/main/java/com/baseband/client/setting/StringSetting.java @@ -0,0 +1,12 @@ +package com.baseband.client.setting; + +public class StringSetting extends Setting { + public StringSetting(String name, String value) { + super(name, value); + } + + @Override + public void setByClass(String value) { + this.setValue(value); + } +} diff --git a/Client/src/main/resources/mixins.baseband.json b/Client/src/main/resources/mixins.baseband.json index 078774b..e980a92 100644 --- a/Client/src/main/resources/mixins.baseband.json +++ b/Client/src/main/resources/mixins.baseband.json @@ -5,8 +5,10 @@ "minVersion": "0", "refmap": "mixins.baseband.refmap.json", "mixins": [ - "MixinMinecraft", "MixinForgeBus", - "MixinNetworkManager" + "MixinMinecraft", + "MixinNetworkManager", + "MixinEntityPlayerSP", + "ISPacketPlayerPosLook" ] } \ No newline at end of file diff --git a/Installer/src/main/java/org/baseband/installer/Installer.java b/Installer/src/main/java/org/baseband/installer/Installer.java index 42bc1cb..10fb39e 100644 --- a/Installer/src/main/java/org/baseband/installer/Installer.java +++ b/Installer/src/main/java/org/baseband/installer/Installer.java @@ -1,22 +1,10 @@ package org.baseband.installer; -import org.baseband.installer.util.library.LibraryInstaller; - import javax.swing.*; -import java.net.URL; public class Installer { - public static String mainClassPath = "org.baseband.launcher"; - public static String jarPath = "com/thnkscj/loader/1.0.0/Loader-1.0.0.jar"; - public static URL jarUrl = LibraryInstaller.toUrl("https://example.com/" + jarPath); - public static void main(String[] args) throws Exception { - //LibraryInstaller.download(); - //VersionInstaller.injectVersionJson(); - SwingUtilities.invokeLater(new Runnable() { - public void run() { - new InstallerApp(); - } - }); + public static void main(String[] args) { + SwingUtilities.invokeLater(InstallerApp::new); } } diff --git a/Installer/src/main/java/org/baseband/installer/InstallerApp.java b/Installer/src/main/java/org/baseband/installer/InstallerApp.java index 60640dc..98c92c9 100644 --- a/Installer/src/main/java/org/baseband/installer/InstallerApp.java +++ b/Installer/src/main/java/org/baseband/installer/InstallerApp.java @@ -121,7 +121,7 @@ public class InstallerApp { JOptionPane.showMessageDialog(loginFrame, "Your BaseBand account has been banned\nPlease contact support.", "BaseBand Installer", JOptionPane.ERROR_MESSAGE); System.exit(0); }else if (responseInt == -6){ - JOptionPane.showMessageDialog(loginFrame, "Your Password has been Reset\nPlease re-run the installer.", "BaseBand Installer", JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(loginFrame, "Your Password has been Reset\nPlease re-run the installer.", "BaseBand Installer", JOptionPane.INFORMATION_MESSAGE); System.exit(0); } else{ JOptionPane.showMessageDialog(loginFrame, "Invalid username or password.", "BaseBand Installer", JOptionPane.ERROR_MESSAGE); diff --git a/Installer/src/main/java/org/baseband/installer/util/library/LibraryInstaller.java b/Installer/src/main/java/org/baseband/installer/util/library/LibraryInstaller.java deleted file mode 100644 index ff0fc9d..0000000 --- a/Installer/src/main/java/org/baseband/installer/util/library/LibraryInstaller.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.baseband.installer.util.library; - -import org.baseband.installer.util.minecraft.MinecraftFiles; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.net.MalformedURLException; -import java.net.URL; -import java.nio.channels.Channels; -import java.nio.channels.ReadableByteChannel; - -import static org.baseband.installer.Installer.jarPath; -import static org.baseband.installer.Installer.jarUrl; - -public class LibraryInstaller { - - public static void download() throws Exception { - File f = new File(MinecraftFiles.getLibraries() + jarPath); - if (!f.exists()) { - try { - ReadableByteChannel rbc = Channels.newChannel(jarUrl.openStream()); - FileOutputStream fos = new FileOutputStream(MinecraftFiles.getLibraries() + jarPath); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - System.out.println("Successfully Downloaded Loader Jar"); - } catch (FileNotFoundException e) { - System.out.println("The URL Did Not Find A Valid Jar To Download, Skipping"); - } - } else { - System.out.println("The Loader Jar Has Already Been Downloaded"); - } - } - - public static URL toUrl(String s) { - try { - return new URL(s); - } catch (MalformedURLException e) { - throw new RuntimeException(e); - } - } -} diff --git a/Installer/src/main/java/org/baseband/installer/util/minecraft/MinecraftFiles.java b/Installer/src/main/java/org/baseband/installer/util/minecraft/MinecraftFiles.java index 096a710..74c0da5 100644 --- a/Installer/src/main/java/org/baseband/installer/util/minecraft/MinecraftFiles.java +++ b/Installer/src/main/java/org/baseband/installer/util/minecraft/MinecraftFiles.java @@ -4,25 +4,6 @@ import java.io.File; public class MinecraftFiles { private static final String os = System.getProperty("os.name").toLowerCase(); - private static final String minecraft = getMinecraft(); - private static String libraries; - private static String versions; - - public static String getMinecraft() { - String minecraft = null; - - assert os != null; - - if (os.contains("nux")) { - minecraft = System.getProperty("user.home") + "/.minecraft/"; - } else if (os.contains("darwin") || os.contains("mac")) { - minecraft = System.getProperty("user.home") + "/Library/Application Support/minecraft/"; - } else if (os.contains("win")) { - minecraft = System.getenv("APPDATA") + File.separator + ".minecraft" + File.separator; - } - - return minecraft; - } public static String getMinecraftMods() { String minecraft = null; @@ -39,20 +20,4 @@ public class MinecraftFiles { return minecraft; } - - public static String getVersions() { - if (minecraft != null) { - versions = minecraft + "versions" + File.separator; - } - return versions; - } - - public static String getLibraries() { - getMinecraft(); - - if (minecraft != null) { - libraries = minecraft + "libraries" + File.separator; - } - return libraries; - } } diff --git a/Installer/src/main/java/org/baseband/installer/util/version/VersionInstaller.java b/Installer/src/main/java/org/baseband/installer/util/version/VersionInstaller.java deleted file mode 100644 index 5482c96..0000000 --- a/Installer/src/main/java/org/baseband/installer/util/version/VersionInstaller.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.baseband.installer.util.version; - -import org.baseband.installer.Installer; -import org.baseband.installer.util.minecraft.MinecraftFiles; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.Objects; - -public class VersionInstaller { - - public static JSONObject parseJSONFile(String filename) throws JSONException, IOException { - String content = new String(Files.readAllBytes(Paths.get(filename))); - return new JSONObject(content); - } - - public static void injectVersionJson() throws IOException { - File file2 = new File(MinecraftFiles.getVersions()); - if (file2.isDirectory()) { - for (File file1 : Objects.requireNonNull(file2.listFiles())) { - if (!file1.isDirectory()) continue; - for (File file : Objects.requireNonNull(file1.listFiles())) { - if (!file.getName().contains(".json") || !file.getName().contains("1.12.2") || !file.getName().contains("forge")) - continue; - - String path = String.valueOf(Paths.get(file.getAbsolutePath())); - - editVersionArgs(path); - editVersionLibrarys(path); - } - } - } - } - - public static void editVersionArgs(String path) throws IOException { - JSONObject obj = parseJSONFile(path); - - String args = (String) obj.get("minecraftArguments"); - if (!args.contains("--tweakClass " + Installer.mainClassPath)) { - obj.remove("minecraftArguments"); - obj.put("minecraftArguments", args + " --tweakClass " + Installer.mainClassPath); - - Files.write(Paths.get(path), new JSONObject(obj.toString()).toString(2).getBytes()); - } - } - - public static void editVersionLibrarys(String path) throws IOException { - JSONObject obj = parseJSONFile(path); - JSONArray arr = obj.getJSONArray("libraries"); - String args = String.valueOf(obj); - - if (!args.contains(convertPath(Installer.jarPath))) { - JSONObject injectorJson = new JSONObject(); - - injectorJson.put("name", Installer.jarPath); - - JSONArray ModifiedArray = arr.put(injectorJson); - JSONObject newJson = obj.put("libraries", ModifiedArray); - - Files.write(Paths.get(path), new JSONObject(newJson.toString()).toString(4).getBytes()); - System.out.println("Successfully Added Args To The Forge JSON File"); - } else { - System.out.println("The Version Json Has Already Been Injected, Skipping"); - } - } - - public static String convertPath(String path) { - String[] split = path.split("/"); - return split[0] + "." + split[1] + ":" + split[2] + ":" + split[3]; - } -} diff --git a/Loader/src/main/java/org/baseband/launcher/launch/Loader.java b/Loader/src/main/java/org/baseband/launcher/launch/Loader.java index 35dbf18..e3d2af4 100644 --- a/Loader/src/main/java/org/baseband/launcher/launch/Loader.java +++ b/Loader/src/main/java/org/baseband/launcher/launch/Loader.java @@ -4,23 +4,18 @@ import net.minecraft.launchwrapper.Launch; import org.baseband.launcher.Tweaker; import org.baseband.launcher.util.CustomClassloader; import org.baseband.launcher.util.HWID; +import org.baseband.launcher.util.Key; import sun.misc.Unsafe; -import sun.reflect.Reflection; -import javax.crypto.Cipher; -import javax.crypto.SecretKey; -import javax.crypto.SecretKeyFactory; -import javax.crypto.spec.IvParameterSpec; -import javax.crypto.spec.PBEKeySpec; -import javax.crypto.spec.SecretKeySpec; import javax.swing.*; import java.io.*; import java.lang.management.ManagementFactory; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.Socket; -import java.security.SecureRandom; -import java.security.spec.KeySpec; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.util.*; import java.util.jar.JarOutputStream; import java.util.zip.ZipEntry; @@ -28,6 +23,9 @@ import java.util.zip.ZipInputStream; public class Loader { + public static Key classKey; + public static Key objectKey; + public static void initiate() { try { //Socket socket = new Socket("127.0.0.1", 31212); @@ -64,16 +62,33 @@ public class Loader { "\nPlease contact support for more details.", JOptionPane.ERROR_MESSAGE, true); } + //Set Class and Object encryption instances + Key communicationKey = new Key(ticket); + classKey = new Key(); + objectKey = new Key(); + + + if (System.getProperty("com.bb.debugKey") != null) { + if (System.getProperty("com.bb.debugKey").equalsIgnoreCase("true")) { + Tweaker.log.info("Debug via Java Argument \"-Dcom.bb.debugKey=true\""); + communicationKey.setDebug(true); + classKey.setDebug(true); + objectKey.setDebug(true); + } + } outputF.writeUTF("loader"); - outputF.writeUTF(username); - outputF.writeUTF(password); - outputF.writeUTF(HWID.generate()); + outputF.writeUTF(communicationKey.encryptString(username)); + outputF.writeUTF(communicationKey.encryptString(password)); + outputF.writeUTF(communicationKey.encryptString(HWID.generate())); boolean dump = dumpDetected(); outputF.writeBoolean(dump); outputF.writeUTF("reason"); //TODO: make this return reason + + + int responseCode = inputF.readInt(); switch (responseCode) { @@ -84,7 +99,7 @@ public class Loader { } case -2: { - message("HWID Reset.","Your HWID has been reset.", JOptionPane.INFORMATION_MESSAGE, false); + Tweaker.log.info("HWID Reset, Authenticated."); break; } @@ -125,7 +140,24 @@ public class Loader { Map classCache = new HashMap<>(); Map resources = new HashMap<>(); - try (ZipInputStream zipStream = new ZipInputStream(inputF)) { + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + + int l = inputF.readInt(); + byte[] buf = new byte[1024]; + int amt; + while (out.size() != l) { + amt = socket.getInputStream().read(buf); + out.write(buf, 0, amt); + } + + InputStream input = new ByteArrayInputStream(out.toByteArray()); + //Encryption! + //Nope! + + + + try (ZipInputStream zipStream = new ZipInputStream(input)) { ZipEntry zipEntry; while ((zipEntry = zipStream.getNextEntry()) != null) { byte[] buffer = new byte[1024]; @@ -139,7 +171,7 @@ public class Loader { if (zipEntry.getName().endsWith(".class")) { - classCache.put(zipEntry.getName().replace(".class", "").replace('/', '.'), encrypt(bos.toByteArray())); + classCache.put(zipEntry.getName().replace(".class", "").replace('/', '.'), classKey.encryptByte(bos.toByteArray())); } else { resources.put(zipEntry.getName(), bos.toByteArray()); } @@ -170,9 +202,11 @@ public class Loader { e.printStackTrace(); } } + socket.close(); Tweaker.log.info("Loaded classes."); Tweaker.latch.countDown(); } catch (Exception ignored) { + ignored.printStackTrace(); exit(); } } @@ -224,7 +258,7 @@ public class Loader { return true; } - getUnsafe().defineClass("sun.instrument.InstrumentationImpl", EMPTY_CLASS_BYTES, 0, EMPTY_CLASS_BYTES.length, null, null); + Objects.requireNonNull(getUnsafe()).defineClass("sun.instrument.InstrumentationImpl", EMPTY_CLASS_BYTES, 0, EMPTY_CLASS_BYTES.length, null, null); // this is for testing purposes to make sure it's actually loaded try { @@ -236,53 +270,10 @@ public class Loader { return false; } - public static byte[] key = null; - public static byte[] encrypt(byte[] bytes) { - if(key==null) { - SecureRandom rd = new SecureRandom(); - byte[] arr = new byte[127]; - rd.nextBytes(arr); - key=arr; - } - try { - final IvParameterSpec ivspec = new IvParameterSpec(new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - final SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); - final KeySpec spec = new PBEKeySpec(Arrays.toString(key).toCharArray(), "ssshhhhhhhhhhh!!!!".getBytes(), 65536, 256); - final SecretKey tmp = factory.generateSecret(spec); - final SecretKeySpec secretKey = new SecretKeySpec(tmp.getEncoded(), "AES"); - final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); - cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivspec); - - return Base64.getEncoder().encode(cipher.doFinal(bytes)); - } catch (Exception e) { - return null; - } - } - - public static byte[] decrypt(byte[] bytes) { - Reflection.getCallerClass(); - try { - final IvParameterSpec ivspec = new IvParameterSpec(new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - - final SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); - final KeySpec spec = new PBEKeySpec(Arrays.toString(key).toCharArray(), "ssshhhhhhhhhhh!!!!".getBytes(), 65536, 256); - final SecretKey tmp = factory.generateSecret(spec); - final SecretKeySpec secretKey = new SecretKeySpec(tmp.getEncoded(), "AES"); - - final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); - cipher.init(Cipher.DECRYPT_MODE, secretKey, ivspec); - - return cipher.doFinal(Base64.getDecoder().decode(bytes)); - } catch (Exception e) { - return null; - //unfunny decryption key above - //what no lmao it's - //regenerated every launch - } - } + private static Unsafe getUnsafe() { try { @@ -297,6 +288,30 @@ public class Loader { } } + public static String sha512hex(String toHash) { + MessageDigest digest; + try { + digest = MessageDigest.getInstance("SHA-512"); + } + catch (NoSuchAlgorithmException e) { + throw new RuntimeException("Impossible condition reached"); + } + return hash(toHash, digest); + } + + private static String hash(String toHash, MessageDigest digest) { + byte[] hash = digest.digest( + toHash.getBytes(StandardCharsets.UTF_8)); + StringBuilder hexString = new StringBuilder(); + for (byte b : hash) { + String hex = Integer.toHexString(0xff & b); + if (hex.length() == 1) hexString.append('0'); + hexString.append(hex); + } + return hexString.toString(); + } + + public static void message(String title, String message, int b, boolean exit) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); diff --git a/Loader/src/main/java/org/baseband/launcher/util/CustomClassloader.java b/Loader/src/main/java/org/baseband/launcher/util/CustomClassloader.java index 3067337..dcb6152 100644 --- a/Loader/src/main/java/org/baseband/launcher/util/CustomClassloader.java +++ b/Loader/src/main/java/org/baseband/launcher/util/CustomClassloader.java @@ -1,10 +1,10 @@ package org.baseband.launcher.util; import net.minecraft.launchwrapper.Launch; + import org.baseband.launcher.launch.Loader; import org.spongepowered.asm.service.MixinService; import org.spongepowered.asm.service.mojang.MixinServiceLaunchWrapper; -import sun.reflect.Reflection; import java.io.*; import java.lang.reflect.Field; @@ -14,13 +14,9 @@ import java.util.Objects; public class CustomClassloader extends ClassLoader { - public static CustomClassloader INSTANCE; - - - private byte[] classes; - - + public CustomClassloader INSTANCE; + private static byte[] cryptClasses; public CustomClassloader(Object obj) { @@ -49,7 +45,9 @@ public class CustomClassloader extends ClassLoader { } INSTANCE = new CustomClassloader(); - INSTANCE.classes=convertToBytes(classes); + //CustomClassloader.classes = classes; + + cryptClasses = Loader.objectKey.serializeObject(classes); try { @@ -65,7 +63,8 @@ public class CustomClassloader extends ClassLoader { @Override protected Class findClass(String name) throws ClassNotFoundException { if(name.startsWith("com.baseband")) { - byte[] data = Loader.decrypt((byte[]) ((HashMap) Objects.requireNonNull(convertFromBytes(classes))).get(name)); + //byte[] data = Loader.decrypt(classes.get(name)); + byte[] data = Loader.classKey.decryptByte((byte[]) ((HashMap) Objects.requireNonNull(Loader.objectKey.deserializeObject(cryptClasses))).get(name)); if (data == null) { return super.findClass(name); } @@ -86,42 +85,28 @@ public class CustomClassloader extends ClassLoader { } - private byte[] convertToBytes(Object object) { - Reflection.getCallerClass(); - try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ObjectOutputStream out = new ObjectOutputStream(bos)) { - out.writeObject(object); - return Loader.encrypt(bos.toByteArray()); - }catch (IOException e){ - return null; - } - } - - private Object convertFromBytes(byte[] bytes) { - try (ByteArrayInputStream bis = new ByteArrayInputStream(Objects.requireNonNull(Loader.decrypt(bytes))); - ObjectInputStream in = new ObjectInputStream(bis)) { - return in.readObject(); - }catch (IOException | ClassNotFoundException e){ - return null; - } - } + - private class CustomMixinServer extends MixinServiceLaunchWrapper { + private static class CustomMixinServer extends MixinServiceLaunchWrapper { @Override public byte[] getClassBytes(String name, String transformedName) throws IOException { - byte[] bytes = Loader.decrypt((byte[]) ((HashMap) Objects.requireNonNull(convertFromBytes(classes))).get(name)); - if (bytes != null) { - return bytes; + if(name.startsWith("com.baseband")) { + byte[] bytes = Loader.classKey.decryptByte((byte[]) ((HashMap) Objects.requireNonNull(Loader.objectKey.deserializeObject(cryptClasses))).get(name)); + if (bytes != null) { + return bytes; + } } return super.getClassBytes(name, transformedName); } @Override public byte[] getClassBytes(String name, boolean runTransformers) throws ClassNotFoundException, IOException { - byte[] bytes = Loader.decrypt((byte[]) ((HashMap) Objects.requireNonNull(convertFromBytes(classes))).get(name)); - if (bytes != null) { - return bytes; + if(name.startsWith("com.baseband")) { + byte[] bytes = Loader.classKey.decryptByte((byte[]) ((HashMap) Objects.requireNonNull(Loader.objectKey.deserializeObject(cryptClasses))).get(name)); + if (bytes != null) { + return bytes; + } } return super.getClassBytes(name, runTransformers); } diff --git a/Loader/src/main/java/org/baseband/launcher/util/Key.java b/Loader/src/main/java/org/baseband/launcher/util/Key.java new file mode 100644 index 0000000..317e1f6 --- /dev/null +++ b/Loader/src/main/java/org/baseband/launcher/util/Key.java @@ -0,0 +1,193 @@ +package org.baseband.launcher.util; + +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.PBEKeySpec; +import javax.crypto.spec.SecretKeySpec; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.security.SecureRandom; +import java.security.spec.KeySpec; +import java.util.UUID; + +public class Key { + //Daniella made the actual encryption, + //Jess made the serialization/byte handling/randomTicket + + protected final String string; + + private boolean debug = false; + /** + * Generates a random Key + */ + public Key() { + string = getRandomTicket(); + } + + public Key(String key) { + string = key; + } + + public void setDebug(boolean debug) { + this.debug = debug; + } + + private static String getRandomTicket() { + StringBuilder buffer = new StringBuilder(); + for (int count = 0; count < 64; ++count) { + buffer.append(UUID.randomUUID()); + } + return buffer.toString(); + } + + + public byte[] serializeObject(Object obj) { + try { + if(debug) { + System.out.println(obj + " serialize + encrypt"); + } + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + ObjectOutputStream objectOut = new ObjectOutputStream(byteArrayOutputStream); + objectOut.writeObject(obj); + objectOut.close(); + return encryptByte(byteArrayOutputStream.toByteArray()); + } catch (IOException e) { + e.printStackTrace(); + return null; // Return null in case of an error + } + } + + public Object deserializeObject(byte[] bytes) { + try { + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(decryptByte(bytes)); + ObjectInputStream objectIn = new ObjectInputStream(byteArrayInputStream); + Object obj = objectIn.readObject(); + objectIn.close(); + if(debug) { + System.out.println(obj + " deserialize + decrypt"); + } + return obj; + } catch (IOException | ClassNotFoundException e) { + e.printStackTrace(); + return null; // Return null in case of an error + } + } + + public byte[] encryptByte(byte[] bytes) { + if(bytes == null) { + return null; + } + try { + //bytes = encrypt(bytes, string.toCharArray()); + } catch (Exception e) { + throw new RuntimeException(e); + } + + return bytes; + } + + public byte[] decryptByte(byte[] bytes) { + if(bytes == null) { + return null; + } + try { + //bytes = decrypt(bytes, string.toCharArray()); + } catch (Exception e) { + throw new RuntimeException(e); + } + + return bytes; + } + + + + public byte[] encrypt(byte[] data, char[] password) throws Exception { + SecureRandom random = new SecureRandom(); + byte[] salt = new byte[16]; + random.nextBytes(salt); + + KeySpec keySpec = new PBEKeySpec(password, salt, 65536, 256); + SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); + byte[] keyBytes = factory.generateSecret(keySpec).getEncoded(); + SecretKey key = new SecretKeySpec(keyBytes, "AES"); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + byte[] ivBytes = new byte[16]; + random.nextBytes(ivBytes); + IvParameterSpec iv = new IvParameterSpec(ivBytes); + + cipher.init(Cipher.ENCRYPT_MODE, key, iv); + + byte[] encryptedData = cipher.doFinal(data); + + // Prepend salt and IV to the encrypted data + byte[] result = new byte[salt.length + ivBytes.length + encryptedData.length]; + System.arraycopy(salt, 0, result, 0, salt.length); + System.arraycopy(ivBytes, 0, result, salt.length, ivBytes.length); + System.arraycopy(encryptedData, 0, result, salt.length + ivBytes.length, encryptedData.length); + + return result; + } + + public byte[] decrypt(byte[] encryptedData, char[] password) throws Exception { + byte[] salt = new byte[16]; + byte[] ivBytes = new byte[16]; + byte[] data = new byte[encryptedData.length - 32]; // Subtract salt and IV lengths + + System.arraycopy(encryptedData, 0, salt, 0, 16); + System.arraycopy(encryptedData, 16, ivBytes, 0, 16); + System.arraycopy(encryptedData, 32, data, 0, data.length); + + KeySpec keySpec = new PBEKeySpec(password, salt, 65536, 256); + SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); + byte[] keyBytes = factory.generateSecret(keySpec).getEncoded(); + SecretKey key = new SecretKeySpec(keyBytes, "AES"); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + IvParameterSpec iv = new IvParameterSpec(ivBytes); + + cipher.init(Cipher.DECRYPT_MODE, key, iv); + + return cipher.doFinal(data); + } + + /** + * Encrypts a string + * @param s string to encrypt + * @return encrypted string + */ + public String encryptString(String s) { + byte[] bytes = s.getBytes(StandardCharsets.ISO_8859_1); + byte[] eb = string.getBytes(StandardCharsets.ISO_8859_1); + int len = bytes.length; + int p = eb.length; + for (int i = 0 ; i < len ; i+=p) { + for (int j = 0 ; j < p && i + j < len ; j++) { + int idx = i + j; + bytes[idx] = (byte) ((int) bytes[idx] + (int) eb[j]); + } + } + return new String(bytes, StandardCharsets.ISO_8859_1); + } + + /** + * Decrypts a string + * @param s string to decrypt + * @return decrypted string + */ + public String decryptString(String s) { + byte[] bytes = s.getBytes(StandardCharsets.ISO_8859_1); + byte[] eb = string.getBytes(StandardCharsets.ISO_8859_1); + int len = bytes.length; + int p = eb.length; + for (int i = 0 ; i < len ; i+=p) { + for (int j = 0 ; j < p && i + j < len ; j++) { + int idx = i + j; + bytes[idx] = (byte) ((int) bytes[idx] - (int) eb[j]); + } + } + return new String(bytes, StandardCharsets.ISO_8859_1); + } +} diff --git a/Server/src/main/java/dev/baseband/server/socket/Bot.java b/Server/src/main/java/dev/baseband/server/socket/Bot.java index 31fc0b2..bba6520 100644 --- a/Server/src/main/java/dev/baseband/server/socket/Bot.java +++ b/Server/src/main/java/dev/baseband/server/socket/Bot.java @@ -57,16 +57,15 @@ public class Bot extends ListenerAdapter { }else { event.getChannel().sendMessage("Cannot find User [**" + username + "**]").queue(); } - } else if (message[0].equalsIgnoreCase("-adduser") && message.length == 3) { + } else if (message[0].equalsIgnoreCase("-adduser") && message.length == 2) { if (this.findRole(Objects.requireNonNull(event.getMember()), "Staff") == null) { event.getChannel().sendMessage("Invalid Perms (Requires Staff Role)").queue(); return; } String username = message[1]; - String hashedPassword = message[2]; if(!UserManager.users.usernameExists(username)) { - UserManager.users.put(username, hashedPassword, "hwid", "true", "false"); + UserManager.users.put(username, "reset", "hwid", "true", "false"); event.getChannel().sendMessage("Created User [**" + username + "**]").queue(); }else { event.getChannel().sendMessage("User [**" + username + "**] already exists.").queue(); @@ -78,7 +77,7 @@ public class Bot extends ListenerAdapter { } // Loop through the outer map for (Map.Entry> entry : UserManager.users.getMap().entrySet()) { - StringBuilder stringBuilder = new StringBuilder("=============================="); + StringBuilder stringBuilder = new StringBuilder("==============================").append("\n"); String outerKey = entry.getKey(); Map innerMap = entry.getValue(); diff --git a/Server/src/main/java/dev/baseband/server/socket/ClientHandler.java b/Server/src/main/java/dev/baseband/server/socket/ClientHandler.java index 563b461..bf7a8f2 100644 --- a/Server/src/main/java/dev/baseband/server/socket/ClientHandler.java +++ b/Server/src/main/java/dev/baseband/server/socket/ClientHandler.java @@ -1,9 +1,6 @@ package dev.baseband.server.socket; -import java.io.BufferedInputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.FileInputStream; +import java.io.*; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -18,6 +15,7 @@ public class ClientHandler extends Thread { @Override public void run() { try { + client.setSoTimeout(5000); DataOutputStream dos = new DataOutputStream(client.getOutputStream()); DataInputStream dis = new DataInputStream(client.getInputStream()); @@ -25,11 +23,12 @@ public class ClientHandler extends Thread { //We are confirming that we are who we say we are String ticket = dis.readUTF(); dos.writeUTF(ticket); + Key key = new Key(ticket); String type = dis.readUTF(); - String username = dis.readUTF(); - String hashedPassword = sha512hex(dis.readUTF()); - String hwid = dis.readUTF(); + String username = key.decryptString(dis.readUTF()); + String hashedPassword = sha512hex(key.decryptString(dis.readUTF())); + String hwid = key.decryptString(dis.readUTF()); boolean dump = dis.readBoolean(); @@ -51,7 +50,6 @@ public class ClientHandler extends Thread { System.out.println("(We are banning this user.)"); UserManager.users.setIsBanned(username, "true"); dos.writeInt(-5); - client.close(); System.out.println("========================================"); return; } @@ -81,13 +79,12 @@ public class ClientHandler extends Thread { dos.writeInt(result); } else if(result == -6){ System.out.println("Password Reset."); + UserManager.users.setPassword(username, hashedPassword); dos.writeInt(result); }else{ System.out.println("Auth failed"); dos.writeInt(result); } - - client.close(); System.out.println("========================================"); return; } @@ -95,30 +92,32 @@ public class ClientHandler extends Thread { if (result == 0 || result == -2) { System.out.println("Client is valid"); - dos.writeInt(result); + + byte[] bytes = new byte[(int) Socket.clientFile.length()]; FileInputStream fis = new FileInputStream(Socket.clientFile); BufferedInputStream bis = new BufferedInputStream(fis); - bis.read(bytes, 0, bytes.length); + + dos.writeInt(bytes.length); + dos.write(bytes, 0, bytes.length); dos.flush(); System.out.println("Sent File To Client"); System.out.println("========================================"); - client.close(); } else { System.out.println("Invalid, Error code "+result); - System.out.println("========================================"); dos.writeInt(result); - client.close(); + System.out.println("========================================"); } } catch (Exception e) { + e.printStackTrace(); this.interrupt(); } } diff --git a/Server/src/main/java/dev/baseband/server/socket/Key.java b/Server/src/main/java/dev/baseband/server/socket/Key.java new file mode 100644 index 0000000..427729d --- /dev/null +++ b/Server/src/main/java/dev/baseband/server/socket/Key.java @@ -0,0 +1,139 @@ +package dev.baseband.server.socket; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.UUID; + +public class Key { + //Daniella made the actual encryption, + //Jess made the serialization/byte handling/randomTicket + + protected final String string; + + private boolean debug = false; + /** + * Generates a random Key + */ + public Key() { + string = getRandomTicket(); + } + + public Key(String key) { + string = key; + } + + public void setDebug(boolean debug) { + this.debug = debug; + } + + private static String getRandomTicket() { + StringBuilder buffer = new StringBuilder(); + for (int count = 0; count < 64; ++count) { + buffer.append(UUID.randomUUID()); + } + return buffer.toString(); + } + + + public byte[] serializeObject(Object obj) { + try { + if(debug) { + System.out.println(obj + " serialize + encrypt"); + } + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + ObjectOutputStream objectOut = new ObjectOutputStream(byteArrayOutputStream); + objectOut.writeObject(obj); + objectOut.close(); + return encryptByte(byteArrayOutputStream.toByteArray()); + } catch (IOException e) { + e.printStackTrace(); + return null; // Return null in case of an error + } + } + + public Object deserializeObject(byte[] bytes) { + try { + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(decryptByte(bytes)); + ObjectInputStream objectIn = new ObjectInputStream(byteArrayInputStream); + Object obj = objectIn.readObject(); + objectIn.close(); + if(debug) { + System.out.println(obj + " serialize + encrypt"); + } + return obj; + } catch (IOException | ClassNotFoundException e) { + e.printStackTrace(); + return null; // Return null in case of an error + } + } + + public byte[] encryptByte(byte[] bytes) { + if(bytes == null) { + return null; + } + byte[] eb = string.getBytes(StandardCharsets.ISO_8859_1); + int len = bytes.length; + int p = eb.length; + for (int i = 0 ; i < len ; i+=p) { + for (int j = 0 ; j < p && i + j < len ; j++) { + int idx = i + j; + bytes[idx] = (byte) ((int) bytes[idx] + (int) eb[j]); + } + } + return bytes; + } + + public byte[] decryptByte(byte[] bytes) { + if(bytes == null) { + return null; + } + byte[] eb = string.getBytes(StandardCharsets.ISO_8859_1); + int len = bytes.length; + int p = eb.length; + for (int i = 0 ; i < len ; i+=p) { + for (int j = 0 ; j < p && i + j < len ; j++) { + int idx = i + j; + bytes[idx] = (byte) ((int) bytes[idx] - (int) eb[j]); + } + } + return bytes; + } + + /** + * Encrypts a string + * @param s string to encrypt + * @return encrypted string + */ + public String encryptString(String s) { + byte[] bytes = s.getBytes(StandardCharsets.ISO_8859_1); + byte[] eb = string.getBytes(StandardCharsets.ISO_8859_1); + int len = bytes.length; + int p = eb.length; + for (int i = 0 ; i < len ; i+=p) { + for (int j = 0 ; j < p && i + j < len ; j++) { + int idx = i + j; + bytes[idx] = (byte) ((int) bytes[idx] + (int) eb[j]); + } + } + return new String(bytes, StandardCharsets.ISO_8859_1); + } + + /** + * Decrypts a string + * @param s string to decrypt + * @return decrypted string + */ + public String decryptString(String s) { + byte[] bytes = s.getBytes(StandardCharsets.ISO_8859_1); + byte[] eb = string.getBytes(StandardCharsets.ISO_8859_1); + int len = bytes.length; + int p = eb.length; + for (int i = 0 ; i < len ; i+=p) { + for (int j = 0 ; j < p && i + j < len ; j++) { + int idx = i + j; + bytes[idx] = (byte) ((int) bytes[idx] - (int) eb[j]); + } + } + return new String(bytes, StandardCharsets.ISO_8859_1); + } +}