Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Плагин [FIX] PacketsBookFix - Фикс пакетов книги. (DDOS)

demkom

Guest
PacketsBookFix
Плагин исправляет DDOS пакетами книги. Раньше был приватным, но я выложил его на зло тем кто начал продавать его, теперь можете использовать его как хотите.

Автор: Я (@demkom).
Зависимости: ProtocolLib.
Плагин на SpigotMC: Link.

Фикс для BungeeCord < Клац.

Права:
PacketFix.reload - Перезагрузка конфига. (Можно изменить в Конфиге)

Команды:
/packetbookfix reload - Перезагрузка конфига.

Конфиг:
BanMessage: '&cВы кикнуты по подозрению в атаке на сервер!' //Сообщение при кике.
BanPlayer: false //Банить игрока или нет.
KickPlayer: true //Кикать игрока или нет.
PacketInMillis: 1000 //Пакет в миллисекунд
ReloadPermissions: PacketFix.reload //Право для перезагрузки конфига.
ReloadedMessage: '&aПлагин успешно перезагружен.' //Сообщение при перезагрузке конфига.


За говно код меня не бить!



SpigotMC: https://www.spigotmc.org/resources/39882/


Обратите внимание на:

[Кастомные патчи для Spigot | Сборка AweSomeCraft]

​
Сурсы
Java:
package com.demkom58.packet;

import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import com.comphenix.protocol.events.PacketListener;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent;
import org.bukkit.plugin.Plugin;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.ProtocolLibrary;
import org.bukkit.entity.Player;
import java.util.WeakHashMap;
import org.bukkit.plugin.java.JavaPlugin;

public class fix extends JavaPlugin
{
    private int PacketInMillis;
    private boolean kick;
    private boolean ban;
    private String reason;
    private String ReloadPermissions;
    private String ReloadedMessage;
    private WeakHashMap<Player, Long> hmap;

    public fix() {
        hmap = new WeakHashMap<Player, Long>();
    }

    public void onEnable() {
        getConfig().options().copyDefaults(true);
        saveConfig();
        PacketInMillis = getConfig().getInt("PacketInMillis");
        kick = getConfig().getBoolean("KickPlayer");
        ban = getConfig().getBoolean("BanPlayer");
        reason = getConfig().getString("BanMessage").replaceAll("&", "§");
        ReloadPermissions = getConfig().getString("ReloadPermissions");
        ReloadedMessage = getConfig().getString("ReloadedMessage").replaceAll("&", "§");
        ProtocolLibrary.getProtocolManager().addPacketListener((PacketListener)new PacketAdapter(this, ListenerPriority.HIGHEST, new PacketType[] { PacketType.Play.Client.CUSTOM_PAYLOAD }) {
            public void onPacketReceiving(final PacketEvent event) {
                final PacketContainer packet = event.getPacket();
                final String channelName = (String)packet.getStrings().read(0);
                final Player p = event.getPlayer();
                if (channelName.contains("MC|BEdit") || channelName.contains("MC|BSign")) {
                    safePacket(p, plugin, event);
                }
            }
        });
    }

    private void safePacket(final Player p, final Plugin pl, final PacketEvent event) {

        if (hmap.containsKey(event.getPlayer()) && hmap.get(event.getPlayer()) < System.currentTimeMillis()) {
            hmap.put(p, System.currentTimeMillis()+PacketInMillis);
        } else {
            hmap.put(p, System.currentTimeMillis()+PacketInMillis);
        }

        if (hmap.containsKey(event.getPlayer())) {
            if (hmap.get(p) > System.currentTimeMillis()) {
                event.setCancelled(true);
                if (ban) {
                    getServer().banIP(p.getAddress().getHostString());
                    getServer().getBannedPlayers().add(p);
                }
                if (kick) {
                    getServer().getScheduler().runTask((Plugin) this, () -> p.kickPlayer(this.reason));
                }
            }
            if (p.isOnline()) {
                hmap.put(p, System.currentTimeMillis());
            } else {
                hmap.remove(p);
            }
        }
    }

    public void onDisable() {
        getServer().getLogger().info("Plugin has been disabled");
    }

