C# Sniffer D2 - SharpPcap

Inscrit
14 Mai 2019
Messages
66
Reactions
22
#1
Salut les gars je suis en train de dev un sniffer pour l'offi et j'ai des valeurs négatives au niveau de certains messages (e.g GameMapMovementMessage).
Je n'ai pas d'idée quant à l'origine du probleme readers/writers sont bons et la manière dont je build mon packet est bonne aussi (a priori).
C'est déja arrivé a qqun ce genre de souci ? J'utilsie sharpPcap pour sniffer.


Voici la manière dont je build mes packets :

C#:
 private void SnifferOnOnPacketReceived(Packet packet)
    {
        var ipPacket = (IPPacket) ((EthernetPacket) packet).PayloadPacket;

        Packet payloadPacket = ipPacket.PayloadPacket;

        byte[] data = payloadPacket.PayloadData;

        if (data.Length <= 0 && (data.Length != 1 || data[0] == 0x00)) return;

        bool isClient = Equals(ipPacket.SourceAddress, IPAddress.Parse(_sniffer.DeviceIp));

        _buffer.AddRange(data);

        while (_packetBuilder.TryBuild(_buffer, out DofusPacket dofusPacket, isClient))
        {
            Message msg = MessageReceiver.ComputeMessage(dofusPacket.Metadata.MessageId, dofusPacket.Payload);
            Type downcastType = msg.GetType();
            object downcast = Convert.ChangeType(msg, downcastType);

            SniffedPacket sniffedPacket = new(DateTime.Now.ToString("T"),
                isClient ? "Client" : "Server",
                dofusPacket.Metadata.MessageId,
                downcastType.Name,
                JsonSerializer.Serialize(downcast, _serializerOptions),
                BitConverter.ToString(dofusPacket.Payload));

            Application.Current.Dispatcher.InvokeAsync(() => SniffedPackets.Add(sniffedPacket)); // WPF
        }
    }

C#:
public bool TryBuild(List<byte> buffer, out DofusPacket packet, bool isClient)

    {

        packet = default;



        CollectionReader reader = new(buffer);





        if (reader.Remaining < 2) return false;



        ushort header = reader.ReadUShort();



        if (isClient && reader.Remaining < 4) return false;



        uint instanceId = isClient ? reader.ReadUInt() : 0;



        int messageId = header >> 2;



        int lenType = header & 3;



        if (messageId <= 0 || lenType is < 0 or > 3 || !MessageReceiver.EnsureMessageId(messageId) || reader.Remaining < lenType)

            return false;



        int len = lenType switch

        {

            0 => 0,

            1 => reader.ReadByte(),

            2 => reader.ReadUShort(),

            3 => ((reader.ReadSByte() & 255) << 16) + ((reader.ReadSByte() & 255) << 8) + (reader.ReadSByte() & 255),

            _ => throw new InvalidDataException("Length type must be inside [0;3]")

        };



        if (reader.Remaining < len) return false;



        byte[] payload = reader.ReadBytes(len);



        DofusPacketMetadata metadata = new(messageId, lenType, len, instanceId);



        packet = new DofusPacket(metadata, payload);



        buffer.RemoveRange(0, reader.BytesRead);



        return true;

    }

Egalement qque chose de bizarre c'est une fois que IG je passe du serveur d'authentication au serveur de jeu je n'arrive plus à build mes packets, la methode me retourne toujours false. Lors de la passation Auth-Game je dois vider mon buffer ??
Peut etre que ces problemes sont dûs à la lib pour pour sniffer (sharpPCap qqun a déja utilisé ça ?)

Pour ceux qui connaissent la lib voici comment je capture le trafic réseau :
C#:
 public Task StartCaptureAsync(CancellationToken cancellationToken)
    {
        return Task.Run(() =>
        {
            while (cancellationToken == default || !cancellationToken.IsCancellationRequested)
            {
                GetPacketStatus status = _device.GetNextPacket(out PacketCapture capture);

                if (status != GetPacketStatus.PacketRead) continue;

                RawCapture raw = capture.GetPacket();
                var packet = Packet.ParsePacket(raw.LinkLayerType, raw.Data);

                OnPacketReceived?.Invoke(packet);
            }
        }, cancellationToken);
    }

(exemple valeur négative) :

1647691655693.png

Merci pour votre aide.
 
Dernière édition:
Inscrit
6 Mars 2022
Messages
6
Reactions
3
#2
C'est tout bon, -20XXX ça correspond à l'id contextuelle d'un groupe de monstre
 
Inscrit
14 Mai 2019
Messages
66
Reactions
22
#3
C'est tout bon, -20XXX ça correspond à l'id contextuelle d'un groupe de monstre
Ah ok super du coup je pensais qu'il y avait un probleme à ce niveau là justement à cause du probleme que j'ai lorsque je switch du serveur d'auth au serveur de jeu. Finalement ce probleme est surement dû à mon reader (et/ou mon protocol) :

1647694158067.png

Merci de ton aide :)
 
Dernière édition:
Inscrit
6 Mars 2022
Messages
6
Reactions
3
#4
Je sais qu'il y a ArenaRankInfos qui a une sérialisation / désérialisation différente, sinon je vois pas d'où peut venir le problème de transition

1.png

J'imagine que si tu lis pas bien les packets le buffer se retrouve avec des segments non lus, ça expliquerait pourquoi ça te retourne null pour la suite
 
Inscrit
14 Mai 2019
Messages
66
Reactions
22
#5
C'était bien ça effectivement ty
 
Haut Bas