samuel3490
Messages postés3Date d'inscriptionjeudi 8 janvier 2004StatutMembreDernière intervention13 août 2008
-
12 août 2008 à 15:30
SebLinck
Messages postés212Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention23 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.
samuel3490
Messages postés3Date d'inscriptionjeudi 8 janvier 2004StatutMembreDernière intervention13 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.
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;
samuel3490
Messages postés3Date d'inscriptionjeudi 8 janvier 2004StatutMembreDernière intervention13 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.