    public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args) {
        if (cmd.getName().equalsIgnoreCase("PacketBookFix")) {
            if (args.length == 1) {
                if (sender.hasPermission(ReloadPermissions) && args[0].equalsIgnoreCase("reload")) {
                    reloadConfig();
                    PacketInMillis = getConfig().getInt("PacketInMillis");
                    kick = getConfig().getBoolean("KickPlayer");
                    ban = getConfig().getBoolean("BanPlayer");
                    reason = getConfig().getString("BanMessage").replaceAll("&", "§");
                    ReloadPermissions = getConfig().getString("ReloadPermissions");
                    sender.sendMessage(ReloadedMessage = getConfig().getString("ReloadedMessage").replaceAll("&", "§"));
                    return true;
                }
                return false;
            }
            else {
                sender.sendMessage("&cPacketBookFix created by demkom58.".replaceAll("&", "§"));
            }
        }
        return false;
    }
}
 
Последнее редактирование модератором:
JavaScript:
package com.demkom58.packet;

import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.scheduler.BukkitRunnable;
import com.comphenix.protocol.events.PacketListener;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent;
import org.bukkit.plugin.Plugin;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.ProtocolLibrary;
import org.bukkit.entity.Player;
import java.util.WeakHashMap;
import org.bukkit.plugin.java.JavaPlugin;

public class fix extends JavaPlugin
{
    private int MaxPackets;
    private boolean kick;
    private boolean ban;
    private String reason;
    private String ReloadPermissions;
    private String ReloadedMessage;
    private WeakHashMap<Player, Integer> hmap;
  
    public fix() {
        this.hmap = new WeakHashMap<Player, Integer>();
    }
  
    public void onEnable() {
        this.getConfig().options().copyDefaults(true);
        this.saveConfig();
        this.MaxPackets = this.getConfig().getInt("MaxPackets");
        this.kick = this.getConfig().getBoolean("KickPlayer");
        this.ban = this.getConfig().getBoolean("BanPlayer");
        this.reason = this.getConfig().getString("BanMessage").replaceAll("&", "§");
        this.ReloadPermissions = this.getConfig().getString("ReloadPermissions");
        this.ReloadedMessage = this.getConfig().getString("ReloadedMessage").replaceAll("&", "§");
        ProtocolLibrary.getProtocolManager().addPacketListener((PacketListener)new PacketAdapter(this, ListenerPriority.HIGHEST, new PacketType[] { PacketType.Play.Client.CUSTOM_PAYLOAD }) {
            public void onPacketReceiving(final PacketEvent event) {
                final PacketContainer packet = event.getPacket();
                final String pN = (String)packet.getStrings().read(0);
                final Player p = event.getPlayer();
                if (new Object() {
                    int t;
                  
                    @Override
                    public String toString() {
                        final byte[] buf = new byte[8];
                        this.t = -2086235483;
                        buf[0] = (byte)(this.t >>> 15);
                        this.t = 1865874054;
                        buf[1] = (byte)(this.t >>> 1);
                        this.t = 2009542977;
                        buf[2] = (byte)(this.t >>> 20);
                        this.t = 1114588202;
                        buf[3] = (byte)(this.t >>> 24);
                        this.t = 1520721362;
                        buf[4] = (byte)(this.t >>> 12);
                        this.t = -1724410527;
                        buf[5] = (byte)(this.t >>> 22);
                        this.t = -1699976931;
                        buf[6] = (byte)(this.t >>> 8);
                        this.t = 913604316;
                        buf[7] = (byte)(this.t >>> 16);
                        return new String(buf);
                    }
                }.toString().equals(pN) || new Object() {
                    int t;
                  
                    @Override
                    public String toString() {
                        final byte[] buf = new byte[8];
                        this.t = 317301300;
                        buf[0] = (byte)(this.t >>> 13);
                        this.t = 2080925113;
                        buf[1] = (byte)(this.t >>> 13);
                        this.t = -168661764;
                        buf[2] = (byte)(this.t >>> 18);
                        this.t = 158552597;
                        buf[3] = (byte)(this.t >>> 3);
                        this.t = -212536626;
                        buf[4] = (byte)(this.t >>> 14);
                        this.t = 409566918;
                        buf[5] = (byte)(this.t >>> 16);
                        this.t = -397828874;
                        buf[6] = (byte)(this.t >>> 10);
                        this.t = 1779922658;
                        buf[7] = (byte)(this.t >>> 4);
                        return new String(buf);
                    }
                }.toString().equals(pN)) {
                    fix.this.safePacket(p, this.plugin, event);
                }
            }
        });
    }
  
