ASM трансформер для лимита максимального размера пакета C17PacketCustomPayload

Версия Minecraft
1.7.10
API
Forge
235
3
21
вот так выглядит майновский класс с пакетом, который юзается форжем, мне нужно снять ограничение на размер пакета в 32кб

C17PacketCustomPayload:
public class C17PacketCustomPayload extends Packet
{
    private String field_149562_a;
    private int field_149560_b;
    private byte[] field_149561_c;
    private static final String __OBFID = "CL_00001356";

    public C17PacketCustomPayload() {}

    @SideOnly(Side.CLIENT)
    public C17PacketCustomPayload(String p_i45248_1_, ByteBuf p_i45248_2_)
    {
        this(p_i45248_1_, p_i45248_2_.array());
    }

    @SideOnly(Side.CLIENT)
    public C17PacketCustomPayload(String p_i45249_1_, byte[] p_i45249_2_)
    {
        this.field_149562_a = p_i45249_1_;
        this.field_149561_c = p_i45249_2_;

        if (p_i45249_2_ != null)
        {
            this.field_149560_b = p_i45249_2_.length;

            if (this.field_149560_b >= 32767)
            {
                throw new IllegalArgumentException("Payload may not be larger than 32k");
            }
        }
    }

    /**
     * Reads the raw packet data from the data stream.
     */
    public void readPacketData(PacketBuffer p_148837_1_) throws IOException
    {
        this.field_149562_a = p_148837_1_.readStringFromBuffer(20);
        this.field_149560_b = p_148837_1_.readShort();

        if (this.field_149560_b > 0 && this.field_149560_b < 32767)
        {
            this.field_149561_c = new byte[this.field_149560_b];
            p_148837_1_.readBytes(this.field_149561_c);
        }
    }

    /**
     * Writes the raw packet data to the data stream.
     */
    public void writePacketData(PacketBuffer p_148840_1_) throws IOException
    {
        p_148840_1_.writeStringToBuffer(this.field_149562_a);
        p_148840_1_.writeShort((short)this.field_149560_b);

        if (this.field_149561_c != null)
        {
            p_148840_1_.writeBytes(this.field_149561_c);
        }
    }

    /**
     * Passes this Packet on to the NetHandler for processing.
     */
    public void processPacket(INetHandlerPlayServer p_148833_1_)
    {
        p_148833_1_.processVanilla250Packet(this);
    }

    public String func_149559_c()
    {
        return this.field_149562_a;
    }

    public byte[] func_149558_e()
    {
        return this.field_149561_c;
    }

    /**
     * Passes this Packet on to the NetHandler for processing.
     */
    public void processPacket(INetHandler p_148833_1_)
    {
        this.processPacket((INetHandlerPlayServer)p_148833_1_);
    }
}

я вытужил из себя (ненавижу гребаный asm) вот такой трансформер

мой трансформер:
public class ClassTransformer implements IClassTransformer
{
    @Override
    public byte[] transform(String name, String transformedName, byte[] basicClass)
    {
        if(transformedName.equals("net.minecraft.network.play.client.C17PacketCustomPayload")) {
            return transformC17PacketCustomPayload(basicClass);
        }

        return basicClass;
    }

    private byte[] transformC17PacketCustomPayload(byte[] basicClass)
    {
        ClassReader cr = new ClassReader(basicClass);
        ClassWriter cw = new ClassWriter(cr, 0);

        cr.accept(new ClassVisitor(Opcodes.ASM5, cw)
        {
            @Override
            public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions)
            {
                MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
                if(name.equals("<init>") && desc.equals("(Ljava/lang/String;[B)V"))
                {
                    System.out.println("mark1");
                    return new MethodVisitor(Opcodes.ASM5, mv)
                    {
                        @Override
                        public void visitIntInsn(int opcode, int operand)
                        {
                            System.out.println(opcode + " | " + operand);
                            if(opcode == Opcodes.SIPUSH && operand == 32767) {
                                System.out.println("mark2");
                                operand = 2097151;
                            }
                            super.visitIntInsn(opcode, operand);
                        }
                    };
                }
                return mv;
            }
        }, 0);

        return cw.toByteArray();
    }
}

отладка работает мне в консоль выводится

