Python 2.0 Messages sur plusieurs paquets (NetworkDataContainerMessage)

Discussion dans 'Questions / Réponses' créé par gloomy, 24 Février 2018.

  1. gloomy

    gloomy Membre

    Inscrit:
    20 Janvier 2018
    Messages:
    7
    J'aime reçus:
    1
    Hello!

    J'essaye depuis plusieurs jours de parfaire mon analyseur de paquets, mais je sèche avec un paquet nommé "NetworkDataContainerMessage". En effet le header de celui-ci me donne une taille énorme (8Mb+), ce qui n'a pas l'air de correspondre à la réalité, et fait que mon programme lit beaucoup trop de paquets comme si ils appartenaient au "NetworkDataContainerMessage".

    Je suis relativement sur que mon code pour lire le header est correct:

    Code (Python):
    def get_packet_size(data: bytes, send_type: str) -> (int, int, int, int):
        header = bytes([data[0], data[1]])
        id = ((header[0] << 8) | header[1]) >> 2

        sizesize = header[1] & 0b11
        if send_type == "received":
            st = 2
        else:
            st = 6
        size = 0
        if sizesize == 0:
            size = 0
        elif sizesize == 1:
            size = data[st]
        elif sizesize == 2:
            size = data[st] << 8 | data[st + 1]
        elif sizesize == 3:
            size = ((struct.unpack("!B", data[st:st + 1])[0] & 255) << 16) + (
                    (struct.unpack("!B", data[st + 1:st + 2])[0] & 255) << 8) + (
                           struct.unpack("!B", data[st + 2:st + 3])[0] & 255)
        return sizesize, size, st, id
     
    Une idée de ce qu'il se passe?

    Voici pour reference les contenus du paquet en question:

     
    Dernière édition: 24 Février 2018
  2. Labo

    Labo Membre Actif

    Inscrit:
    16 Août 2013
    Messages:
    794
    J'aime reçus:
    57
    Salut, ton code m'a l'air correct, et en effet l'analyse qu'il fait du NetworkDataContainerMessage est correcte.
    A quel moment reçois-tu ce message ?
    Es-tu sûr que le message que tu donnes à ta fonction est correct ?

    Sinon, quelques conseils pour améliorer la lisibilité de ton code :
    - bytes(data[:2]) plutôt que bytes([data[0], data[1]])
    - en fait, le header peut être directement converti en entier: header = int.from_bytes(data[:2] 'big')
    - du coup, id = header >> 2 et sizesize = header & 3
    - pour size, je conseille size = int.from_bytes(data[st: st + sizesize], 'big')
     
  3. gloomy

    gloomy Membre

    Inscrit:
    20 Janvier 2018
    Messages:
    7
    J'aime reçus:
    1
    Hello, merci pour les conseils.

    Le problème est que je recois des paquets avec des informations erronées (là par example, j'ai réessayé avec la nouvelle version, et je recois un message avec id '4' - qui n'apparait pas dans le code source...).

    J'ai lu ton tuto et réimplémenté mon sniffeur (j'utilisais pyshark avant), toujours le meme souci (or j'ai quasi exactement le meme code que toi!)

    Je suis sur que le problème vient des messages encodés sur plusieurs paquets, je me demande si le protocole n'est pas différent pour ces messages là?
     
  4. gloomy

    gloomy Membre

    Inscrit:
    20 Janvier 2018
    Messages:
    7
    J'aime reçus:
    1

En naviguant sur ce site web, vous acceptez les Termes et Conditions d'utilisation. Tout le contenu que vous pourrez trouver sur ce site est soumis à la license Creative Commons.