ASM obfuscation et class NetHandlerLoginServer



  • Bonjour,

    De retour avec un nouveau problème obscure ;..;

    Contexte:

    • Toujours un coremod avec de l'ASM
    • Minecraft version: 1.7.10
    • Forge build: 1.7.10-10.13.4.1614-1.7.10
    • Java: 1.8.0_66
    • Le mod est server side only

    Je suis confronté à un autre problème qui m’échappe, je ne sais pas trop comment l'expliquer, j'ai donc fait un code minimaliste qui illustre le problème.
    Je précise que bien évidement ce code est inutile, mais c'est sur cette partie la que je bloque, bien sure dans le code réel la fonction ne fait pas juste ceci:

    Donc voici la method "tranform" dans ma ClassTransformer:

    @Override
    public byte[] transform(String name, String transformedName, byte[] bytes) {
    
        if (bytes == null)
            return (null);
    
        if (transformedName.equals("net.minecraft.server.network.NetHandlerLoginServer")) {
            ClassNode        classNode        = new ClassNode();
            ClassReader        classReader        = new ClassReader(bytes);
            classReader.accept(classNode, 0);
    
            System.out.println("Track 1");
            ClassWriter        classWriter        = new ClassWriter(classReader, ClassWriter.COMPUTE_FRAMES);
            System.out.println("Track 2");
            classNode.accept(classWriter);
            System.out.println("Track 3");
            classWriter.toByteArray();
            System.out.println("Track 4");
        }
    
        return (bytes);
    }
    

    Donc en théorie, je visite le bytcode de la class "net.minecraft.server.network.NetHandlerLoginServer", je ne le modifie pas, et je return les bytescodes d'orrigine.
    En environnement de dev, cela fonctionne bien sure, mais on version de production la fonction stop son exécution au niveaux de la method accept de mon classWriter:

    En gros dans la console j'ai juste ceci:

    [15:02:42] [Netty IO #2/INFO] [STDOUT]: [fr.littlebigcraft.asm.MasterClassTransformer:transform:67]: Track 1
    [15:02:42] [Netty IO #2/INFO] [STDOUT]: [fr.littlebigcraft.asm.MasterClassTransformer:transform:69]: Track 2
    
    

    Une idée ? 😄

    Édit: Je précise que ce problème surviens uniquement avec la class "net.minecraft.server.network.NetHandlerLoginServer". J'utilise ce code un bon nombre de fois sur d'autres class sans aucun soucis.

    Edit2: J'ai un peu plus d'informations:

    [20:04:18] [Netty IO #2/INFO] [STDOUT]: [fr.littlebigcraft.asm.MasterClassTransformer:transform:68]: Track 1
    [20:04:18] [Netty IO #2/INFO] [STDOUT]: [fr.littlebigcraft.asm.MasterClassTransformer:transform:70]: Track 2
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: java.lang.RuntimeException: java.lang.ClassNotFoundException: fq
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at org.objectweb.asm.ClassWriter.getCommonSuperClass(Unknown Source)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at org.objectweb.asm.ClassWriter.a(Unknown Source)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at org.objectweb.asm.Frame.a(Unknown Source)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at org.objectweb.asm.Frame.a(Unknown Source)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at org.objectweb.asm.MethodWriter.visitMaxs(Unknown Source)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at org.objectweb.asm.tree.MethodNode.accept(Unknown Source)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at org.objectweb.asm.tree.MethodNode.accept(Unknown Source)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at org.objectweb.asm.tree.ClassNode.accept(Unknown Source)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at fr.littlebigcraft.asm.MasterClassTransformer.transform(MasterClassTransformer.java:71)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:279)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:176)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at java.lang.ClassLoader.loadClass(Unknown Source)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at java.lang.ClassLoader.loadClass(Unknown Source)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.server.network.NetHandlerHandshakeTCP.func_147383_a(NetHandlerHandshakeTCP.java:56)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.network.handshake.client.C00Handshake.func_148833_a(SourceFile:48)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.network.handshake.client.C00Handshake.func_148833_a(SourceFile:9)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.network.NetworkManager.channelRead0(NetworkManager.java:113)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.network.NetworkManager.channelRead0(NetworkManager.java:317)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:98)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:173)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:173)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.network.PingResponseHandler.channelRead(SourceFile:94)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.handler.timeout.ReadTimeoutHandler.channelRead(ReadTimeoutHandler.java:149)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:100)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:480)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:447)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:341)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101)
    [20:04:18] [Netty IO #2/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at java.lang.Thread.run(Unknown Source)
    

    En sachant que la class "fq" correspond à ***** ***** ***** ChatComponentText -_-



  • Après de longues recherches j'ai résolu le problème;
    Pour ceux qui rencontrerai le même genre de problème, je me suis inspiré de ce qui est dit sur le lien suivant pour le régler:

    J'ai donc sur-définit la class ClassWriter, et surtout la méthode "getCommonSuperClass" et j'ai remplacé les Class.forName() par la méthode "findClass" de la class "LaunchClassLoader" de minecraft.

    https://github.com/MinecraftForge/FML/issues/655