Java:
[00:25:02] [Netty Client IO #0/INFO] [STDOUT]: [ru.pa4ok.anticheat.common.asm.ClassTransformer$1:visitMethod:31]: mark1
[00:25:02] [Netty Client IO #0/INFO] [STDOUT]: [ru.pa4ok.anticheat.common.asm.ClassTransformer$1$1:visitIntInsn:37]: 17 | 32767
[00:25:02] [Netty Client IO #0/INFO] [STDOUT]: [ru.pa4ok.anticheat.common.asm.ClassTransformer$1$1:visitIntInsn:39]: mark2

после чего при попытке захода на сервер я получаю эксцепшен и уведомление на экране о макс. размере пакета 32кб

Java:
00:25:05] [Netty Client IO #1/ERROR] [FML]: NetworkDispatcher exception
java.lang.IllegalArgumentException: Payload may not be larger than 32k
    at net.minecraft.network.play.client.C17PacketCustomPayload.<init>(SourceFile:38) ~[iz.class:?]
    at cpw.mods.fml.common.network.internal.FMLProxyPacket.toC17Packet(FMLProxyPacket.java:120) ~[FMLProxyPacket.class:?]
    at cpw.mods.fml.common.network.handshake.NetworkDispatcher.write(NetworkDispatcher.java:434) ~[NetworkDispatcher.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.invokeWrite(DefaultChannelHandlerContext.java:644) ~[DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.write(DefaultChannelHandlerContext.java:698) ~[DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.writeAndFlush(DefaultChannelHandlerContext.java:688) ~[DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.writeAndFlush(DefaultChannelHandlerContext.java:717) ~[DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:893) ~[DefaultChannelPipeline.class:?]
    at io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:239) ~[AbstractChannel.class:?]
    at net.minecraft.network.NetworkManager.func_150732_b(NetworkManager.java:160) [ej.class:?]
    at net.minecraft.network.NetworkManager.func_150725_a(NetworkManager.java:134) [ej.class:?]
    at cpw.mods.fml.common.network.handshake.NetworkDispatcher.sendProxy(NetworkDispatcher.java:365) [NetworkDispatcher.class:?]
    at cpw.mods.fml.common.network.handshake.HandshakeInjector.write(HandshakeInjector.java:20) [HandshakeInjector.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.invokeWrite(DefaultChannelHandlerContext.java:644) [DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.write(DefaultChannelHandlerContext.java:698) [DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.write(DefaultChannelHandlerContext.java:637) [DefaultChannelHandlerContext.class:?]
    at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:102) [MessageToMessageEncoder.class:?]
    at io.netty.handler.codec.MessageToMessageCodec.write(MessageToMessageCodec.java:116) [MessageToMessageCodec.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.invokeWrite(DefaultChannelHandlerContext.java:644) [DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.write(DefaultChannelHandlerContext.java:698) [DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.writeAndFlush(DefaultChannelHandlerContext.java:688) [DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.writeAndFlush(DefaultChannelHandlerContext.java:717) [DefaultChannelHandlerContext.class:?]
    at cpw.mods.fml.common.network.handshake.FMLHandshakeClientState$2.accept(FMLHandshakeClientState.java:45) [FMLHandshakeClientState$2.class:?]
    at cpw.mods.fml.common.network.handshake.FMLHandshakeClientState$2.accept(FMLHandshakeClientState.java:39) [FMLHandshakeClientState$2.class:?]
    at cpw.mods.fml.common.network.handshake.HandshakeMessageHandler.channelRead0(HandshakeMessageHandler.java:27) [HandshakeMessageHandler.class:?]
    at cpw.mods.fml.common.network.handshake.HandshakeMessageHandler.channelRead0(HandshakeMessageHandler.java:9) [HandshakeMessageHandler.class:?]
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:98) [SimpleChannelInboundHandler.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?]
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) [MessageToMessageDecoder.class:?]
    at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) [MessageToMessageCodec.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?]
    at cpw.mods.fml.common.network.handshake.ChannelRegistrationHandler.channelRead0(ChannelRegistrationHandler.java:32) [ChannelRegistrationHandler.class:?]
    at cpw.mods.fml.common.network.handshake.ChannelRegistrationHandler.channelRead0(ChannelRegistrationHandler.java:15) [ChannelRegistrationHandler.class:?]
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:98) [SimpleChannelInboundHandler.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) [DefaultChannelPipeline.class:?]
    at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) [EmbeddedChannel.class:?]
    at cpw.mods.fml.common.network.handshake.NetworkDispatcher.handleClientSideCustomPacket(NetworkDispatcher.java:274) [NetworkDispatcher.class:?]
    at cpw.mods.fml.common.network.handshake.NetworkDispatcher.channelRead0(NetworkDispatcher.java:202) [NetworkDispatcher.class:?]
    at cpw.mods.fml.common.network.handshake.NetworkDispatcher.channelRead0(NetworkDispatcher.java:47) [NetworkDispatcher.class:?]
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:98) [SimpleChannelInboundHandler.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?]
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:173) [ByteToMessageDecoder.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?]
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:173) [ByteToMessageDecoder.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?]
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) [MessageToMessageDecoder.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?]
    at io.netty.handler.timeout.ReadTimeoutHandler.channelRead(ReadTimeoutHandler.java:149) [ReadTimeoutHandler.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) [DefaultChannelPipeline.class:?]
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:100) [AbstractNioByteChannel$NioByteUnsafe.class:?]
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:480) [NioEventLoop.class:?]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:447) [NioEventLoop.class:?]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:341) [NioEventLoop.class:?]
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101) [SingleThreadEventExecutor$2.class:?]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_202]

