Capture d'un paquet

Fermé
mimi1908 Messages postés 3 Date d'inscription mardi 3 juillet 2012 Statut Membre Dernière intervention 4 juillet 2012 - Modifié par mamiemando le 4/07/2012 à 10:16
mamiemando Messages postés 33357 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 13 novembre 2024 - 5 juil. 2012 à 10:36
Bonsoir.
je travaille sur la distribution Centos 6.2.
j'ai ce programme qui montre comment utiliser le hook pour modifier le trafic réseau dans le noyau Linux en utilisant Netfilter :

#include <linux/module.h>  
#include <linux/kernel.h>  
#include <linux/skbuff.h>  
   
#include <linux/ip.h>  
#include <linux/tcp.h>  
#include <linux/in.h>  
#include <linux/netfilter.h>  
#include <linux/netfilter_ipv4.h>  
   
/* Port we want to drop packets on */  
static const uint16_t port = 25;  
   
/* This is the hook function itself */  
static unsigned int hook_func(unsigned int hooknum,  
                       struct sk_buff **pskb,  
                       const struct net_device *in,  
                       const struct net_device *out,  
                       int (*okfn)(struct sk_buff *))  
{  
        struct iphdr *iph = ip_hdr(*pskb);  
        struct tcphdr *tcph, tcpbuf;  
   
        if (iph->protocol != IPPROTO_TCP)  
                return NF_ACCEPT;  
   
        tcph = skb_header_pointer(*pskb, ip_hdrlen(*pskb), sizeof(*tcph), &tcpbuf);  
        if (tcph == NULL)  
                return NF_ACCEPT;  
   
        return (tcph->dest == port) ? NF_DROP : NF_ACCEPT;  
}  
   
/* Used to register our hook function */  
static struct nf_hook_ops nfho = {  
        .hook     = hook_func,  
        .hooknum  = NF_IP_PRE_ROUTING,  
        .pf       = NFPROTO_IPV4,  
        .priority = NF_IP_PRI_FIRST,  
};  
   
static __init int my_init(void)  
{  
        return nf_register_hook(&nfho);  
}  
   
static __exit void my_exit(void)  
{  
    nf_unregister_hook(&nfho);  
}  
   
module_init(my_init);  
module_exit(my_exit); 


je veux ajouter à cet exemple un #include <rtp.h> qui sert à capturer un paquet rtp en modifiant son en-tête tel que payload.
SVP pouvez-vous m'aider.
et merci d'avance.
A voir également:

5 réponses

mamiemando Messages postés 33357 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 13 novembre 2024 7 805
4 juil. 2012 à 10:23
Je n'ai pas très bien compris à quel endroit tu étais bloqué. Si tu veux inclure <rtp.h> il faut installer la librairie correspondante. Pour trouver son nom si tu es sous debian ou un distribution qui en dérive tu peux utiliser apt-file :

(mando@aldur) (~) $ apt-file search rtp.h | grep "/usr/include" | grep "rtp\.h$"
libbitstream-dev: /usr/include/bitstream/ietf/rtp.h
libccrtp-dev: /usr/include/ccrtp/rtp.h
libh323plus-dev: /usr/include/openh323/rtp.h
libopal-dev: /usr/include/opal/rtp/rtp.h
libopenh323-dev: /usr/include/openh323/rtp.h
libortp-dev: /usr/include/ortp/rtp.h
libsrtp0-dev: /usr/include/srtp/rtp.h
libuclmmbase1-dev: /usr/include/uclmmbase/rtp.h


Je ne sais pas quelle libraire est la plus appropriée dans ton cas, mais supposons que ce soit libortp-dev. Il suffit alors sous debian de l'installer via apt-get , aptitude, synaptic etc...

aptitude update
aptitude safe-upgrade
aptitude install rtp.h


Ensuite dans ton programme il suffit d'inclure <ortp/rtp.h> puisqu'ici le header est dans /usr/include/ortp. Enfin au moment de compiler ton programme, il ne faut pas oublier de linker avec la librairie (compilation du fichier qui contient le main).

(mando@aldur) (~) $ apt-file list libortp-dev | grep "\.so$"
libortp-dev: /usr/lib/libortp.so


Ici la libraire s'appelle libortp.so, donc il suffit de rajouter l'option "-lortp".

gcc -W -Wall -c fichier1.c
gcc -W -Wall -c fichier2.c
gcc -W -Wall -o monprogramme main.c fichier1.o fichier2.o -lortp


Bonne chance
0
mimi1908 Messages postés 3 Date d'inscription mardi 3 juillet 2012 Statut Membre Dernière intervention 4 juillet 2012
4 juil. 2012 à 10:50
merci beaucoup pour la reponse.
le programme qui j'ai le posté, je veux le faire une modification.
je veux l'insérer le programme qui sert à capturer le paquet RTP en modifiant le payload.
0
mamiemando Messages postés 33357 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 13 novembre 2024 7 805
Modifié par mamiemando le 4/07/2012 à 20:21
Effectivement avec libpcap ou netfilter tu dois pouvoir récupérer les paquets dont tu as besoin.

Pour reforger le paquets à partir des headers mist en jeu. Pour ip, tcp, udp etc... tu dois déja tout avoir au niveau de la libc? Du coup, la seule chose dont tu as besoin , c'est de connaître la structure d'un paquet RTP (ce qui peut se faire visiblement via ortp).
http://ftp.igh.cnrs.fr/pub/nongnu/linphone/ortp/docs/index.html
http://ftp.igh.cnrs.fr/pub/nongnu/linphone/ortp/docs/payloadtype_8h.html
0
mimi1908 Messages postés 3 Date d'inscription mardi 3 juillet 2012 Statut Membre Dernière intervention 4 juillet 2012
4 juil. 2012 à 21:39
je vous remercie pour la reponse.
mais il faut que j'avoir l'UDP .
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33357 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 13 novembre 2024 7 805
5 juil. 2012 à 10:36
#include <netinet/udp.h> et tu as ce qu'il te faut pour les en-tête UDP non ?
0