C# Connection Bot MITM D2

Inscrit
2 Juin 2018
Messages
32
Reactions
0
#1
Bonjour,

Je suis entrain de réaliser un petit bot Mitm afin de comprendre la logique auth de Dofus notamment, mais je bloque dès les premiers messages :'( ...

Je n'arrive pas à comprendre, pourquoi j'ai le droit à cette erreur de la part du client Dofus :

1556888722847.png 1556888722847.png

Je ne fait que Forward le ProtocolRequiredMessage et le HelloConnectMessage recu par le serveur auth au client ?

Cmd :
1556888869159.png

(Le message recu par le client d'id 182 est un problème dont je ne trouve pas la source ..., est-il normal que le serveur me relance du coup le ProtocolRequiredMessage ?)

En pensant que ces erreurs peuvent venir de la manière dont je parse les données, voici le code :

PacketParser:
    /// <summary>
    /// <see cref="PacketParser"/> parses a packet when local server receiving data.
    /// </summary>
    public static class PacketParser
    {

        public static IPacket ParsePacket(byte[] message, int packetOriginEnum)
        {
            IHeader header;
            byte[] payload;
            DofusReader reader = default;

            try
            {
                reader = new DofusReader(new MemoryStream(message));
                header = ParseHeader(ref reader, packetOriginEnum);
                payload = reader.ReadBytes(header.PacketLength);

                return new Packet(payload, header);
            }
            finally
            {
                reader.Dispose();
            }
        }

        private static IHeader ParseHeader(ref DofusReader reader, int packetOriginEnum)
        {
            short header;
            int packetId;
            uint instanceId;
            LengthTypeEnum lengthType;
            byte[] dataLengthRead;
            int packetLength;

                header = reader.ReadInt16();

                packetId = header >> BinaryConstants.BIT_RIGHT_SHIFT_LEN_PACKET_ID;
                instanceId = (packetOriginEnum == 0) ? reader.ReadUInt32() : default;

                lengthType = (LengthTypeEnum)(header & BinaryConstants.BIT_MASK);
                dataLengthRead = reader.ReadBytes((int)lengthType);
                packetLength = ParseDataLength(dataLengthRead, lengthType);

                return new Header(packetId, lengthType, packetLength)
                { InstanceId = instanceId };

        }

        private static int ParseDataLength(byte[] dataLengthReader, LengthTypeEnum lengthType)
        {
            int len = 0;

            for (int i = (int)lengthType - 1, j = 0; i >= 0; i--, j++)
                len |= dataLengthReader[j] << (i * 8);

            return len;
        }
ForwardMessage:
 public void ForwardMessage(byte[] buffer,PacketDestinationEnum dst, IHeader header)
        {

            string origin = dst == PacketDestinationEnum.Client ? "SERVER" : "CLIENT";

            if (dst == PacketDestinationEnum.Client)
                base.ClientPipe.Output.Write(buffer);
            else
                base.ServerPipe.Output.Write(buffer);

            Console.WriteLine($"[{header.ToString()}] forward from {origin}");
        }
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#2
Il y a surement un décalage dans ta lecture et/ou réécriture du paquet.
Essaye d'envoyer le paquet manuellement et si cela fonctionne, ça vient de ta lecture ;)
 
Inscrit
2 Juin 2018
Messages
32
Reactions
0
#3
Il y a surement un décalage dans ta lecture et/ou réécriture du paquet.
Essaye d'envoyer le paquet manuellement et si cela fonctionne, ça vient de ta lecture ;)
Merci de ta réponse BlueDream,

ca me paraît louche, lorsque j'envoie le protocolRequiredMessage avec CurrentVersion =1891 et RequiredVersion = 1924 (identique au sniffer d'Alexandre), j'ai toujours la même erreur, pourtant je l'ai bien sérialisé d'après le Dofus Invoker . C'est peut-être dû aussi au décalage ? (et/ou l'HelloConnectMessage foireux .) Toujours est-il que je n'arrive pas à comprendre comment le décalage se crée, c'est peut-être parce que je ne vérifie pas lorsque je parse les données s'il y a un assez de données pour etre lu ? Ou bien c'est tout simplement dû au nouveau système ajouté récemment avec l'instance Id, mais il me semble que je l'ai correctement implémenté ....
 
Dernière édition:
Inscrit
22 Juillet 2018
Messages
81
Reactions
12
#4
Hello,

Si nous avions plus de code, on pourrait peut-etre t'aider...
 
Haut Bas