Problème avec winpcap et visual studio 2005

jnbrunet Messages postés 258 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 13 novembre 2012 - 19 janv. 2008 à 07:01
jnbrunet Messages postés 258 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 13 novembre 2012 - 21 janv. 2008 à 05:50
Bonjour, j'essai depuis quelques temps de réaliser un petit sniffer personnel. J'utilise visual studio 2005. J'ai installé correctement winpcap. Lorsque j'essai de créer un petit projet à l'aide d'une source très simple utilisant winpcap (qui d'ailleurs est sur ce site), visual studio me lance "fatal error C1083: Impossible d'ouvrir le fichier include : 'pcap.h' : No suck file or directory." . Pourtant j'inclus bien la librairie wpcap.lib au début de mon code.

Voici mon code :

Fichier .h
#include <stdio.h>
#include <stdlib.h>

#include <winsock2.h>

#pragma comment(lib,"wpcap.lib")
#pragma comment(lib,"ws2_32.lib")

#define HAVE_REMOTE
#define WPCAP
#define PACKET_SIZE 65536

#include "pcap.h" // must be writing after the defines

struct ethhdr // Ethernet header
{
    unsigned char   h_dest[6];       // Destination host address
    unsigned char   h_source[6];     // Source host address
    unsigned short  h_proto;         // Packet type ID field (IP, ARP ...)
};

struct iphdr // structure IP Header
{
  //Pour processeur de type little-endian
  unsigned char  ihl:4;    // IP header length
  unsigned char  version:4;

  unsigned char  tos;      // Type of service
  unsigned short tot_len;  // Total length
  unsigned short id;       // Identification
  unsigned short frag_off; // Fragment Offset + Flags
  unsigned char  ttl;      // Time to life
  unsigned char  protocol;
  unsigned short check;    // Checksum
  unsigned int   saddr;    // Source address
  unsigned int   daddr;    // Destination address
};

struct tcphdr // structure TCP Header
{
  //Pour processeur de type little-endian
  unsigned short source;  // port source
  unsigned short dest;    // port de destination
  unsigned int   seq;     // Sequence number
  unsigned int   ack_seq; // acknowledge sequence

  unsigned short res1:4,  // Reserved 1 : 4 bits
                 doff:4,  // Data Offset
                 fin:1,   // Flag FINISH
                 syn:1,   // Flag SYNCHRONIZE
                 rst:1,   // Flag RESET
                 psh:1,   // Flag PUSH
                 ack:1,   // Flag ACKNOLEDGE
                 urg:1,   // Flag URGENT
                 res2:2;  // Reserved 2 : 2 bits (res1 + res2 = 6 bits reserved)

    unsigned short window;
    unsigned short check;   // checksum
    unsigned short urg_ptr; // urgent
};

//--------------------------------------------------------------

Fichier .cpp
// D2sniffer.cpp : définit le point d'entrée pour l'application console.
//

#include "stdafx.h"
#include "D2sniffer.h"

void print_eth_header(struct ethhdr * eth){
    fprintf(stdout,"-------------------[ETH HEADER]-----------\r\n");
    fprintf(stdout,"| %.2X:%.2X:%.2X:%.2X:%.2X:%.2X -> ",eth->h_source[0],eth->h_source[1], eth->h_source[2],eth->h_source[3],eth->h_source[4],eth->h_source[5]);
    fprintf(stdout,"%.2X:%.2X:%.2X:%.2X:%.2X:%.2X |\r\n",eth->h_dest[0],eth->h_dest[1], eth->h_dest[2],eth->h_dest[3],eth->h_dest[4],eth->h_dest[5]);
    fprintf(stdout,"------------------------------------------\r\n");
    fprintf(stdout,"Protocol: 0x%.4X\r\n", htons(eth->h_proto));
}

void print_ip_header(struct iphdr * ip){

    unsigned char * src = (unsigned char *)&(ip->saddr);
    unsigned char * dest = (unsigned char *)&(ip->daddr);

    fprintf(stdout,"[ IP : %d.%d.%d.%d -> ",src[0],src[1],src[2],src[3]);
    fprintf(stdout,"%d.%d.%d.%d ]\r\n",dest[0],dest[1],dest[2],dest[3]);
    fprintf(stdout,"--------------------[IP HEADER]----------------------\r\n");
    fprintf(stdout,"| IP header length    : %d * 32 bits = %d bytes      |\r\n",ip->ihl, ip->ihl * 4);
    fprintf(stdout,"| IP version      : %.5d | ",ip->version);
    fprintf(stdout,"Type of service : %.5d |\r\n",ip->tos);
    fprintf(stdout,"| Total length    : %.5d | ",htons(ip->tot_len));
    fprintf(stdout,"Identification  : %.5d |\r\n",htons(ip->id));
    fprintf(stdout,"| Time to live    : %.5d | ",ip->ttl);
    fprintf(stdout,"Protocol        : %.5d |\r\n",ip->protocol);
    fprintf(stdout,"| Checksum            : %.5d                       |\r\n",ip->check);
    fprintf(stdout,"-----------------------------------------------------\r\n");
}

void print_tcp_header(struct tcphdr * tcp){
    fprintf(stdout,"[ Port : %.5d -> %.5d ]\n", ntohs(tcp->source), ntohs(tcp->dest) );
    fprintf(stdout,"--------------------[TCP HEADER]---------------------\r\n");
    fprintf(stdout,"| TCP Header length   : %d * 32 bits = %d bytes      |\r\n",tcp->doff, tcp->doff * 4);
    fprintf(stdout,"| URG (URGENT)      = %d | ",tcp->urg);
    fprintf(stdout,"ACK (ACKNOWLEDGE) = %d     |\r\n",tcp->ack);
    fprintf(stdout,"| PSH (PUSH)        = %d | ",tcp->psh);
    fprintf(stdout,"RST (RESET)       = %d     |\r\n",tcp->rst);
    fprintf(stdout,"| SYN (SYNCHRONIZE) = %d | ",tcp->syn);
    fprintf(stdout,"FIN (FINISH)      = %d     |\r\n",tcp->fin);
    fprintf(stdout,"-----------------------------------------------------\r\n");
}

void print_data(unsigned char * data, unsigned int size){    int j 0, k 0;

    for( j = 0; j < size; j++)
    {
        if( k == 16)
        {
            j -= 16;
            fprintf(stdout," ");
            for(k = 0 ; k < 16 ; k++, j++)
            {
                if(data[j] < 127 && data[j] > 31)
                    fprintf(stdout, "%c", data[j]);
                else
                    fprintf(stdout, ".");
            }
            j--;
            k = 0;
            fprintf(stdout,"\r\n");
        }
        else
        {
            fprintf(stdout,"%.2x ",data[j]);
            k++;
        }
    }
    j -= k;
    while(k!=0)
    {
        if(data[j] < 127 && data[j] > 31)
            fprintf(stdout, "%c", data[j]);
        else
            fprintf(stdout, ".");
        k--;
        j++;
    }
    fprintf(stdout,"\r\n");
}

void print_packet(const u_char * packetData){
    struct iphdr  *     ip;
    struct tcphdr *     tcp;

    ip = (struct iphdr *)(packetData+sizeof(struct ethhdr));
    print_ip_header(ip);
    switch(ip->protocol){
        case 1 : printf("Internet Control Message Protocol (ICMP)\r\n");
            break;
        case 6 : printf("Transmission Control Protocol (TCP)\r\n");
            tcp = (struct tcphdr *)(packetData+sizeof(struct ethhdr)+sizeof(struct iphdr));

            print_tcp_header(tcp);
           
            /* Data */
            unsigned char * data = (unsigned char *)(packetData+sizeof(struct ethhdr)+sizeof(struct iphdr)+sizeof(struct tcphdr));
            print_data(data, htons(ip->tot_len)-(ip->ihl * 4)-(tcp->doff * 4));
            break;
        case 17 : printf("User Datagram Protocol (UDP)\r\n");
            break;
        default : printf("Unknow\r\n");
            break;
    }
}

int main(void){
    // Interfaces
    pcap_if_t * alldevs;
    pcap_if_t * d;
    int ifNum;
    int i=0;

    pcap_t    * captureHandle;

    // Packet
    struct pcap_pkthdr* packetHeader;
    const  u_char *     packetData;
    struct ethhdr *     eth;

    int res;

    char errbuf[PCAP_ERRBUF_SIZE];

    /* Retrieve the device list from the local machine */
    if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
    {
        fprintf(stderr,"Error in pcap_findalldevs_ex: %s\r\n", errbuf);
        return EXIT_FAILURE;
    }

    /* Print the list */
    for(d= alldevs; d != NULL; d= d->next)
    {
        printf("%d.\r\nName:\r\n\t%s\r\n", ++i, d->name);
        if (d->description)
            printf("Descriptions:\r\n\t%s\r\n\r\n", d->description);
        else
            printf(" (No description available)\r\n");
    }

    if (i == 0)
    {
        printf("\r\nNo interfaces found! Make sure WinPcap is installed.\r\n");
        return EXIT_FAILURE;
    }else{
        printf("Enter the interface number (1-%d):",i);
        scanf("%d", &ifNum);
    }

    if(ifNum < 1 || ifNum > i)
    {
        printf("\nInterface number out of range.\r\n");
        /* Free the device list */
        pcap_freealldevs(alldevs);
        return -1;
    }

    /* Jump to the selected adapter */
    for(d=alldevs, i=0; i< ifNum-1 ;d=d->next, i++);

    captureHandle = pcap_open(d->name, PACKET_SIZE, 0, 1000, NULL, errbuf);

    if( captureHandle == NULL){
        fprintf(stderr, "pcap_open(): %s\r\n", errbuf);
        pcap_freealldevs(alldevs);
        return EXIT_FAILURE;
    }

    /* We don't need any more the device list. Free it */
    pcap_freealldevs(alldevs);

    /* start the capture */
    while( (res = pcap_next_ex(captureHandle, &packetHeader, &packetData)) >= 0){
        if(res == 0)
        /* Timeout elapsed */
            continue;
        printf("\r\n\r\nPacket length: %d\r\n", packetHeader->len);
        printf("Received at ..... %s\r\n",ctime((const time_t*)&packetHeader->ts.tv_sec));

        eth = (struct ethhdr *) packetData;
        print_eth_header(eth);

        // Analyse ethernet type
        switch(htons(eth->h_proto)){
            case 0x0800 :   fprintf(stdout,"Internet Protocol, Version 4 (IPv4)\r\n");
                            print_packet(packetData);
                            break;
            case 0x0806 :   fprintf(stdout,"Address Resolution Protocol (ARP)\r\n");
                            break;
            case 0x8035 :   fprintf(stdout,"Reverse Address Resolution Protocol (RARP)\r\n");
                            break;
            case 0x809B :   fprintf(stdout,"AppleTalk (Ethertalk)\r\n");
                            break;
            case 0x80F3 :   fprintf(stdout,"AppleTalk Address Resolution Protocol (AARP)\r\n");
                            break;
            case 0x8100 :   fprintf(stdout,"IEEE 802.1Q-tagged frame\r\n");
                            break;
            case 0x8137 :   fprintf(stdout,"Novell IPX (alt)\r\n");
                            break;
            case 0x8138 :   fprintf(stdout,"Novell\r\n");
                            break;
            case 0x86DD :   fprintf(stdout,"Internet Protocol, Version 6 (IPv6)\r\n");
                            print_packet(packetData);
                            break;
            case 0x8847 :   fprintf(stdout,"MPLS unicast\r\n");
                            break;
            case 0x8848 :   fprintf(stdout,"MPLS multicast\r\n");
                            break;
            case 0x8863 :   fprintf(stdout,"PPPoE Discovery Stage\r\n");
                            break;
            case 0x8864 :   fprintf(stdout,"PPPoE Session Stage\r\n");
                            break;
            case 0x88A2 :   fprintf(stdout,"ATA over Ethernet\r\n");
                            break;
            default     :  fprintf(stdout,"Unknow packet\r\n");
                            break;
        }
    }

    if(res == -1){
        printf("Error reading the packets: %s\r\n", pcap_geterr(captureHandle));
        return EXIT_FAILURE;
    }

    pcap_close(captureHandle);
    return EXIT_SUCCESS;
}

Voilà, si quelqu'un peu me guider un petit peu, je suis complètement perdu ! Les bons tutoriaux...de préférence en français sur le sujet sont très rares, voire presque inexistant !

Merci pour votre aide !
-Jn-

4 réponses

cs_omnia Messages postés 240 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 22 mars 2009
19 janv. 2008 à 10:50
salut,

Impossible d'ouvrir le fichier include : 'pcap.h' : No suck file or directory. <<< tu as mis le fichier pcap.h avec les ressources dans le répertoire du projet, ou tu as ajouter le répertoire le contenant a ton projet ?

sinon tu devrais avoir l'erreur que tu as :p

ciao
0
jnbrunet Messages postés 258 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 13 novembre 2012
20 janv. 2008 à 02:56
Effectivement je n'avais pas fais ca, mais maintenant j'ai un autre problème. J'arrive à compiler le programme, lorsque je l'exécute, il m,affiche bien les devices possibles, je choisis le bon, et lorsqu'il commence la capture, le programme plante avant meme d'afficher un packet....

Voici l'erreur :

Debug Assertion Failed!

Program: ...
File: loctim64.c
Line: 78

Expression: (*ptime <=_Max__TIME64_T)

For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts.

Pourtant, lorsque j'utilise l'exemple compiler que l'on retrouve sur ce site, le programme marche parfaitement ! les packets s'affichent sans que le programme ne plante!

Quelqu'un connait cette erreur??

Merci !
-Jn-
0
cs_omnia Messages postés 240 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 22 mars 2009
20 janv. 2008 à 10:47
salut

une question toute con tu travail sur carte réseaux wifi ?

car si c le cas la winpcap n'est pas fait pour sa ^^

voila ++
0
jnbrunet Messages postés 258 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 13 novembre 2012
21 janv. 2008 à 05:50
Oui je suis sur wifi, et winpcap marche parfaitement, désolé de te contredire.

J'ai trouvé l'erreur. L'erreur provenait de cette ligne:
    printf("Received at ..... %s\r\n",ctime((const time_t*)&packetHeader->ts.tv_sec));

Si je l'enlève, le programme marche parfaitement! je reçois les packets sans aucune erreur.
-Jn-
0
Rejoignez-nous