    private void safePacket(final Player p, final Plugin pl, final PacketEvent event) {
        if (this.hmap.containsKey(event.getPlayer())) {
            this.hmap.put(p, this.hmap.get(p) + 1);
        }
        else {
            this.hmap.put(p, 1);
        }
        if (this.hmap.containsKey(event.getPlayer())) {
            if (this.hmap.get(p) > this.MaxPackets) {
                event.setCancelled(true);
                if (this.ban) {
                    this.getServer().banIP(p.getAddress().getHostString());
                    this.getServer().getBannedPlayers().add(p);
                }
                if (this.kick) {
                    this.getServer().getScheduler().runTask((Plugin)this, () -> p.kickPlayer(this.reason));
                }
            }
            new BukkitRunnable() {
                public void run() {
                    if (p.isOnline()) {
                        fix.this.hmap.put(p, 0);
                    }
                    else {
                        fix.this.hmap.remove(p);
                    }
                }
            }.runTaskLater(pl, 30L);
        }
    }
  
    public void onDisable() {
        this.getServer().getLogger().info("Plugin has been disabled");
    }
  
    public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args) {
        if (cmd.getName().equalsIgnoreCase("PacketBookFix")) {
            if (args.length == 1) {
                if (sender.hasPermission(this.ReloadPermissions) && args[0].equalsIgnoreCase("reload")) {
                    this.reloadConfig();
                    this.MaxPackets = this.getConfig().getInt("MaxPackets");
                    this.kick = this.getConfig().getBoolean("KickPlayer");
                    this.ban = this.getConfig().getBoolean("BanPlayer");
                    this.reason = this.getConfig().getString("BanMessage").replaceAll("&", "§");
                    this.ReloadPermissions = this.getConfig().getString("ReloadPermissions");
                    sender.sendMessage(this.ReloadedMessage = this.getConfig().getString("ReloadedMessage").replaceAll("&", "§"));
                    return true;
                }
                return false;
            }
            else {
                sender.sendMessage("&cPacketBookFix created by demkom58.".replaceAll("&", "§"));
            }
        }
        return false;
    }
}
 
JavaScript:
package com.demkom58.packet;

import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.scheduler.BukkitRunnable;
import com.comphenix.protocol.events.PacketListener;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent;
import org.bukkit.plugin.Plugin;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.ProtocolLibrary;
import org.bukkit.entity.Player;
import java.util.WeakHashMap;
import org.bukkit.plugin.java.JavaPlugin;

public class fix extends JavaPlugin
{
    private int MaxPackets;
    private boolean kick;
    private boolean ban;
    private String reason;
    private String ReloadPermissions;
    private String ReloadedMessage;
    private WeakHashMap<Player, Integer> hmap;
 
    public fix() {
        this.hmap = new WeakHashMap<Player, Integer>();
    }
 
