Sniffing - raw socket

Signaler
Messages postés
2
Date d'inscription
vendredi 4 juillet 2003
Statut
Membre
Dernière intervention
27 juillet 2003
-
Messages postés
2
Date d'inscription
vendredi 17 septembre 2004
Statut
Membre
Dernière intervention
27 septembre 2004
-
J'ai essayé de coder un programme capable de me donner la description de l'en tete IP et TCP des packets que je reçois d'une certaine IP,mais lorsque je fais appel a la fonction printf() pour afficher ce descriptif ..je vois a l'ecran une suite de ... 204 !
Le ttl du packet devient 204,l'ip source devient 204.204.204.204,pareil pour l'ip de destination !
Le code est pourtant simple ...le voici,si vous savez ou est l'erreur,merci de me repondre ça serait sympa :)

#include<winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)

void main() {

char packet[5000]; // ou est stocke le packet recus
WSADATA wsa;
WSAStartup(MAKEWORD(2,0),&wsa);
SOCKET sock;
SOCKADDR_IN sin;
sin.sin_family=AF_INET;
sin.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); // la je met l'ip dont je veux les packets
sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);
bind(sock,(SOCKADDR*)&sin,sizeof(sin));
unsigned int optval;
DWORD dwBytesRet;
WSAIoctl(sock,SIO_RCVALL,&optval,sizeof(optval),NULL,0,&dwBytesRet,NULL,NULL);

typedef struct iphdr // ici l'en tete IP
{
unsigned char verlen;
unsigned char tos;
unsigned short tot_len;
unsigned short id;
unsigned short offset;
unsigned char ttl;
unsigned char protocol;
unsigned short checksum;
unsigned int saddr;
unsigned int daddr;
} IP_HDR;

typedef struct tcphdr // ici la TCP
{
unsigned short sport;
unsigned short dport;
unsigned int seqnum;
unsigned int acknum;
unsigned char unused:4, tcp_hl:4;
unsigned char flags;
unsigned short window;
unsigned short checksum;
unsigned short urgPointer;
} TCP_HDR;

iphdr *PartIP=(iphdr*)packet; // voila
tcphdr *PartTCP=(tcphdr*)(sizeof(iphdr)+packet);

recv(sock, packet, sizeof(packet), 0);
// on attend d'avoir reçus un packet

printf("- Champs TOS : %i\n",PartIP->tos);
printf("- Champs TTL : %i\n",PartIP->ttl);
sprintf(ip,"%s",inet_ntoa(*(struct in_addr *)&PartIP->saddr));
printf("IP Source : %s\n",ip);
sprintf(ip,"%s",inet_ntoa(*(struct in_addr *)&PartIP->daddr));
printf("IP Destination : %s\n",ip);

} // et je ferme mon main()

5 réponses

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Ca marche tres bien chez moi, mais il faut mettre une vrai ip, pas 127.0.0.1.

C'est tiré d'un turorial ca non ?
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
J'ai oublié de dire: j'ai pas reussi a compiler du premier coup, il manquais la definition de 'ip'. J'ai rajouté char ip[256] vers le haut de main() et ca marche.

Sinon essaye de sniffer ta propre ip, tu verra que tu aura pas que des 204.
Messages postés
3
Date d'inscription
lundi 12 avril 2004
Statut
Membre
Dernière intervention
16 avril 2004

J'ai utilisé le même script que toi, pour un petit prog, mais j'ai un autre probléme, le compilateur me renvoit une erreur pour la varaible IOC_VENDOR qui n'est pas definie.
Si quelqu'nu peut m'aider.

Voelker
Messages postés
4
Date d'inscription
vendredi 28 mars 2003
Statut
Membre
Dernière intervention
3 septembre 2004

Bonjour,
j'ai un problème avec WSAioctl qui n'est pas dans WSOCK32.DLL
c'est normal sous W XP Familiale ?

De plus le Bind me revoit toujour -1.

Si quelqu'un a une idée merci

Fcsamplus
Messages postés
2
Date d'inscription
vendredi 17 septembre 2004
Statut
Membre
Dernière intervention
27 septembre 2004

bonjour a tous,
la je cherche un programme qui capture aussi les packets sortants de ma machine.
est ce que quelqu'un a une idee, svp c'est tres urgent
merci
tayeb sbihi