Accueil > > > SNIFFER TCP AVEC LES RAW SOCKETS
SNIFFER TCP AVEC LES RAW SOCKETS
Information sur la source
Description
Voici un petit code qui permet sniffer des trames TCP entrentent. Il montre l'utilisation des Raw Sockets ainsi qu'une petite analyse des entetes TCP et IP. Vous trouverez plus d'explication ici : http://lilxam.blogspot.com/2008/01/sniffer-tcp-wit h-raw-sockets.html Voilà :).
Source
- #include <cstdlib>
- #include <iostream>
- #include <winsock2.h>
- #include <windows.h>
- #pragma comment(lib,"ws2_32.lib")
-
- #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
- #define RCVALL_ON 1
- #define RCVALL_OFF 0
-
- using namespace std;
-
- /*
- Sniffer TCP with Raw Sockets by lilxam
- */
-
- typedef struct iphdr //Entete IP
- {
- unsigned char IHL:4;
- unsigned char Version :4; // 4-bit IPv4 version
- unsigned char TypeOfService; // IP type of service
- unsigned short TotalLength; // Total length
- unsigned short ID; // Unique identifier
- unsigned char FlagOffset :5; // Fragment offset field
- unsigned char MoreFragment :1;
- unsigned char DontFragment :1;
- unsigned char ReservedZero :1;
- unsigned char FragOffset; //fragment offset
- unsigned char Ttl; // Time to live
- unsigned char Protocol; // Protocol(TCP,UDP etc)
- unsigned short Checksum; // IP checksum
- unsigned int Source; // Source address
- unsigned int Destination; // Source address
- }IP_HDR;
-
- typedef struct tcphdr // Entete TCP
- {
- unsigned short PortSource;
- unsigned short PortDest;
- 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;
-
- int main(int argc, char *argv[])
- {
- char ip[100];
- unsigned short portS, portD;
- char trame[4096];
- char *donnees = NULL;
- unsigned int option;
-
- /* Accés au réseau */
- WSAData wsa;
- if(WSAStartup(MAKEWORD(2,2), &wsa) != 0)
- {
- printf("\n[!]Impossible d'acceder au reseau.\n--- Erreur avec WSAStartup() : %d\n\n", WSAGetLastError());
- system("pause");
- return 0;
- }
-
- /* Creation d'un socket
-
- Référence : http://msdn2.microsoft.com/en-us/library/ms740506(VS.85).aspx
-
- Prototype de la fontionc socket() :
- SOCKET WSAAPI socket(
- __in int af,
- __in int type,
- __in int protocol
- );
- */
-
- SOCKET sock;
- if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP)) == INVALID_SOCKET)
- {
- printf("\n[!]Impossible de creer le socket.\n--- Erreur avec socket() : %d\n\n", WSAGetLastError());
- system("pause");
- return 0;
- }
-
- /* Initialisation des parametres d'écoute */
- SOCKADDR_IN sin;
- sin.sin_family = AF_INET;
- sin.sin_addr.s_addr = inet_addr("192.168.0.11"); //Votre ip locale
-
- /* Ecoute du réseau
-
- Prototype de la fonction bind() :
- int bind(
- __in SOCKET s,
- __in const struct sockaddr* name,
- __in int namelen
- );
- */
-
- if(bind(sock, (SOCKADDR*)&sin, sizeof(sin)) == SOCKET_ERROR)
- {
- printf("\n[!]Ecoute impossible.\n--- Erreur avec bind() : %d\n\n", WSAGetLastError());
- closesocket(sock);
- system("pause");
- return 0;
- }
-
-
- /* Activation du mode promiscuous
- Référence : http://msdn2.microsoft.com/en-us/library/ms741621(VS.85).aspx
-
- Prototype de la fonction WASIoctl() :
-
- int WSAIoctl(
- __in SOCKET s,
- __in DWORD dwIoControlCode,
- __in LPVOID lpvInBuffer,
- __in DWORD cbInBuffer,
- __out LPVOID lpvOutBuffer,
- __in DWORD cbOutBuffer,
- __out LPDWORD lpcbBytesReturned,
- __in LPWSAOVERLAPPED lpOverlapped,
- __in LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
- );
- */
-
- DWORD dwBytesRet;
- WSAIoctl(sock,SIO_RCVALL,&option,sizeof(option),NULL,0,&dwBytesRet,NULL,NULL);
-
-
- /* Gestion des données récupérées sur la trame */
- iphdr *HeaderIP=(iphdr*)trame; // voila
- tcphdr *HeaderTCP=(tcphdr*)(sizeof(iphdr)+trame);
- donnees = (char *)(sizeof(tcphdr)+sizeof(iphdr)+trame);
- char tmp[2048];
-
- for(;;)
- {
- /* En attente de packet */
- recv(sock, trame, sizeof(trame), 0);
-
- /* Traitement des données */
- printf("\n\n --------| Nouveau Packet |--------");
- portS = ntohs(HeaderTCP->PortSource);
- portD = ntohs(HeaderTCP->PortDest);
- sprintf(ip,"%s:%d",inet_ntoa(*(struct in_addr *)&HeaderIP->Source), portS);
- printf("\n [+]IP Source : %s",ip);
- sprintf(ip,"%s:%d",inet_ntoa(*(struct in_addr *)&HeaderIP->Destination), portD);
- printf("\n [+]IP Destination : %s",ip);
- printf("\n [+]IP Version : %d -> 0x%x", HeaderIP->Version, HeaderIP->Version);
- printf("\n [+]IP Checksum : %d -> 0x%x", HeaderIP->Checksum, HeaderIP->Checksum);
- printf("\n [+]Protocol : %d -> 0x%x", HeaderIP->Protocol, HeaderIP->Protocol);
-
-
- memset(tmp, 0, sizeof(tmp));
- for(int i = 0; i <= 2048; i++)
- {
- tmp[i] = donnees[i];
- }
- printf("\n\n -----* Donnees *----- \n\n%s\n [...]\n ------------------------------\n", tmp);
-
- }
-
- closesocket(sock);
-
- system("PAUSE");
- return EXIT_SUCCESS;
- }
#include <cstdlib>
#include <iostream>
#include <winsock2.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
#define RCVALL_ON 1
#define RCVALL_OFF 0
using namespace std;
/*
Sniffer TCP with Raw Sockets by lilxam
*/
typedef struct iphdr //Entete IP
{
unsigned char IHL:4;
unsigned char Version :4; // 4-bit IPv4 version
unsigned char TypeOfService; // IP type of service
unsigned short TotalLength; // Total length
unsigned short ID; // Unique identifier
unsigned char FlagOffset :5; // Fragment offset field
unsigned char MoreFragment :1;
unsigned char DontFragment :1;
unsigned char ReservedZero :1;
unsigned char FragOffset; //fragment offset
unsigned char Ttl; // Time to live
unsigned char Protocol; // Protocol(TCP,UDP etc)
unsigned short Checksum; // IP checksum
unsigned int Source; // Source address
unsigned int Destination; // Source address
}IP_HDR;
typedef struct tcphdr // Entete TCP
{
unsigned short PortSource;
unsigned short PortDest;
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;
int main(int argc, char *argv[])
{
char ip[100];
unsigned short portS, portD;
char trame[4096];
char *donnees = NULL;
unsigned int option;
/* Accés au réseau */
WSAData wsa;
if(WSAStartup(MAKEWORD(2,2), &wsa) != 0)
{
printf("\n[!]Impossible d'acceder au reseau.\n--- Erreur avec WSAStartup() : %d\n\n", WSAGetLastError());
system("pause");
return 0;
}
/* Creation d'un socket
Référence : http://msdn2.microsoft.com/en-us/library/ms740506(VS.85).aspx
Prototype de la fontionc socket() :
SOCKET WSAAPI socket(
__in int af,
__in int type,
__in int protocol
);
*/
SOCKET sock;
if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP)) == INVALID_SOCKET)
{
printf("\n[!]Impossible de creer le socket.\n--- Erreur avec socket() : %d\n\n", WSAGetLastError());
system("pause");
return 0;
}
/* Initialisation des parametres d'écoute */
SOCKADDR_IN sin;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr("192.168.0.11"); //Votre ip locale
/* Ecoute du réseau
Prototype de la fonction bind() :
int bind(
__in SOCKET s,
__in const struct sockaddr* name,
__in int namelen
);
*/
if(bind(sock, (SOCKADDR*)&sin, sizeof(sin)) == SOCKET_ERROR)
{
printf("\n[!]Ecoute impossible.\n--- Erreur avec bind() : %d\n\n", WSAGetLastError());
closesocket(sock);
system("pause");
return 0;
}
/* Activation du mode promiscuous
Référence : http://msdn2.microsoft.com/en-us/library/ms741621(VS.85).aspx
Prototype de la fonction WASIoctl() :
int WSAIoctl(
__in SOCKET s,
__in DWORD dwIoControlCode,
__in LPVOID lpvInBuffer,
__in DWORD cbInBuffer,
__out LPVOID lpvOutBuffer,
__in DWORD cbOutBuffer,
__out LPDWORD lpcbBytesReturned,
__in LPWSAOVERLAPPED lpOverlapped,
__in LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
*/
DWORD dwBytesRet;
WSAIoctl(sock,SIO_RCVALL,&option,sizeof(option),NULL,0,&dwBytesRet,NULL,NULL);
/* Gestion des données récupérées sur la trame */
iphdr *HeaderIP=(iphdr*)trame; // voila
tcphdr *HeaderTCP=(tcphdr*)(sizeof(iphdr)+trame);
donnees = (char *)(sizeof(tcphdr)+sizeof(iphdr)+trame);
char tmp[2048];
for(;;)
{
/* En attente de packet */
recv(sock, trame, sizeof(trame), 0);
/* Traitement des données */
printf("\n\n --------| Nouveau Packet |--------");
portS = ntohs(HeaderTCP->PortSource);
portD = ntohs(HeaderTCP->PortDest);
sprintf(ip,"%s:%d",inet_ntoa(*(struct in_addr *)&HeaderIP->Source), portS);
printf("\n [+]IP Source : %s",ip);
sprintf(ip,"%s:%d",inet_ntoa(*(struct in_addr *)&HeaderIP->Destination), portD);
printf("\n [+]IP Destination : %s",ip);
printf("\n [+]IP Version : %d -> 0x%x", HeaderIP->Version, HeaderIP->Version);
printf("\n [+]IP Checksum : %d -> 0x%x", HeaderIP->Checksum, HeaderIP->Checksum);
printf("\n [+]Protocol : %d -> 0x%x", HeaderIP->Protocol, HeaderIP->Protocol);
memset(tmp, 0, sizeof(tmp));
for(int i = 0; i <= 2048; i++)
{
tmp[i] = donnees[i];
}
printf("\n\n -----* Donnees *----- \n\n%s\n [...]\n ------------------------------\n", tmp);
}
closesocket(sock);
system("PAUSE");
return EXIT_SUCCESS;
}
Historique
- 25 janvier 2008 16:31:11 :
- Changement de catégorie
- 25 janvier 2008 20:18:46 :
- Correction d'une erreur.
- 25 janvier 2008 20:42:43 :
- idem
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Raw Socket -> TCP/IP [ par krum ]
Voila plus d'une semaine que je fouille/cherche sur les moteurs de recherches,les forums ..des sources,des tutos,des papers sur les raw sockets (sous
Requêtes sortantes et raw sockets [ par Thib_G ]
Bonjour, J'ai commencé, il y a quelque temps, un sniffer que je met régulièrement à jour... Au début, je récupérai
aide RAW sockets [ par alien9900 ]
je veux une sur RAW Sockets;et merci;
Sockets asychrones et client serveur TCP [ par argali ]
Bonjour,Est-ce qqun pourrait m'indiquer ou je pourrai trouver un cours complet sur les sockets asynchrones et leurs options (WSAAsyncSelect, FD_ACCEPT
Grave pb Raw socket [ par valoue ]
Bonjour,J'essaie d'utiliser les Raw Socket afin de voir tout ce qui passe sur le reseau, ne garder que ce qui me concerne, et calculer le nbre de tram
raw socket et protocole TCP/IP [ par robertmouac ]
Bonjour tout le monde. Je suis en train de coder une version simplifier du protocol TCP/IP en raw socket. Je formate et deformate bien les trames (ve
programmation avec les RAW sockets sous linux [ par sami0069 ]
je veux savoir comment obtenir la taille de la fenetre de congestion d'une connexion TCP à l'aide d'un programme en C.merci d'avance :)
Aide Sniffer Wifi [ par cadavor ]
Bonjour,J'ai un problème avec un projet que je n'arrive pas à commencer !Je possède une carte électronique (avec un FPGA, une borne wifi et une caméra
RTP raw file [ par dodii ]
Bonjour tout le monde,Pour mon projet de fin d'etude je suis entrain de preparer un sniffer en voip (il capture les communication VOIP sur le LAN et l
Analyseur de trame en C++ [ par zebulon88 ]
Bonjour Je cherche à analyser des trames tcp pour cela j'ai récupéré winpcap et un programme en C qui fonctionne très bien et m'affiche les packets s
|
Derniers Blogs
CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT)CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT) par FREMYCOMPANY
Bonjour à tous, Je viens de publier une proposition comprenant 5 pseudo-classes pour le CSS Working Group ayant trait à l'état de chargement d'un élément (ex: IMG,VIDEO,AUDIO,OBJECT pour l'HTML.). Si le c½ur vous en dit, vous pouvez retrouver cette p...
Cliquez pour lire la suite de l'article par FREMYCOMPANY MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks [HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL[HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL par Pierrick CATRO-BROUILLET
Avec la sortie prochaine de la Beta Consumer Preview de Windows 8, j'avais envie de revenir sur une des fonctionnalités que j'attends le plus et que, en bon geek que je suis, j'utilise déjà : Hyper-V 3 ainsi son module PowerShell.
Il y a déjà pléthor...
Cliquez pour lire la suite de l'article par Pierrick CATRO-BROUILLET IIS7 - COMPRESSION GZIPIIS7 - COMPRESSION GZIP par cyril
La compression GZIP permet d'améliorer les performances de navigation en compressant ce qu'envoie le serveur à un client. Pour comprendre comment cela fonctionne, regardons ce qu'il se passe au niveau HTTP lorsqu'un client tente d'accéder à une ress...
Cliquez pour lire la suite de l'article par cyril
Forum
ARBRE BINAIREARBRE BINAIRE par pacotheking
Cliquez pour lire la suite par pacotheking
Logiciels
Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning Academy System (17.1.3.0)ACADEMY SYSTEM (17.1.3.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|