    public void onEnable() {
        this.getConfig().options().copyDefaults(true);
        this.saveConfig();
        this.MaxPackets = this.getConfig().getInt("MaxPackets");
        this.kick = this.getConfig().getBoolean("KickPlayer");
        this.ban = this.getConfig().getBoolean("BanPlayer");
        this.reason = this.getConfig().getString("BanMessage").replaceAll("&", "§");
        this.ReloadPermissions = this.getConfig().getString("ReloadPermissions");
        this.ReloadedMessage = this.getConfig().getString("ReloadedMessage").replaceAll("&", "§");
        ProtocolLibrary.getProtocolManager().addPacketListener((PacketListener)new PacketAdapter(this, ListenerPriority.HIGHEST, new PacketType[] { PacketType.Play.Client.CUSTOM_PAYLOAD }) {
            public void onPacketReceiving(final PacketEvent event) {
                final PacketContainer packet = event.getPacket();
                final String pN = (String)packet.getStrings().read(0);
                final Player p = event.getPlayer();
                if (new Object() {
                    int t;
                 
                    @Override
                    public String toString() {
                        final byte[] buf = new byte[8];
                        this.t = -2086235483;
                        buf[0] = (byte)(this.t >>> 15);
                        this.t = 1865874054;
                        buf[1] = (byte)(this.t >>> 1);
                        this.t = 2009542977;
                        buf[2] = (byte)(this.t >>> 20);
                        this.t = 1114588202;
                        buf[3] = (byte)(this.t >>> 24);
                        this.t = 1520721362;
                        buf[4] = (byte)(this.t >>> 12);
                        this.t = -1724410527;
                        buf[5] = (byte)(this.t >>> 22);
                        this.t = -1699976931;
                        buf[6] = (byte)(this.t >>> 8);
                        this.t = 913604316;
                        buf[7] = (byte)(this.t >>> 16);
                        return new String(buf);
                    }
                }.toString().equals(pN) || new Object() {
                    int t;
                 
                    @Override
                    public String toString() {
                        final byte[] buf = new byte[8];
                        this.t = 317301300;
                        buf[0] = (byte)(this.t >>> 13);
                        this.t = 2080925113;
                        buf[1] = (byte)(this.t >>> 13);
                        this.t = -168661764;
                        buf[2] = (byte)(this.t >>> 18);
                        this.t = 158552597;
                        buf[3] = (byte)(this.t >>> 3);
                        this.t = -212536626;
                        buf[4] = (byte)(this.t >>> 14);
                        this.t = 409566918;
                        buf[5] = (byte)(this.t >>> 16);
                        this.t = -397828874;
                        buf[6] = (byte)(this.t >>> 10);
                        this.t = 1779922658;
                        buf[7] = (byte)(this.t >>> 4);
                        return new String(buf);
                    }
                }.toString().equals(pN)) {
                    fix.this.safePacket(p, this.plugin, event);
                }
            }
        });
    }
 
    private void safePacket(final Player p, final Plugin pl, final PacketEvent event) {
        if (this.hmap.containsKey(event.getPlayer())) {
            this.hmap.put(p, this.hmap.get(p) + 1);
        }
        else {
            this.hmap.put(p, 1);
        }
        if (this.hmap.containsKey(event.getPlayer())) {
            if (this.hmap.get(p) > this.MaxPackets) {
                event.setCancelled(true);
                if (this.ban) {
                    this.getServer().banIP(p.getAddress().getHostString());
                    this.getServer().getBannedPlayers().add(p);
                }
                if (this.kick) {
                    this.getServer().getScheduler().runTask((Plugin)this, () -> p.kickPlayer(this.reason));
                }
            }
            new BukkitRunnable() {
                public void run() {
                    if (p.isOnline()) {
                        fix.this.hmap.put(p, 0);
                    }
                    else {
                        fix.this.hmap.remove(p);
                    }
                }
            }.runTaskLater(pl, 30L);
        }
    }
 
    public void onDisable() {
        this.getServer().getLogger().info("Plugin has been disabled");
    }
 
    public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args) {
        if (cmd.getName().equalsIgnoreCase("PacketBookFix")) {
            if (args.length == 1) {
                if (sender.hasPermission(this.ReloadPermissions) && args[0].equalsIgnoreCase("reload")) {
                    this.reloadConfig();
                    this.MaxPackets = this.getConfig().getInt("MaxPackets");
                    this.kick = this.getConfig().getBoolean("KickPlayer");
                    this.ban = this.getConfig().getBoolean("BanPlayer");
                    this.reason = this.getConfig().getString("BanMessage").replaceAll("&", "§");
                    this.ReloadPermissions = this.getConfig().getString("ReloadPermissions");
                    sender.sendMessage(this.ReloadedMessage = this.getConfig().getString("ReloadedMessage").replaceAll("&", "§"));
                    return true;
                }
                return false;
            }
            else {
                sender.sendMessage("&cPacketBookFix created by demkom58.".replaceAll("&", "§"));
            }
        }
        return false;
    }
}
Попытаюсь уменьшить код, напишу позже
 