что делать дальше я хз
 

Вложения

  • 1612819976768.png
    1612819976768.png
    96.1 KB · Просмотры: 7
1,057
50
234
Ну так может ты превышаешь новый лимит в 2097151?
И надо еще в readPacketData менять.
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Я делал хуками:
Java:
@Hook(returnCondition = ReturnCondition.ALWAYS)
    public static void readPacketData(C17PacketCustomPayload packet, PacketBuffer packetBuffer){
        try{
            ReflectionHelper.setPrivateValue(C17PacketCustomPayload.class, packet, packetBuffer.readStringFromBuffer(20), 0);

            int size = packetBuffer.readInt();
            ReflectionHelper.setPrivateValue(C17PacketCustomPayload.class, packet, size, 1);

            if(size > 0 && size < 0x1FFF9A){
                byte[] bytes = new byte[size];
                packetBuffer.readBytes(bytes);
                ReflectionHelper.setPrivateValue(C17PacketCustomPayload.class, packet, bytes, 2);
            }
        }catch(IOException e){
            e.printStackTrace();
        }
    }

    @Hook(returnCondition = ReturnCondition.ALWAYS)
    public static void writePacketData(C17PacketCustomPayload packet, PacketBuffer packetBuffer){
        try{
            String channel = ReflectionHelper.getPrivateValue(C17PacketCustomPayload.class, packet, 0);
            int size = ReflectionHelper.getPrivateValue(C17PacketCustomPayload.class, packet, 1);
            byte[] bytes = ReflectionHelper.getPrivateValue(C17PacketCustomPayload.class, packet, 2);

            packetBuffer.writeStringToBuffer(channel);
            packetBuffer.writeInt(size);

            if(bytes != null){
                packetBuffer.writeBytes(bytes);
            }
        }catch(IOException e){
            e.printStackTrace();
        }
    }

    @Hook(returnCondition = ReturnCondition.ALWAYS, targetMethod = "<init>")
    @SideOnly(Side.CLIENT)
    public static void C17PacketCustomPayload(C17PacketCustomPayload packet, String channel, byte[] bytes){
        ReflectionHelper.setPrivateValue(C17PacketCustomPayload.class, packet, channel, 0);
        ReflectionHelper.setPrivateValue(C17PacketCustomPayload.class, packet, bytes, 2);

        if(bytes != null){
            ReflectionHelper.setPrivateValue(C17PacketCustomPayload.class, packet, bytes.length, 1);

            if(bytes.length > 0x1FFF9A){
                throw new IllegalArgumentException("Payload may not be larger than 2097050 bytes");
            }
        }
    }
Вместо рефлексии лучше снять приваты AT'шкой, просто по своим причинам не мог использовать.
 
Сверху