From decd4e3c511cc7b4d62b5f2e85c8fcd435ab4d20 Mon Sep 17 00:00:00 2001 From: Dawson <30784509+funkemunky@users.noreply.github.com> Date: Thu, 22 Sep 2022 16:58:34 -0400 Subject: [PATCH] Adding health spoofing - Optimized Materials class code. - Optimized Horizontal - Added kauri to command. - Added health spoofing in JoinListener. --- .../check/impl/movement/speed/Horizontal.java | 13 ++----- .../ac/check/impl/packet/Metadata.java | 39 ------------------- .../brighten/ac/command/AnticheatCommand.java | 2 +- .../brighten/ac/listener/JoinListener.java | 28 ++++++++++++- .../ac/packet/handler/ModernHandler.java | 25 ++++++++---- .../ac/packet/handler/SilentObject.java | 8 ++++ .../ac/packet/listener/PacketProcessor.java | 4 ++ .../ac/packet/wrapper/impl/Processor_18.java | 25 +++++------- .../out/WPacketPlayOutEntityMetadata.java | 2 + .../out/WPacketPlayOutNamedEntitySpawn.java | 2 + .../java/dev/brighten/ac/utils/Materials.java | 36 ++++++++--------- 11 files changed, 90 insertions(+), 94 deletions(-) delete mode 100644 src/main/java/dev/brighten/ac/check/impl/packet/Metadata.java create mode 100644 src/main/java/dev/brighten/ac/packet/handler/SilentObject.java diff --git a/src/main/java/dev/brighten/ac/check/impl/movement/speed/Horizontal.java b/src/main/java/dev/brighten/ac/check/impl/movement/speed/Horizontal.java index c307726..a897967 100644 --- a/src/main/java/dev/brighten/ac/check/impl/movement/speed/Horizontal.java +++ b/src/main/java/dev/brighten/ac/check/impl/movement/speed/Horizontal.java @@ -296,18 +296,14 @@ public class Horizontal extends Check { tagsBuilder.addTag("sneak-edge"); } - List collisionBoxes = Helper.getCollisions(player.getBukkitPlayer().getWorld(), - box.copy() - .addCoord(lmotionX ,lmotionY, lmotionZ), Materials.SOLID); + List collisionBoxes = Helper.toCollisionsDowncasted(Helper + .blockCollisions(player.getBlockInfo().blocks, box.copy() + .addCoord(lmotionX ,lmotionY, lmotionZ), Materials.SOLID)); - double beforeY = lmotionY; - int yCount = 0; for (SimpleCollisionBox blockBox : collisionBoxes) { - yCount++; lmotionY = blockBox.calculateYOffset(box, lmotionY); } - double afterY = lmotionY; box = box.offset(0, lmotionY, 0); boolean stepped = onGround || (originalY != lmotionY && originalY < 0); @@ -456,7 +452,6 @@ public class Horizontal extends Check { pmotionz = y; pmotiony = z; - tagsBuilder.addTag(String.format("X: %.6f, Y: %.6f, z: %.6f", originalX, originalY, originalZ)); tags = tagsBuilder; if (deltaAll < precision) { @@ -649,4 +644,4 @@ public class Horizontal extends Check { private static float roundToFloat(double d) { return (float) ((double) Math.round(d * 1.0E8D) / 1.0E8D); } -} +} \ No newline at end of file diff --git a/src/main/java/dev/brighten/ac/check/impl/packet/Metadata.java b/src/main/java/dev/brighten/ac/check/impl/packet/Metadata.java deleted file mode 100644 index f9f659e..0000000 --- a/src/main/java/dev/brighten/ac/check/impl/packet/Metadata.java +++ /dev/null @@ -1,39 +0,0 @@ -package dev.brighten.ac.check.impl.packet; - -import dev.brighten.ac.api.check.CheckType; -import dev.brighten.ac.check.Check; -import dev.brighten.ac.check.CheckData; -import dev.brighten.ac.check.WAction; -import dev.brighten.ac.data.APlayer; -import dev.brighten.ac.packet.wrapper.out.WPacketPlayOutEntityMetadata; -import dev.brighten.ac.packet.wrapper.out.WPacketPlayOutSpawnEntityLiving; - -@CheckData(name = "Metadata", checkId = "metadata", type = CheckType.BADPACKETS) -public class Metadata extends Check { - - public Metadata(APlayer player) { - super(player); - } - - WAction packet = packet -> { - debug("entityId: " + packet.getEntityId()); - packet.getWatchedObjects().forEach(watchedObject -> { - debug("watchedObject: " + watchedObject.getObjectType() + "," + watchedObject.getDataValueId() + ", " + watchedObject.getWatchedObject()); - }); - }; - - WAction spawn = packet -> { - debug("(spawned) entityId: " + packet.getEntityId()); - packet.getWatchedObjects().forEach(watchedObject -> { - if(watchedObject.getDataValueId() == 0) { - byte bitInfo = (byte) watchedObject.getWatchedObject(); - boolean sneaking = (bitInfo & 1 << 1) != 0; - boolean sprinting = (bitInfo & 1 << 3) != 0; - boolean invisible = (bitInfo & 1 << 5) != 0; - - debug("sneaking:%s sprinting:%s invisible:%s", sneaking, sprinting, invisible); - } - debug("watchedObject: " + watchedObject.getObjectType() + "," + watchedObject.getDataValueId() + ", " + watchedObject.getWatchedObject()); - }); - }; -} diff --git a/src/main/java/dev/brighten/ac/command/AnticheatCommand.java b/src/main/java/dev/brighten/ac/command/AnticheatCommand.java index edfd557..72953f7 100644 --- a/src/main/java/dev/brighten/ac/command/AnticheatCommand.java +++ b/src/main/java/dev/brighten/ac/command/AnticheatCommand.java @@ -47,7 +47,7 @@ import java.util.stream.Collectors; import java.util.zip.CRC32; @Init -@CommandAlias("anticheat|ac") +@CommandAlias("kauri|anticheat|ac") @CommandPermission("anticheat.command") public class AnticheatCommand extends BaseCommand { diff --git a/src/main/java/dev/brighten/ac/listener/JoinListener.java b/src/main/java/dev/brighten/ac/listener/JoinListener.java index 28f0df8..d3ce1bc 100644 --- a/src/main/java/dev/brighten/ac/listener/JoinListener.java +++ b/src/main/java/dev/brighten/ac/listener/JoinListener.java @@ -3,8 +3,13 @@ package dev.brighten.ac.listener; import dev.brighten.ac.Anticheat; import dev.brighten.ac.data.APlayer; import dev.brighten.ac.packet.handler.HandlerAbstract; +import dev.brighten.ac.packet.wrapper.PacketType; +import dev.brighten.ac.packet.wrapper.objects.WrappedWatchableObject; +import dev.brighten.ac.packet.wrapper.out.WPacketPlayOutEntityMetadata; +import dev.brighten.ac.packet.wrapper.out.WPacketPlayOutNamedEntitySpawn; import dev.brighten.ac.utils.RunUtils; import dev.brighten.ac.utils.annotation.Init; +import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -28,6 +33,25 @@ public class JoinListener implements Listener { .process(player, event.getType(), event.getPacket())) { event.setCancelled(true); } + + if(event.getType().equals(PacketType.ENTITY_METADATA)) { + WPacketPlayOutEntityMetadata packet = event.getPacket(); + + for (WrappedWatchableObject watchedObject : packet.getWatchedObjects()) { + if(watchedObject.getDataValueId() == 6 && watchedObject.getWatchedObject() instanceof Float) { + watchedObject.setWatchedObject(1f); + + Bukkit.broadcastMessage("Set watched object and sending packet:" + + watchedObject.getWatchedObject()); + + HandlerAbstract.getHandler().sendPacket(player, packet.getPacket()); + event.setCancelled(true); + break; + } + } + } else if(event.getType().equals(PacketType.NAMED_ENTITY_SPAWN)) { + WPacketPlayOutNamedEntitySpawn packet = event.getPacket(); + } }); }); @@ -42,7 +66,7 @@ public class JoinListener implements Listener { if(player.isSendingPackets()) return; - /*if(event.getType().equals(PacketType.CLIENT_TRANSACTION)) { + if(event.getType().equals(PacketType.CLIENT_TRANSACTION)) { if(player.getPacketQueue().size() > 0) { player.setSendingPackets(true); Object packetToSend = null; @@ -73,7 +97,7 @@ public class JoinListener implements Listener { break; } } - }*/ + } }); } diff --git a/src/main/java/dev/brighten/ac/packet/handler/ModernHandler.java b/src/main/java/dev/brighten/ac/packet/handler/ModernHandler.java index d035481..77a9f83 100644 --- a/src/main/java/dev/brighten/ac/packet/handler/ModernHandler.java +++ b/src/main/java/dev/brighten/ac/packet/handler/ModernHandler.java @@ -12,6 +12,7 @@ import dev.brighten.ac.utils.reflections.impl.CraftReflection; import dev.brighten.ac.utils.reflections.impl.MinecraftReflection; import dev.brighten.ac.utils.reflections.types.WrappedClass; import io.netty.channel.*; +import lombok.SneakyThrows; import net.minecraft.server.v1_8_R3.PacketLoginInStart; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -152,8 +153,8 @@ public class ModernHandler extends HandlerAbstract { @Override public void sendPacket(Player player, Object packet) { if(packet instanceof WPacket) { - getChannel(player).pipeline().writeAndFlush(((WPacket) packet).getPacket()); - } else getChannel(player).pipeline().writeAndFlush(packet); + getChannel(player).pipeline().writeAndFlush((new SilentObject(((WPacket) packet).getPacket()))); + } else getChannel(player).pipeline().writeAndFlush(new SilentObject(packet)); } @Override @@ -192,7 +193,13 @@ public class ModernHandler extends HandlerAbstract { private Player player; @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) { + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + + if(msg instanceof SilentObject) { + super.channelRead(ctx, ((SilentObject)msg).packet); + return; + } + String name = msg.getClass().getName(); int index = name.lastIndexOf("."); String packetName = name.substring(index + 1); @@ -229,16 +236,18 @@ public class ModernHandler extends HandlerAbstract { } } } else { - try { - super.channelRead(ctx, msg); - } catch (Exception e) { - e.printStackTrace(); - } + super.channelRead(ctx, msg); } } @Override public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { + + if(msg instanceof SilentObject) { + super.write(ctx, ((SilentObject)msg).packet, promise); + return; + } + String name = msg.getClass().getName(); int index = name.lastIndexOf("."); String packetName = name.substring(index + 1); diff --git a/src/main/java/dev/brighten/ac/packet/handler/SilentObject.java b/src/main/java/dev/brighten/ac/packet/handler/SilentObject.java new file mode 100644 index 0000000..03ae5db --- /dev/null +++ b/src/main/java/dev/brighten/ac/packet/handler/SilentObject.java @@ -0,0 +1,8 @@ +package dev.brighten.ac.packet.handler; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +class SilentObject { + public final Object packet; +} diff --git a/src/main/java/dev/brighten/ac/packet/listener/PacketProcessor.java b/src/main/java/dev/brighten/ac/packet/listener/PacketProcessor.java index 2efe933..02b4abe 100644 --- a/src/main/java/dev/brighten/ac/packet/listener/PacketProcessor.java +++ b/src/main/java/dev/brighten/ac/packet/listener/PacketProcessor.java @@ -159,6 +159,10 @@ public class PacketProcessor { for (ListenerEntry tuple : list) { tuple.getListener().onEvent(asyncInfo); + + if (asyncInfo.isCancelled()) { + cancelled = true; + } } } return cancelled ? null : info.getPacket(); diff --git a/src/main/java/dev/brighten/ac/packet/wrapper/impl/Processor_18.java b/src/main/java/dev/brighten/ac/packet/wrapper/impl/Processor_18.java index aa6fd86..3429e08 100644 --- a/src/main/java/dev/brighten/ac/packet/wrapper/impl/Processor_18.java +++ b/src/main/java/dev/brighten/ac/packet/wrapper/impl/Processor_18.java @@ -591,16 +591,11 @@ public class Processor_18 implements PacketConverter { PacketPlayOutNamedEntitySpawn packet = (PacketPlayOutNamedEntitySpawn) object; PacketDataSerializer serial = serialize(packet); - - WPacketPlayOutNamedEntitySpawn nes = WPacketPlayOutNamedEntitySpawn.builder().entityId(serial.e()).uuid(serial.g()) + return WPacketPlayOutNamedEntitySpawn.builder().entityId(serial.e()).uuid(serial.g()) .x(serial.readInt() / 32.).y(serial.readInt() / 32.).z(serial.readInt() / 32.) .yaw(serial.readByte() * 360.F / 256.F).pitch(serial.readByte() * 360.F / 256.F) .itemInHand(MiscUtils.getById(serial.readShort())) .build(); - - - - return nes; } @Override @@ -627,8 +622,8 @@ public class Processor_18 implements PacketConverter { return vanilla; } - private static WrappedClass classSpawnEntityLiving = new WrappedClass(PacketPlayOutSpawnEntityLiving.class); - private static WrappedField splDataWatcher = classSpawnEntityLiving.getFieldByType(DataWatcher.class, 0), + private static final WrappedClass classSpawnEntityLiving = new WrappedClass(PacketPlayOutSpawnEntityLiving.class); + private static final WrappedField splDataWatcher = classSpawnEntityLiving.getFieldByType(DataWatcher.class, 0), splWatchList = classSpawnEntityLiving.getFieldByType(List.class, 0); @SneakyThrows @@ -652,8 +647,8 @@ public class Processor_18 implements PacketConverter { return builder.build(); } - private static WrappedClass dataWatcherClass = new WrappedClass(DataWatcher.class); - private static WrappedField watchableMap = dataWatcherClass.getFieldByName("d"); + private static final WrappedClass dataWatcherClass = new WrappedClass(DataWatcher.class); + private static final WrappedField watchableMap = dataWatcherClass.getFieldByName("d"); @Override public Object processSpawnLiving(WPacketPlayOutSpawnEntityLiving packet) { PacketPlayOutSpawnEntityLiving vanilla = new PacketPlayOutSpawnEntityLiving(); @@ -674,10 +669,9 @@ public class Processor_18 implements PacketConverter { try { DataWatcher watcher = new DataWatcher(null); - packet.getWatchedObjects().forEach(w ->{ - watcher.a(w.getDataValueId(), w.getWatchedObject()); - System.out.println("Adding object: " + w.getDataValueId() + ";" + w.getWatchedObject()); - }); + for (WrappedWatchableObject w : packet.getWatchedObjects()) { + watcher.a(w.getDataValueId(), w.getWatchedObject());; + } watcher.a(serializer); splDataWatcher.set(vanilla, watcher); @@ -751,7 +745,7 @@ public class Processor_18 implements PacketConverter { serialized.b(packet.getEntityId()); List watchedObjects = packet.getWatchedObjects().stream() - .map(w -> (DataWatcher.WatchableObject)w.getVanillaObject()).collect(Collectors.toList()); + .map(w -> (DataWatcher.WatchableObject)w.toVanillaObject()).collect(Collectors.toList()); try { DataWatcher.a(watchedObjects, serialized); @@ -790,7 +784,6 @@ public class Processor_18 implements PacketConverter { private static void writePacketData(PacketDataSerializer serializer, List objects) { for (WrappedWatchableObject object : objects) { - System.out.println("Writing object:" + object.getDataValueId() + ";" + object.getWatchedObject()); int i = (object.getObjectType() << 5 | object.getDataValueId() & 31) & 255; serializer.writeByte(i); switch (object.getObjectType()) { diff --git a/src/main/java/dev/brighten/ac/packet/wrapper/out/WPacketPlayOutEntityMetadata.java b/src/main/java/dev/brighten/ac/packet/wrapper/out/WPacketPlayOutEntityMetadata.java index 236f375..8f63bb8 100644 --- a/src/main/java/dev/brighten/ac/packet/wrapper/out/WPacketPlayOutEntityMetadata.java +++ b/src/main/java/dev/brighten/ac/packet/wrapper/out/WPacketPlayOutEntityMetadata.java @@ -6,11 +6,13 @@ import dev.brighten.ac.packet.wrapper.WPacket; import dev.brighten.ac.packet.wrapper.objects.WrappedWatchableObject; import lombok.Builder; import lombok.Getter; +import lombok.Setter; import java.util.List; @Builder @Getter +@Setter public class WPacketPlayOutEntityMetadata extends WPacket { private int entityId; diff --git a/src/main/java/dev/brighten/ac/packet/wrapper/out/WPacketPlayOutNamedEntitySpawn.java b/src/main/java/dev/brighten/ac/packet/wrapper/out/WPacketPlayOutNamedEntitySpawn.java index c11be4f..e71f352 100644 --- a/src/main/java/dev/brighten/ac/packet/wrapper/out/WPacketPlayOutNamedEntitySpawn.java +++ b/src/main/java/dev/brighten/ac/packet/wrapper/out/WPacketPlayOutNamedEntitySpawn.java @@ -5,12 +5,14 @@ import dev.brighten.ac.packet.wrapper.PacketType; import dev.brighten.ac.packet.wrapper.WPacket; import lombok.Builder; import lombok.Getter; +import lombok.Setter; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import java.util.UUID; @Getter +@Setter @Builder public class WPacketPlayOutNamedEntitySpawn extends WPacket { diff --git a/src/main/java/dev/brighten/ac/utils/Materials.java b/src/main/java/dev/brighten/ac/utils/Materials.java index d70dee5..8b19d3a 100644 --- a/src/main/java/dev/brighten/ac/utils/Materials.java +++ b/src/main/java/dev/brighten/ac/utils/Materials.java @@ -19,28 +19,38 @@ public class Materials { static { for (int i = 0; i < MATERIAL_FLAGS.length; i++) { - Material material = Material.values()[i]; + Material mat = Material.values()[i]; //We use the one in BlockUtils also since we can't trust Material to include everything. - if (material.isSolid() || material.name().contains("COMPARATOR") || material.name().contains("DIODE")) { + if (mat.isSolid() || mat.name().contains("COMPARATOR") || mat.name().contains("DIODE")) { MATERIAL_FLAGS[i] |= SOLID; } - if (material.name().endsWith("_STAIRS")) { + if (mat.name().endsWith("_STAIRS")) { MATERIAL_FLAGS[i] |= STAIRS; } - if (material.name().contains("SLAB") || material.name().contains("STEP")) { + if (mat.name().contains("SLAB") || mat.name().contains("STEP")) { MATERIAL_FLAGS[i] |= SLABS; } - if(material.name().contains("SKULL")) + if(mat.name().contains("SKULL")) MATERIAL_FLAGS[i] = SOLID; - if(material.name().contains("STATIONARY") || material.name().contains("LAVA") || material.name().contains("WATER")) { - if(material.name().contains("LAVA")) { + if(mat.name().contains("STATIONARY") || mat.name().contains("LAVA") || mat.name().contains("WATER")) { + if(mat.name().contains("LAVA")) { MATERIAL_FLAGS[i] |= LIQUID | LAVA; } else MATERIAL_FLAGS[i] |= LIQUID | WATER; } + + if (mat.name().contains("FENCE")) { + if(!mat.name().contains("GATE")) MATERIAL_FLAGS[mat.ordinal()] |= FENCE; + } + if(mat.name().contains("WALL")) MATERIAL_FLAGS[mat.ordinal()] |= WALL; + if(mat.name().contains("PLATE")) MATERIAL_FLAGS[mat.ordinal()] = 0; + if(mat.name().contains("BED") && !mat.name().contains("ROCK")) MATERIAL_FLAGS[mat.ordinal()] |= SLABS; + if(mat.name().contains("ICE")) MATERIAL_FLAGS[mat.ordinal()] |= ICE; + if(mat.name().contains("CARPET")) MATERIAL_FLAGS[mat.ordinal()] = SOLID; + if(mat.name().contains("SIGN")) MATERIAL_FLAGS[mat.ordinal()] = 0; } // fix some types where isSolid() returns the wrong value @@ -60,18 +70,6 @@ public class Materials { // ladders MATERIAL_FLAGS[XMaterial.LADDER.parseMaterial().ordinal()] |= LADDER | SOLID; MATERIAL_FLAGS[XMaterial.VINE.parseMaterial().ordinal()] |= LADDER | SOLID; - for (Material mat : Material.values()) { - if(!mat.isBlock()) continue; - if (mat.name().contains("FENCE")) { - if(!mat.name().contains("GATE")) MATERIAL_FLAGS[mat.ordinal()] |= FENCE; - } - if(mat.name().contains("WALL")) MATERIAL_FLAGS[mat.ordinal()] |= WALL; - if(mat.name().contains("PLATE")) MATERIAL_FLAGS[mat.ordinal()] = 0; - if(mat.name().contains("BED") && !mat.name().contains("ROCK")) MATERIAL_FLAGS[mat.ordinal()] |= SLABS; - if(mat.name().contains("ICE")) MATERIAL_FLAGS[mat.ordinal()] |= ICE; - if(mat.name().contains("CARPET")) MATERIAL_FLAGS[mat.ordinal()] = SOLID; - if(mat.name().contains("SIGN")) MATERIAL_FLAGS[mat.ordinal()] = 0; - } } public static int getBitmask(Material material) {