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

Linux Discussion :

Création d'un reconstructeur de page web depuis un fichier pcap


Sujet :

Linux

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2007
    Messages : 273
    Points : 83
    Points
    83
    Par défaut Création d'un reconstructeur de page web depuis un fichier pcap
    Salut tout le monde!!!

    J'aimerais faire un soft qui permette de reconstruire les pages web visitées à partir d'un fichier pcap.

    Donc j'ai le début : filtrer mon fichier pcap pour ne garder que les trames tcp sur le port 80.
    Ensuite il faut les classer pour le moment rien de bien compliquer.

    là ou ca se complique c'est comment est ce que je peux faire pour depuis une trame savoir s'il s'agit de la trame d'une page web et non d'une image. Enfin je pense qu'en lisant dans la trame si j'ai quelque chose comme .html ou .php ou .asp à la fin du lien ca voudra dire que c'est une page. Mais ou est cette info? dans la payload ou ailleurs?

    Ensuite reste plus qu'à mettre le tout dans un fichier.htm ou .php c'est du pareil au même je pense.

    il y a Chaos reader qui fait ca, mais c'est super long. Donc j'essaie d'en écrire un en C.

    j'espère que vous pourrez m'éclairer sur le sujet.

    Merci d'avance

  2. #2
    vic
    vic est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut
    Hello,

    Tu peux faire ça avec Ethereal : clic droit sur un paquet puis "Follow TCP stream"

    Si tu veux le faire "à la main", l'info se trouve dans le header HTTP Content-type. Par exemple pour cette page du forum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    HTTP/1.1 200 OK
    .
    .
    .
    Content-Type: text/xml; charset=ISO-8859-1
    Pour une image, tu auras "Content-Type: image/gif" ou image/png, image/jpg, etc ...

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2007
    Messages : 273
    Points : 83
    Points
    83
    Par défaut
    Ah ok d'accord .
    Donc en gros après je peux rediriger les flux par suivi de trame direct c'est bien ca?

    Dans le cas d'une image, est ce que champ doit être retiré du fichier pour avoir l'image bien comme il faut?

    Autre question juste pour etre sûr, est ce qu'en ethernet les en tête sont de taille fixe? en regardant avec wireshark, la taille des en tête et de 56 octets sur les 1500 de la MTU.
    est ce que je me trompe ou pas?

    Merci

  4. #4
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    La taille d'une entête ethernet est fixe et est de 14 octet.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2007
    Messages : 273
    Points : 83
    Points
    83
    Par défaut
    Ok merci.

    Donc je prend les paquets qui contienne une en-tête content type=...
    Et ensuite je cherche les suivant (les continuation data). Mais heu comme savoir si ces paquet sont bien ceux de la page Web?

  6. #6
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Pour ce genre de problèmatique, il faut une bonne conception :
    ce que tu récupères, ce sont des trames ethernet, donc il faut
    - vérifier que la couche supérieure est bien IP et non ARP par exemple (champs "type")
    - vérifier que la couche supérieure est bien TCP (champs "protocol")
    - vérifier que la couche supérieur est bien HTTP, là tu n'as plus le choix, il faux analyser le contenu et pas seulement l'entête, le plus simple est quand même de partir d'une nouvelle connexion en cherchant un "3 way handshake" (SYN), ensuite tu reconstruit ta requête en te basant sur les numéro de séquence TCP jusqu'à la fin de la connexion. Autant le dire tout de suite, c'est lourd et c'est pour ça que d'ordinaire c'est fait en kernel space.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  7. #7
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2007
    Messages : 273
    Points : 83
    Points
    83
    Par défaut
    pour le
    vérifier que la couche supérieur est bien HTTP, là tu n'as plus le choix, il faux analyser le contenu et pas seulement l'entête, le plus simple est quand même de partir d'une nouvelle connexion en cherchant un "3 way handshake" (SYN), ensuite tu reconstruit ta requête en te basant sur les numéro de séquence TCP jusqu'à la fin de la connexion. Autant le dire tout de suite, c'est lourd et c'est pour ça que d'ordinaire c'est fait en kernel space.
    Est ce que tu veux dire que je dois aller lire dans la trame et cherche les code de synchronisation?
    Ensuite pour ce qui est de suivre la connexion jusqu'à la cloture, la aussi c'est apr rapport aux différent code utiliser dans l'html c'est bien ca?

  8. #8
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par danathane Voir le message
    pour le


    Est ce que tu veux dire que je dois aller lire dans la trame et cherche les code de synchronisation?
    Ensuite pour ce qui est de suivre la connexion jusqu'à la cloture, la aussi c'est apr rapport aux différent code utiliser dans l'html c'est bien ca?
    Au niveau TCP, on ne parle plus de trame mais de paquet, mais oui c'est bien ce que je dis, puisque tu récupères des trames ethernet (de niveau 2), c'est à toi de reconstituer les couches supérieures.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  9. #9
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2007
    Messages : 273
    Points : 83
    Points
    83
    Par défaut
    et vu que sur les trame supérieur, les en-te^te ne change pour ainsi dire jamais.. Ou que la taille de l'en-tête est précisées dans l'en-tête...
    Hum je sens que je vais bien m'amuser. Merci pour ces conseil Nicolas

  10. #10
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2007
    Messages : 273
    Points : 83
    Points
    83
    Par défaut
    Coucou c'est moi que revoilou avec au moins une question

    Donc la question du jour :

    J'ai donc mon paquet, et avec les librairies adéquates de linux (netninet/ip.h; ethernet.h tcp.h et j'en passe) j'arrive à récupérer en-tête ethernet, et IP, ensuite je vais pour essayer de chopper l'en-tête TCP, le problème c'est qu'il ne semple pas aimer ce que je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    struct tcphdr * TcpHeader;
    ...
     
    TcpHeader = (struct tcphdr*) (packet + ETH_HLEN + (IpHeader->ip_hl*4));
    printf("Port source TCP : %d\n", TcpHeader->th_sport);
    petite précision : IpHeader->ip_hl*4 pour avoir la taille de l'en-tête IP en octets.

    Quand je lance la compilation il me dit : dereferencing pointer to incomplete type pour le printf donc pour le TcpHeader->th_sport.

    Là je dois dire que je ne sais absolument pas quoi faire... Au début j'ai cru que cela venait de ip_hl.. mais non.

    Si vous avez des solutions n'hésitez surtout pas. Je vais continuer mes recherches en attendant. Merci

  11. #11
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par danathane Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("Port source TCP : %d\n", TcpHeader->th_sport);
    Tu as vraiment un champs nommé "th_sport" dans ta structure? chez moi il s'ppelle "source"!
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  12. #12
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    En plus c'est faux, c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct tcphdr * TcpHeader = (struct tcphdr*) (packet + ETH_HLEN + sizeof (struct iphdr));
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  13. #13
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2007
    Messages : 273
    Points : 83
    Points
    83
    Par défaut
    En fait il y a les deux, et j'ai essayé justement avec les deux mais aucun changement.

  14. #14
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par danathane Voir le message
    En fait il y a les deux, et j'ai essayé justement avec les deux mais aucun changement.
    Montre moi ça s'il te plaît, peut tu afficher la structure tcphdr qui se trouve dans /usr/include/linux/tcp.h !
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  15. #15
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2007
    Messages : 273
    Points : 83
    Points
    83
    Par défaut
    Ah ok
    tu utilise celle dans linux/tcp.h!!!
    Car il y en a plusieur des tcp.h, il y en a une dans netinet et une autre dans linux... Je vais essayer avec celle de linux/tcp.h

    toujorus le même problème. voilà mon code, si tu peux essayer de le compiler chez toi pour voir si ca passe?


    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
    172
    173
    174
    175
    176
    177
    178
    179
    180
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
    #include <pcap.h>
    #include <pcap-bpf.h>
     
    #include <netinet/in.h>
    #include <net/ethernet.h>
    #include <netinet/ether.h>
    #include <linux/tcp.h>
    #include <netinet/ip.h>
     
    char **str_split(char *s, const char *ct)
    {
    	char **tab=NULL;
     
    	int i;
    	char *cs=NULL;
    	size_t size=1;
    	void *temp=NULL;
     
     
    	//printf("test\n");
    	if(s!=NULL && ct != NULL)
    	{
     
    		for(i=0; (cs=strtok(s,ct)); i++)
    		{
    			if(size <=i+1){
     
    				size <<=1;
    				temp=realloc(tab,sizeof(*tab) * size);
     
    				if(temp!=NULL){
    					tab=temp;
    				}
    				else{
    					fprintf(stderr,"mémoire insffisante\n");
    					free(tab);
    					tab=NULL;
    					exit(EXIT_FAILURE);
     
    				}
    			}
     
    			tab[i]=cs;
    			s=NULL;
     
    		}
    		tab[i]=NULL;
    	}
     
    	return tab;
    }
     
    char *rebuild_mac(char **mac_digit){
     
    	int index_temp=0;
     
    	char mac_address[20];
     
    // 	printf("Test rebuild_mac\n");
    	strcpy(mac_address,"\0");
    	while(index_temp <6)
    	{
    		if(index_temp!=0 && index_temp<6){
    			strcat(mac_address,":");
    		}
     
    		if(strlen(mac_digit[index_temp])<2)
    		{
     
    			strcat(mac_address,"0");
    			strcat(mac_address,mac_digit[index_temp]);
    		}else{
    			strcat(mac_address,mac_digit[index_temp]);
     
    		}
     
    		//printf("Temp : %s -> taille : %d  index_temp : %d\n", mac_address,strlen(mac_address),index_temp);
    		index_temp++;
    	}
    	//printf("Fin dela boucle while\n");
    	return mac_address;
    }
     
     
    int main(int argc, char **argv)
    {
     
     
     
    	pcap_t *desc;
    	pcap_t *desc_save;
    	struct pcap_pkthdr hdr;	
    	struct bpf_program bp ;
    	struct ethhdr *EtherHdr;
    	struct ip *IpHeader;
    	struct tpchdr *TcpHeader;
    	bpf_u_int32 netmask=32;
    	FILE *fp;
     
    	const u_char *packet;
    	char **temp;
    	char errbuf[PCAP_ERRBUF_SIZE];
    	char * buff =NULL;
    	char *save_temp;
    	char *fichier_pcap = argv[1];
    	char mac_address_src_1[20];
    	char mac_address_dst_1[20];
    	char mac_address_src_2[20];
    	char mac_address_dst_2[20];
    	char previous_mac_address[20];
    	char mac_AP[20];
    	char ip_address_src_1[20];
    	char ip_address_dst_1[20];
    	char ip_address_src_2[20];
    	char ip_address_dst_2[20];
    	char directory[100];
     
    	int index_temp= 0;
    	int num_protocole= 0;
    	int mac_found= 0;
    	int host_found = 0;
    	int i = 0;
    	int size_tab=100;
    	int multiple_ip = 0;
     
     
     
     
    //End of variables declaration
    	if(argc<=0){
     
    		fprintf(stderr,"Missing arguments");	
    		exit(EXIT_FAILURE);
     
    	}	
     
    	// We take the directory in wich we will write te ip/mac file
     
    	desc = pcap_open_offline(fichier_pcap, errbuf);
     
    	if (desc == NULL){
    		printf("File damaged or missing\n", errbuf), exit(2);
     
    	}
     
     
    	IpHeader=NULL;
    // On rehcerhce l'adresse Mac et l'adresse IP du PA .
    	while(packet=pcap_next(desc,&hdr))
    	{
     
    		EtherHdr= (struct etherhdr *)packet;
     
    		if(EtherHdr->h_proto!=ETH_P_IP){	//if we are not using an ARP packet
     
    			//printf("EtherHdr proto : %d\n",ETH_HLEN);
     
    			IpHeader = (struct ip *)(packet + ETH_HLEN);
    			//printf("protocole IP : %d\n", IpHeader->ip_p);
    			if(IpHeader->ip_p ==IPPROTO_TCP){
     
    				printf("taille de la trame IP : %d\n", ETH_HLEN);
    				TcpHeader = (struct tcphdr *)(packet + 34); //IpHeader->ip_hl*4 in order to have the lenght in bytes
    				printf("Numéro du port : %x\n",ntohs(TcpHeader->source));
    			}
     
     
    		}
    	} 
     
     
    	pcap_close(desc); //on ferme le fichier
    	return 0;
     
    }
    Il y a pas mal de variable qui ne sont pas utiliser car c'est le squelette de l'un de mes autres codes dont je me suis servi.

  16. #16
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2007
    Messages : 273
    Points : 83
    Points
    83
    Par défaut
    Hello!!!

    J'ai trouvé la raison du bug... La déclaration de la variable en question était foireuse...j'avais mis tpchdr au lieu de tcphdr... 24h pour trouver la solution... ya de quoi déprimer non?

    Par contre autre soucis : j'ai l'impression que les octets sont en little endian ou bigendian (je sais jamais)... bref j'ai mes octets qui sont inversés... ce qui fait que je ne peux pâs faire mes conversion correctement. Est ce que vous auriez une fonction qui permet de faire la conversion?

    merci pour votre aide.

  17. #17
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    typiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    htons()
    htonl()
    ntohs()
    ntohl()
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  18. #18
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <pcap.h>
    #include <pcap-bpf.h>
    #include <net/ethernet.h>
    #include <netinet/ip.h>
    #include <linux/tcp.h>
    #include <netinet/in.h>
     
    #if 0
    static char **str_split (char *s, const char *ct)
    {
       char **tab = NULL;
       char *cs = NULL;
       size_t size = 1;
       void *temp = NULL;
     
       if (s != NULL && ct != NULL)
       {
          size_t i = 0;
          for (; (cs = strtok (s, ct)); i++)
          {
             if (size <= i + 1)
             {
                size <<= 1;
                temp = realloc (tab, sizeof (*tab) * size);
     
                if (temp != NULL)
                {
                   tab = temp;
                }
                else
                {
                   fprintf (stderr, "mémoire insffisante\n");
                   free (tab);
                   tab = NULL;
                   exit (EXIT_FAILURE);
     
                }
             }
     
             tab[i] = cs;
             s = NULL;
     
          }
          tab[i] = NULL;
       }
     
       return tab;
    }
     
    static char *rebuild_mac (char **mac_digit)
    {
     
       int index_temp = 0;
     
       static char mac_address[20];
     
       strcpy (mac_address, "\0");
       while (index_temp < 6)
       {
          if (index_temp != 0 && index_temp < 6)
          {
             strcat (mac_address, ":");
          }
     
          if (strlen (mac_digit[index_temp]) < 2)
          {
     
             strcat (mac_address, "0");
             strcat (mac_address, mac_digit[index_temp]);
          }
          else
          {
             strcat (mac_address, mac_digit[index_temp]);
          }
     
          index_temp++;
       }
     
       return mac_address;
    }
    #endif
     
    int main (int argc, char **argv)
    {
       int ret = 0;
     
    #if 0
       pcap_t *desc_save;
       struct bpf_program bp ;
       bpf_u_int32 netmask = 32;
       FILE *fp;
       char **temp;
       char *save_temp;
       char * buff = NULL;
       char mac_address_src_1[20];
       char mac_address_dst_1[20];
       char mac_address_src_2[20];
       char mac_address_dst_2[20];
       char previous_mac_address[20];
       char mac_AP[20];
       char ip_address_src_1[20];
       char ip_address_dst_1[20];
       char ip_address_src_2[20];
       char ip_address_dst_2[20];
       char directory[100];
     
       int index_temp = 0;
       int num_protocole = 0;
       int mac_found = 0;
       int host_found = 0;
       int i = 0;
       int size_tab = 100;
       int multiple_ip = 0;
    #endif
     
       if (argc < 2)
       {
          fprintf (stderr, "Missing arguments");
          ret = EXIT_FAILURE;
       }
       else
       {
          char errbuf[PCAP_ERRBUF_SIZE];
          char *fichier_pcap = argv[1];
     
          pcap_t *desc = pcap_open_offline (fichier_pcap, errbuf);
     
          if (desc == NULL)
          {
             fprintf (stderr, "File damaged or missing : %s\n", errbuf);
             ret = EXIT_FAILURE;
          }
          else
          {
             struct pcap_pkthdr hdr;
             const u_char *packet;
     
             while ((packet = pcap_next (desc, &hdr)))
             {
                struct ether_header *EtherHdr = (struct ether_header *) packet;
     
                if (EtherHdr->ether_type != ETH_P_IP)
                {
                   struct iphdr *IpHeader = (struct iphdr *) (packet + ETH_HLEN);
     
                   if (IpHeader->protocol == IPPROTO_TCP)
                   {
                      struct tcphdr *TcpHeader = (struct tcphdr *) (packet + ETH_HLEN + sizeof (struct iphdr));
                      printf ("Numéro du port : %hd\n", ntohs (TcpHeader->source));
                   }
                }
             }
     
             pcap_close (desc), desc = NULL; //on ferme le fichier
          }
       }
       return ret;
    }
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  19. #19
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2007
    Messages : 273
    Points : 83
    Points
    83
    Par défaut
    Ah ok merci!

    Avec ton aide ben j'ai mes mails, le seul soucis, ben c'est que j'ai des morceaux qui traine dans les mails et qui ne devrait pas trainer
    Ca doit être un soucis d'initialisation quelque part dans le buffer je pense.

    Je pense que cela vient du unsigned cont char * .
    Quand je fais le packet =pcap_next()...
    packet récupère bien les donnée contenue dans le packet mais si le paquet est plus petit que le précédent, j'ai des morceau du précédent qui reste. Comment est ce que je pourrais faire pour ne plus avoir ce problème?
    Allocation dynamique? ou alors je retire le const de ma déclaration?

  20. #20
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Non pcap_next() renvoie un pointeur différent à chaque, donc ça ne peut pas arriver, en revanche, je t'encourage à utiliser la fonction pcap_next_ex() qui non seulement te permettra d'avoir la cause des erreurs, mais en plus te permet d'adopter un style de programmation plus propre (pcap_next_ex est async signal safe).
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

Discussions similaires

  1. Création de page web depuis un fichier XML
    Par hoshizora dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 06/06/2012, 08h33
  2. Piloter une page Web depuis Excel en VBA
    Par ilcocodrillo dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/08/2008, 16h57
  3. [VB6] Piloter une page web depuis VB
    Par GnarlyYoyo dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 14/04/2007, 00h00
  4. appler une page web depuis un script cgi
    Par Bestop dans le forum Réseau/Web
    Réponses: 5
    Dernier message: 26/08/2006, 11h09
  5. Javascript pour charger une page web depuis un menu déroulan
    Par tomguiss dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 14/10/2005, 08h58

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