Code source efficace d'un firewall

samuel3490 Messages postés 3 Date d'inscription jeudi 8 janvier 2004 Statut Membre Dernière intervention 13 août 2008 - 12 août 2008 à 15:30
SebLinck Messages postés 212 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 23 juin 2011 - 13 août 2008 à 19:36
Bonjour, j'ai déjà regardé plusieurs code sources de firewall open source mais ils utilisaient tous une librairie de chez microsoft avec une action simple de allow ou deny l'acces.
Je cherche donc le code source utile en c/c++ qui autorise ou refuse un packet et qui le modifie pour tout les packets sortant du pc sous windows.

Un petit schema :

=> pcap_next_ex(captureHandle, &packetHeader, &packetData) (avec WinPCAP)

=> stop le packet

(=> le modifie)

=> autorise ou non à l'envoyer

Mon but est de modifier l'addresse IP du destinataire par une autre, donc si vous avez un moyen plus rapide, je suis preneur.

Merci au revoir.
 

4 réponses

SebLinck Messages postés 212 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 23 juin 2011
12 août 2008 à 16:54
Salut,

Je pense que si tu veux modifier les paquets  puis les envoyer sur le réseaux,
il faut que tu regardes du côté de libpcap (socket raw).

Cordialement,
Sébastien.
0
samuel3490 Messages postés 3 Date d'inscription jeudi 8 janvier 2004 Statut Membre Dernière intervention 13 août 2008
12 août 2008 à 19:34
Merci,
Je me suis donc attardé sur la librairie libpcap vu que j'avais lu quelque part que socket raw (qui m'est inconnu) n'existait plus sous windows depuis la xp sp2 et qu'elle ne fonctionnait pas avec la librairie libpcap.

Après avoir appris les fonctions basiques de mise en place de capture des packet, je suis encore butté sur la modification des header car j'ai l'impression que libpcap ne bloque pas les packet mais les sniffent simplement.

pcap_lookupdev(
pcap_open_live(
pcap_compile(
pcap_setfilter(

A ce moment j'ai configuré pcap pour qu'il me donne les bon packet avec le filtre et tout et tout.
J'utilise ensuite pcap_loop( pour faire une boucle de fonctions appelé à chaque packet sniffé.

Mais à part pcap_close( qui ferme la connection et la capture de packet, rien n'indique si les packet sont passé ou bloqués.

Je me suis quand même attardé sur une fonction qui m'est inconnue et que je n'ai pas très bien compris sa fonctionnalité :
TCP_RST_send(tcphdr->th_ack, 0, iphdr->ip_dest.s_addr, iphdr->ip_src.s_addr, tcphdr->th_dport, tcphdr->th_sport, 0) dans un exemple.

Cette fonction est exécuté dans une boucle de sniffage de packet comme pcap_loop( ou pcap_next(, cette fonction est-elle donc celle que je recherche en modifiant juste le iphdr->ip_dest.s_addr en mon ip de destination voulue ?

Merci encore. A plus.
�3;�3;�3;�3;�3;�3;�3;�3;�3;�3;�3;�3;�3;�3;�3;
0
samuel3490 Messages postés 3 Date d'inscription jeudi 8 janvier 2004 Statut Membre Dernière intervention 13 août 2008
13 août 2008 à 05:06
J'ai progressé mais il reste toujours un petit problème au niveau du checksum.

Tout d'abbord j'ai décidé de laisser quand même passer les packets à rediriger.

J'ai donc utilisé les fonctions générales de WinPCAP avec règle de filtrer et tout et tout ...

et puis dans le loop des packet reçus j'ai : (où pkt_data est le header + data du packet reçu)

data = (u_char*)pkt_data; //on copie les data dans une variable non const
    data[0]=0x00;           // on modifie l'addresse mac (header ethr)
    data[1]=0x06;
    data[2]=0x5b;
    data[3]=0x66;
    data[4]=0xbf;
    data[5]=0x24;
    data[24] = 0x00;    // on modifie le checksum à zero (header ip)
    data[25] = 0x00;
    data[30]=0xc0;        // on modifie l'ip dest (header ip)
    data[31]=0xa8;
    data[32]=0x00;
    data[33]=0x0c;
ckck = in_cksum((u_short *)&data,header->len); // on calcule le nouveau checksum
printf("%x", ckck);                            // on l'affiche :p
data[24] = (u_char)(ckck / 0xff);              // on copie dans le premier u_char les 8 premiers octets de ckck (le checksum)
    data[25] = (u_char)ckck;                     // les derniers dans le dernier
   
      pcap_sendpacket(adhandle, data, header->len); // on envoie tout ca

 Avec comme in_cksum que j'ai trouvé sur internet :

inline u_short in_cksum(u_short *addr, int len)
{
register int nleft = len;
register u_short *w = addr;
register int sum = 0;
u_short answer = 0;
while (nleft > 1) {
sum += *w++;
nleft -= 2;
}
if (nleft == 1) {
*(u_char *)(&answer) = *(u_char *) w;
sum += answer;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
answer = ~sum;
return(answer);
}

Donc les packets s'envoyent bien mais pour les pings, il n'y a pas de réponse, j'ai vérifié avec wireshark et le checksum n'est pas correct.

J'ai déjà essayé de prendre que le header ip pour calculer le checksum mais ça ne marche pas non plus.

Merci de votre aide, a plus.
0
SebLinck Messages postés 212 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 23 juin 2011
13 août 2008 à 19:36
Salut,

Je doit dire que tu poses un problème intéressant,
mais hélas je n'ai pas trop le temps de chercher...

Cordialement,
Sébastien.
0
Rejoignez-nous