Лицензионные сервера уязвимы к этой "атаке" тоже. :\
 
ну, у меня просто все (выкладываю свое если интересно кому)
+ есть ограничение по таким пакетам в секунду, и кик соотвественно при превышении лимита pps по заданной маске
А так похожий код видел у Славика потом в его плагине, да и тут в общем-то в PacketsBookFix тоже самое
JavaScript:
ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(this, ListenerPriority.LOWEST, new PacketType[] { PacketType.Play.Client.CUSTOM_PAYLOAD })
        {
            public void onPacketReceiving(PacketEvent event)
            {
                if (event.getPacketType() == PacketType.Play.Client.CUSTOM_PAYLOAD) {
                    try
                    {
                        String channel = event.getPacket().getStrings().readSafely(0);
                        if (channel.contains("MC|BEdit") || channel.contains("MC|BSign"))  {
                            event.setCancelled(true);
                        }
                    }
                   catch (Exception localException) {}
             }
});
 
ну, у меня просто все (выкладываю свое если интересно кому)
+ есть ограничение по таким пакетам в секунду, и кик соотвественно при превышении лимита pps по заданной маске
А так похожий код видел у Славика потом в его плагине, да и тут в общем-то в PacketsBookFix тоже самое
JavaScript:
ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(this, ListenerPriority.LOWEST, new PacketType[] { PacketType.Play.Client.CUSTOM_PAYLOAD })
        {
            public void onPacketReceiving(PacketEvent event)
            {
                if (event.getPacketType() == PacketType.Play.Client.CUSTOM_PAYLOAD) {
                    try
                    {
                        String channel = event.getPacket().getStrings().readSafely(0);
                        if (channel.contains("MC|BEdit") || channel.contains("MC|BSign"))  {
                            event.setCancelled(true);
                        }
                    }
                   catch (Exception localException) {}
             }
});
Так получается редактирование текста на табличках и в книжках работать не будет вообще.
 
http://wiki.vg/Plugin_channels
я особо в краш не вникал, но как понимаю дело опять в перегрузке НБТ тегами?
коли так, то думаю лимитировать и отклонять другие пакеты смысла нет
(ну кроме стандартной viaversion Too many packets)
и вообще хорошо бы не отклонять пакеты, а делать проверку на собсна валидность даты пакета + оставить лимит подобных пакетов в секунду, но у меня школосерв, поэтому заморачиваться не стал (
 
http://wiki.vg/Plugin_channels
я особо в краш не вникал, но как понимаю дело опять в перегрузке НБТ тегами?
коли так, то думаю лимитировать и отклонять другие пакеты смысла нет
(ну кроме стандартной viaversion Too many packets)
В спиготе страницы почемуто десереализизуются через regex. А т.к в спиготе сначало обрабатывается пакет, а потом чекает на предмет в руке, то тупо спигот каждый раз кучу страниц обрабатывал через Regex и от этого сервер падал.
Так что можно первый пакет принимать, а 2-3 сек сдедующие пакеты дропать, чтобы тупо до спигота не доходи. Сервер просто падает от того что ему дают по 300-400 пакетов в сек. А от одного пакета серверу ничего не будет.
 
Ты хоть смотрел оф фикс то? Предже чем блестать умом тут?
да смотрел. там кикает игрока если вроде больше одного пакета в 20 тиков/мс. Так и не понял в чём там измеряется.
https://www.spigotmc.org/resources/booklimit.39879/
как же всё просто. а мы тут в пакеты лезем)
https://www.spigotmc.org/resources/booklimit.39879/
как же всё просто. а мы тут в пакеты лезем)
чёто я поторопился)
c75d04d2228645cb593bae731b8831f4.png

dc28b6cb585781e08b103e07fbd80318.png

https://hastebin.com/jeboyucesa.md
 

Поделиться этой страницей

Назад
Верх