Forum Programmation.c Le port source avc LIbpcap

Posté par  .
Étiquettes : aucune
-1
7
mai
2012

Est il possible de connaitre le port source d'1 paquet avec la Libpcap,,,sachant que je travail avec un Bridge sous linux http://formation-debian.via.ecp.fr/bridge.html ,,,je sniffe au niveau de br0 et je veux savoir de quel port me parvient il exactement.

le br0 est relié aux interfaces ethernet eth0,eth1,eth2…
Merciiii d'avance :)))

  • # regarder ce que font les autres

    Posté par  . Évalué à 2.

    Etape :

    1°) lire la documentation de libpcap, ses fonctions, leurs parametres

    2°) s'inspirer d'outils faisant sensiblement la meme chose :
    netstat et whireshark te permette de connaitre les ensembles IP:port d'une communication en cours.

    je ne sais pas s'ils utilisent libpcap mais en s'inspirant de la maniere dont ils le font, tu devrais trouver comment le faire.

    • [^] # Re: regarder ce que font les autres

      Posté par  . Évalué à -2.

      Etape :

      1°) lire la documentation de libpcap, ses fonctions, leurs parametres

      2°) s'inspirer d'outils faisant sensiblement la meme chose :
      netstat et whireshark te permette de connaitre les ensembles IP:port d'une communication en cours.

      je ne sais pas s'ils utilisent libpcap mais en s'inspirant de la maniere dont ils le font, tu devrais trouver comment le faire.

      À quoi servent ce genre de commentaires ? Si tu ne sais pas, ne dit pas :)

  • # Pas le but de libpcap

    Posté par  . Évalué à 3.

    Le but de libpcap est de s'abstraire de la méthode utilisée pour capturer (et accessoirement filtrer en tolérant des faux positifs) les paquets (que ça soit des paquets IP ou des URB). Le parsage du paquet reste pour ta pomme.

    Mais bon, parser un paquet IPv[46]+[UT]CP des grand mères n'est pas bien compliqué. Pense juste à vérifier la taille de tes paquets et à valider les champs avant de t'en servir si tu ne veux pas te retrouver avec des failles de sécurité.

    Et pense surtout à capturer au bon endroit : si tu n'a pas besoin des entêtes MAC, ne capture pas au niveau MAC.

    • [^] # Re: Pas le but de libpcap

      Posté par  . Évalué à 0.

      Pour les trames UDP, tu peux le faire avec un truc de ce genre:

      void capture(pcap_t *p)
      {
          struct pcap_pkthdr hdr;
          const unsigned char * pload;
          const struct ethhdr * ethhdr;
          const struct iphdr * iphdr;
          const struct udphdr * udphdr;
          const unsigned char * data;
          struct in_addr inaddr;
          const int min_size = sizeof ethhdr[0] + sizeof iphdr[0] + sizeof udphdr[0];
          int data_len;
          struct pcap_buff * b;
          int seqnum;
      
          seqnum = 0;
          for (;;) {
              seqnum ++;
              pload = pcap_next(p, &hdr);
              if (pload == NULL)
                  break;
              if (hdr.caplen != hdr.len) {
                  fprintf(stderr, "[%d] capture was truncated (%d expected, %d captured)\n", seqnum, hdr.len, hdr.caplen);
                  continue;
              }
      
              if (hdr.len < min_size) {
                  fprintf(stderr, "[%d] Too small frame found (%d < %d)\n", seqnum, hdr.len, min_size);
                  continue;
              }
      
              ethhdr = (struct ethhdr *)pload;
              if (ethhdr->h_proto != htons(ETH_P_IP)) {
                  fprintf(stderr, "[%d] Unknown ethhdr->h_proto (%04x)\n", seqnum, ethhdr->h_proto);
                  continue;
              }
      
              iphdr = (struct iphdr *)(pload + sizeof ethhdr[0]);
              if (iphdr->ihl != sizeof iphdr[0] / 4) {
                  fprintf(stderr, "[%d] Invalid iphdr->ihl (%d != %d)\n", seqnum, iphdr->ihl * 4, sizeof iphdr[0]);
                  continue;
              }
      
              if (iphdr->protocol != IPPROTO_UDP) {
                  fprintf(stderr, "[%d] Only UDP is allowed (%#x found)\n", seqnum, iphdr->protocol);
                  continue;
              }
      
              udphdr = (struct udphdr *)(pload + sizeof ethhdr[0] + sizeof iphdr[0]);
              data_len = htons(udphdr->len) - sizeof udphdr[0];
              if (data_len + min_size != hdr.len) {
                  fprintf(stderr, "[%d] Invalid pload lenght ((%d - %d) + %d != %d)\n", seqnum, htons(udphdr->len), sizeof udphdr[0], min_size, hdr.len);
                  continue;
              }
      
              data = pload + sizeof ethhdr[0] + sizeof iphdr[0] + sizeof udphdr[0];
      
              inaddr.s_addr = iphdr->saddr;
              printf("[%d] ip.saddr = <%s>, udp.source = <%d>\n", seqnum, inet_ntoa(inaddr), htons(udphdr->source));
      
              inaddr.s_addr = iphdr->daddr;
              printf("[%d] ip.daddr = <%s>, udp.dest = <%d>\n", seqnum, inet_ntoa(inaddr), htons(udphdr->dest));
          }
      }
      
      

      À la fin de la boucle:
      * iphdr pointe sur l'entête IP (où tu trouveras entre autre la source et destination ainsi que le type UDP, TCP etc.)
      * udphdr pointe sur l'entête UDP (où tu trouveras entre autre les ports source et destination)
      * data pointe sur les données (sic !)

      Si tu veux les ports TCP dans le cas des paquets TCP, tout comme l'entête UDP, pointer avec un struct udphdr et y lire "source" et "dest". Faut juste faire gaffe aux histoires d'offset pour la donnée, et aux htons des champs dans les structures.

  • # Interface source je rectifie :)

    Posté par  . Évalué à 0.

    Quoi vous dire que Merci :)
    En fait je voulais dire par port Interfaces Sources et nn pas ports,,,ccar si je sniffe au niveau de br0 je n'ai pas la possibilité de savoir l'interface source de ce paquet,,ds le paquet l'information ne se trouve pas && je n'ai pas trouvé une fonction Pcap qui le fait,,don jai décidé de sniffer au niveau de chque interface pr avoir le controle de mn reseau virtuelle,,voila si il existe une solution bah faites nous savoir.
    Merci :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.