#include #include #include #include #include #pragma comment(lib,"ws2_32.lib") #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) #define IP "192.168.0.3" //Ip de votre carte rezo void print_data(int datalen, char *data); typedef struct iphdr { 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 { unsigned short sport; unsigned short dport; unsigned int seqnum; unsigned int acknum; unsigned char DataOffset; unsigned char Flags; unsigned short Window; unsigned short Checksum; unsigned short UrgPointer; } TCP_HDR; void main() { printf("Welcome to the Real World, Ivanlef0u\n\n"); WSAData wsaData; SOCKET Sock; struct sockaddr_in SockAddr; DWORD BytesReturned; int I = 1; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("WSAStartup() failed.\n"); exit(-1); } Sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP); if (Sock == INVALID_SOCKET) { printf("socket() failed.\n"); exit(-1); } memset(&SockAddr, 0, sizeof(SockAddr)); SockAddr.sin_addr.s_addr = inet_addr(IP); SockAddr.sin_family = AF_INET; SockAddr.sin_port = 0; if (bind(Sock, (sockaddr *)&SockAddr, sizeof(SockAddr)) == SOCKET_ERROR) { printf("bind(%s) failed.\n", IP); exit(-1); } if (WSAIoctl(Sock, SIO_RCVALL, &I, sizeof(I), NULL, NULL, &BytesReturned, NULL, NULL) == SOCKET_ERROR) { printf("WSAIoctl() failed.\n"); exit(-1); } char RecvBuf[65535]={0}; while (1) { memset(RecvBuf,0,sizeof(RecvBuf)); recv(Sock,RecvBuf,sizeof(RecvBuf),0); IP_HDR *pIpHeader; TCP_HDR *pTcpHeader; pIpHeader=(IP_HDR *)RecvBuf; //Adresse du pointer ip est egal au debut de l'header IP pTcpHeader=(TCP_HDR *)(RecvBuf + sizeof(IP_HDR)); //Adresse du pointeur header TCP char sourceIP[16], destIP[16]; SOCKADDR_IN sasource, sadest; sasource.sin_addr.s_addr=pIpHeader->saddr; strncpy(sourceIP,inet_ntoa(sasource.sin_addr),16); sadest.sin_addr.s_addr=pIpHeader->daddr; strncpy(destIP,inet_ntoa(sadest.sin_addr),16); u_char protocol=pIpHeader->protocol; char proto[12]; switch(protocol) { case 0x1:strcpy(proto,"ICMP"); break; case 0x6: strcpy(proto,"TCP"); break; case 0x11 :strcpy(proto,"UDP"); break; default: strcpy(proto,"Inconnu"); break; } printf("Begin Packet\n"); printf("*******BEGIN IP HEADER*******\n"); printf("Source IP: %s\n",sourceIP); printf("Destination Ip: %s\n",destIP); printf("Protocol: %s\n",proto); printf("Time To Live: %d\n",pIpHeader->ttl); printf("*******END IP HEADER*******\n"); if(strcmp(proto,"TCP")==0) //Seulement si on a du TCP { char flags=pTcpHeader->Flags; char fin=1,syn=2,rst=4,psh=8,ack=0x10,urg=0x20; printf("*******BEGIN TCP HEADER*******\n"); printf("Source Port: %d\n",ntohs(pTcpHeader->sport)); printf("Destination Port: %d\n",ntohs(pTcpHeader->dport)); printf("Numero de sequence: %d\n",ntohl(pTcpHeader->seqnum)); printf("Numero d'acquittement: %d\n",ntohl(pTcpHeader->acknum)); printf("Champ fenetre: %d\n",ntohs(pTcpHeader->Window)); printf("Flags: %d\n",pTcpHeader->Flags); if (flags & fin) //fin printf("Fin\n"); if (flags & syn)//syn printf("Syn\n"); if(flags & rst) //rst printf("Rst\n"); if (flags & psh) //psh printf("Psh\n"); if (flags & ack) //ack printf("Ack\n"); if (flags & 0x20) //urg printf("Urg\n"); printf("*******END TCP HEADER*******\n"); int datalen; datalen=(ntohs(pIpHeader->tot_len)) - sizeof(IP_HDR) - sizeof(TCP_HDR); if(datalen>0) { printf("*******BEGIN DATAS*******\n"); u_char *data=(u_char *) RecvBuf + (sizeof(IP_HDR) + sizeof(TCP_HDR)); for (int i=0; i= 20) && (*(data+i) <= 127)) printf("%c",*(data+i)); else printf("."); } printf("*******END DATAS*******\n"); } } printf("End Packet\n\n"); } }