IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Discussion :

Obtenir une trame Ethernet


Sujet :

Développement

  1. #1
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 91
    Points : 53
    Points
    53
    Par défaut Obtenir une trame Ethernet
    Bonjour,
    Je souhaiterais pouvoir analyser les trames que s'échangent 2 automates reliés par l'ethernet... (et ce peu importe le protocole).
    Je voudrais donc savoir comment il est possible de lire ce qui circule sur ce réseau...

    Dans un second temps je souhaiterais gérer cette récupération en langage Borland C++ Builder... (si vous avez des infos sur des méthodes ou fonctions à utiliser).

    Merci d'avance.

  2. #2
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Pour la deuxième partie en C++, je te dis tout de suite je répondrai pas, je suis pas compétent.

    Pour une récupération "manuelle", si tu es sur le même domaine de collision ethernet qu'un des automates, par exemple si yen a un qui est sur ta machine, tu peux utiliser ethereal (www.ethereal.com) pour écouter une interface ethernet (apparemment ça tourne sous unix, linux, windows)

  3. #3
    Membre averti
    Avatar de Greg01
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mai 2002
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2002
    Messages : 297
    Points : 426
    Points
    426
    Par défaut
    Salut !

    L'outil d'analyse des trames réseaux s'appelle un sniffer, et effectivement Ethreal en est un (plus bien d'ailleurs). Il s'appuie sur la librairie WinPcap pour la capture proprement dite. Tu peux donc t'en inspirer pour ton projet.

    Bon courage

    Greg
    Google est mon ami.

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 138
    Points : 1 504
    Points
    1 504
    Par défaut
    Avec WinPcaP, voicin un exemple pour capter les trames ethernet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    #include "pcap.h"
    
    /* 4 bytes IP address */
    typedef struct ip_address{
        u_char byte1;
        u_char byte2;
        u_char byte3;
        u_char byte4;
    }ip_address;
    
    /* IPv4 header */
    typedef struct ip_header{
        u_char  ver_ihl;        // Version (4 bits) + Internet header length (4 bits)
        u_char  tos;            // Type of service 
        u_short tlen;           // Total length 
        u_short identification; // Identification
        u_short flags_fo;       // Flags (3 bits) + Fragment offset (13 bits)
        u_char  ttl;            // Time to live
        u_char  proto;          // Protocol
        u_short crc;            // Header checksum
        ip_address  saddr;      // Source address
        ip_address  daddr;      // Destination address
        u_int   op_pad;         // Option + Padding
    }ip_header;
    
    /* UDP header*/
    typedef struct udp_header{
        u_short sport;          // Source port
        u_short dport;          // Destination port
        u_short len;            // Datagram length
        u_short crc;            // Checksum
    }udp_header;
    
    /* prototype of the packet handler */
    void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);
    
    
    main()
    {
        pcap_if_t *alldevs;
        pcap_if_t *d;
        int inum;
        int i=0;
        pcap_t *adhandle;
        char errbuf[PCAP_ERRBUF_SIZE];
        u_int netmask;
        char packet_filter[] = "ip and udp";
        struct bpf_program fcode;
      
        /* Retrieve the device list */
        if (pcap_findalldevs(&alldevs, errbuf) == -1)
        {
            fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
            exit(1);
        }
        
        /* Print the list */
        for(d=alldevs; d; d=d->next)
        {
            printf("%d. %s", ++i, d->name);
            if (d->description)
                printf(" (%s)\n", d->description);
            else
                printf(" (No description available)\n");
        }
    
        if(i==0)
        {
            printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
            return -1;
        }
        
        printf("Enter the interface number (1-%d):",i);
        scanf("%d", &inum);
        
        if&#40;inum < 1 || inum > i&#41;
        &#123;
            printf&#40;"\nInterface number out of range.\n"&#41;;
            /* Free the device list */
            pcap_freealldevs&#40;alldevs&#41;;
            return -1;
        &#125;
    
        /* Jump to the selected adapter */
        for&#40;d=alldevs, i=0; i< inum-1 ;d=d->next, i++&#41;;
        
        /* Open the adapter */
        if &#40; &#40;adhandle= pcap_open_live&#40;d->name, // name of the device
                                 65536,     // portion of the packet to capture. 
                                            // 65536 grants that the whole packet will be captured on all the MACs.
                                 1,         // promiscuous mode
                                 1000,      // read timeout
                                 errbuf     // error buffer
                                 &#41; &#41; == NULL&#41;
        &#123;
            fprintf&#40;stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n"&#41;;
            /* Free the device list */
            pcap_freealldevs&#40;alldevs&#41;;
            return -1;
        &#125;
        
        /* Check the link layer. We support only Ethernet for simplicity. */
        if&#40;pcap_datalink&#40;adhandle&#41; != DLT_EN10MB&#41;
        &#123;
            fprintf&#40;stderr,"\nThis program works only on Ethernet networks.\n"&#41;;
            /* Free the device list */
            pcap_freealldevs&#40;alldevs&#41;;
            return -1;
        &#125;
        
        if&#40;d->addresses != NULL&#41;
            /* Retrieve the mask of the first address of the interface */
            netmask=&#40;&#40;struct sockaddr_in *&#41;&#40;d->addresses->netmask&#41;&#41;->sin_addr.S_un.S_addr;
        else
            /* If the interface is without addresses we suppose to be in a C class network */
            netmask=0xffffff; 
    
    
        //compile the filter
        if&#40;pcap_compile&#40;adhandle, &fcode, packet_filter, 1, netmask&#41; <0 &#41;&#123;
            fprintf&#40;stderr,"\nUnable to compile the packet filter. Check the syntax.\n"&#41;;
            /* Free the device list */
            pcap_freealldevs&#40;alldevs&#41;;
            return -1;
        &#125;
        
        //set the filter
        if&#40;pcap_setfilter&#40;adhandle, &fcode&#41;<0&#41;&#123;
            fprintf&#40;stderr,"\nError setting the filter.\n"&#41;;
            /* Free the device list */
            pcap_freealldevs&#40;alldevs&#41;;
            return -1;
        &#125;
        
        printf&#40;"\nlistening on %s...\n", d->description&#41;;
        
        /* At this point, we don't need any more the device list. Free it */
        pcap_freealldevs&#40;alldevs&#41;;
        
        /* start the capture */
        pcap_loop&#40;adhandle, 0, packet_handler, NULL&#41;;
        
        return 0;
    &#125;
    
    /* Callback function invoked by libpcap for every incoming packet */
    void packet_handler&#40;u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data&#41;
    &#123;
        ip_header *ih;
        u_int ip_len;
        u_short sport,dport;
    
       
    
        /* recupere la position de l'entete IP */
        ih = &#40;ip_header *&#41; &#40;pkt_data +
            14&#41;; //length of ethernet header
    
       
            /*  ip addresses */
        printf&#40;"%d.%d.%d.%d -> %d.%d.%d.%d\n",
            ih->saddr.byte1,
            ih->saddr.byte2,
            ih->saddr.byte3,
            ih->saddr.byte4,
            
            ih->daddr.byte1,
            ih->daddr.byte2,
            ih->daddr.byte3,
            ih->daddr.byte4&#41;;
            &#125;
    Ce code permet de lire les paquets ip sur de de l'ethernet.
    Si tu veux plus de renseignements, n'hesite pas
    Bon code.

  5. #5
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Août 2006
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    quelqu'un sait il comment faire pour capter toutes les trames ethernet et pas juste les trames ip ?
    merci

  6. #6
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Si je ne me trompe pas ethereal capture toutes les trames. Donc pour répondre à ta question, il suffit d'utiliser ethereal.
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  7. #7
    Membre expérimenté
    Avatar de Aramis
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 493
    Points : 1 638
    Points
    1 638
    Par défaut
    Citation Envoyé par cedric600
    Si je ne me trompe pas ethereal capture toutes les trames. Donc pour répondre à ta question, il suffit d'utiliser ethereal.
    petit precision - sur un reseau commute, donc qui utilise un swithc, Ethereal ne pourra capturer que les trames "broadcast" et celles emisent et recues par le PC hote.

    Ar@mi$
    Avant de Poster Lire les Regles! Merci
    -------------------------------------------------
    "The only Way for Evils to Triumph is for Good Men to Do Nothing"
    Edmund Burke (1729 - 1797)

  8. #8
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Août 2006
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    j'avais oublié un détail de taille : il faut aussi les envoyer apres... je veux les capter, les arreter puis les renvoyer... enfin avec winpcap c'est faisable !
    merci quand meme !

  9. #9
    Membre expérimenté
    Avatar de Aramis
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 493
    Points : 1 638
    Points
    1 638
    Par défaut
    Re,

    sous Windows WinPCap n est capable que de capturer les trames, en ce qui concerne le renvoie il vous suffirai de configurer votre machine en tant que passerelle au quel cas aucun besoin de WinPCap. Par contre, si vous voulez les capturer et le modifier d'une maniere ou d'une autre, les modifications en dessous de la couche 4 du model OSI (transport) ne sont pas possible sous Windows.

    L|0
    Avant de Poster Lire les Regles! Merci
    -------------------------------------------------
    "The only Way for Evils to Triumph is for Good Men to Do Nothing"
    Edmund Burke (1729 - 1797)

  10. #10
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Août 2006
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    je ne suis pas sur puisque sur leurs site il y a écrit :

    WinPcap is the industry-standard tool for link-layer network access in Windows environments: it allows applications to capture and transmit network packets bypassing the protocol stack, and has additional useful features, including kernel-level packet filtering, a network statistics engine and support for remote packet capture.

    www.winpcap.org

    Pourquoi ces modifications ne sont elles pas possibles? il suffit juste de lire la trame ip, la bloquer et d'en renvoyer une modifiée !

  11. #11
    Membre expérimenté
    Avatar de Aramis
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 493
    Points : 1 638
    Points
    1 638
    Par défaut
    Re,

    peu etre parce que j'ai deja essaye? Non, serieusement il me semble que recement Microsoft a vire la possibilite d'utiliser les sockets en mode RAW, par consequent si le systeme d exploitation detecte un packet modifie, il le corrige. Maintenant, ca fait un bout de temps que je n'ai pas utilise WinPCap donc il se peut qu'entre temps ils aient developpe leur propre drivers reseaux. Ce sont nos eleves qui vont etre content... ils sont un peu perdu lorsqu'il s'agit d'utiliser Linux/Unix pour ce genre de truc (TCPReplay rulez! )

    A.

    NB: la derniere fois que nous avons essaye WinPCap pour envoyer des packets modifie - fausse adresse et etc. - cela n'a pas marche avec WinXP, mais cela a fonctioner avec Win2k.
    Avant de Poster Lire les Regles! Merci
    -------------------------------------------------
    "The only Way for Evils to Triumph is for Good Men to Do Nothing"
    Edmund Burke (1729 - 1797)

  12. #12
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Août 2006
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    d'accord. si j'y arrive avec winpcap, je vous le ferai savoir !
    merci de votre aide !

  13. #13
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 3
    Points
    3
    Par défaut tcpdump tcpreplay
    Pour répondre aux question, tcpdump est un outils en ligne de commande très pratique qui fonctionne avec les mêmes filtres que ethereal. Il permet d'enregistrer les trames réseaux dans un fichier ".pcap" ( comme ethereal ). L'outils pour les rejouer est Tcpreplay. Il permet de rejouer ces fichiers d'enregistrement réseau et de pouvoir changer les @IP, les port, etc...
    Si besoin d'explication sur ces deux outils je pourrai peut-être vous aider...

  14. #14
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Août 2006
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Avec winpcap, on peut envoyer des paquets avec la fonction pcap_send ! je l'ai fait. l'information est donc sûre, et vérifiée !!!

  15. #15
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Esus13092004
    Avec winpcap, on peut envoyer des paquets avec la fonction pcap_send ! je l'ai fait. l'information est donc sûre, et vérifiée !!!
    C'est bon a savoir (mais il n'est dispo que pour les OS de bibill...) Merci.

  16. #16
    Membre expérimenté
    Avatar de Aramis
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 493
    Points : 1 638
    Points
    1 638
    Par défaut
    @fabaix,

    il me semble que WinPCap est un portage de LibPCap pour Linux, et les fonctions/methodes sont exactement les meme.

    Ar@mi$
    Avant de Poster Lire les Regles! Merci
    -------------------------------------------------
    "The only Way for Evils to Triumph is for Good Men to Do Nothing"
    Edmund Burke (1729 - 1797)

Discussions similaires

  1. Envoyer une trame ethernet
    Par antoine2641 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 03/11/2011, 14h43
  2. Réponses: 5
    Dernier message: 24/01/2011, 22h17
  3. Envoi d'une trame ethernet
    Par Sékiltoyai dans le forum Réseau
    Réponses: 4
    Dernier message: 22/03/2009, 16h51
  4. Comment reconnaître une trame Profibus ?
    Par hasna45 dans le forum Développement
    Réponses: 4
    Dernier message: 25/10/2004, 19h53
  5. Réponses: 2
    Dernier message: 04/02/2004, 22h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo