Sniffer tcp avec les raw sockets

Soyez le premier à donner votre avis sur cette source.

Vue 20 386 fois - Téléchargée 1 299 fois

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-with-raw-sockets.html

Voilà :).

Source / Exemple :


#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; }

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

il sniff IP et TCP, ping = ICMP ...
phen0x
Messages postés
1
Date d'inscription
mardi 3 avril 2007
Statut
Membre
Dernière intervention
25 août 2011
-
Perso chez moi ça n'intercepte pas tous les paquets sortants. Seulement les broadcast, si je fais un "ping diskstation" par exemple.
Une idée pourquoi?
RadTCP
Messages postés
3
Date d'inscription
vendredi 20 mai 2011
Statut
Membre
Dernière intervention
20 mai 2011
-
Salut !
Actuellement, je vais développer un proxy TCP qui intercepte les paquets TCP provenant de la couche Transport et les mets dans un cache pour les retransmettre par la suite en cas de perte ou altération. Pour le faire, je me demande est ce que je pourrais utiliser ce code pour le cas de mon programme car je ne sais vraiment pas par ou commencer? est ce que quelqu'un peut me diriger sur ça SVP?
cs_omnia
Messages postés
240
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
22 mars 2009
-
Bon c vrais on peut récupéré les trames émises aussi je confond :p

c'est dans le cas de génération de trames qu'il faut utiliser un driver :p

bonne journée :)
cs_omnia
Messages postés
240
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
22 mars 2009
-
bonjours,

bon bah un test tout simple on capture le réseau, et essayez de vous connectez a une page web.

voyez vous la requête GET de votre machine ?

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.