Bonjour;
j'ai écrit un programme qui permet d'envoyer des paquets ip à une destination.
mais quand j'ai voulu le sniffer j'ai pas pu le capter.
J'ai besoin d'envoyer des paquets ip en utilisant le protocole icmp.
voci mon code:
#pragma comment(lib, "ws2_32.lib")
#include <winsock2.h>
struct ethernet
{
u_char ether_dhost[6];
u_char ether_shost[6];
u_short ether_type;
};
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 icmphdr
{
unsigned char type;
unsigned char code;
unsigned short checksum;
unsigned short id;
unsigned short seq;
unsigned long timestamp;
} ICMP_HDR;
WSADATA wsa;
WSAStartup(MAKEWORD(2,0x0),&wsa);
int optval;
SOCKET sock=WSASocket(AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, 0,0);
setsockopt(sock, IPPROTO_IP, 2, (char *)&optval, sizeof(optval));
SOCKADDR_IN sin;
char packet[8192];
iphdr *ip=(iphdr*)packet;
icmphdr *icmp=(icmphdr*)(packet+sizeof(struct iphdr));
ip->verlen=69;
ip->tos=0;
ip->id=1;
ip->offset=0;
ip->ttl=(unsigned char)255;
ip->protocol=(unsigned char)1;
UpdateData(TRUE);
ip->saddr=inet_addr(m_ipsource); //remplacez par votre ip...
ip->daddr=inet_addr(m_ipdestination); //remplacez par le pc à pinger, google par ex...
ip->checksum =0;
//ip->checksum=in_cksum((unsigned short *)ip, sizeof(struct iphdr));
icmp->id=2;
icmp->type=(unsigned char)8;
icmp->code=(unsigned char)0;
icmp->checksum=0;
//icmp->checksum=in_cksum((unsigned short *)icmp, sizeof(struct icmphdr));
ip->tot_len=htons(sizeof(struct iphdr)+sizeof(struct icmphdr));
sin.sin_family=AF_INET;
sendto(sock,packet,sizeof(struct iphdr)+sizeof(struct icmphdr),0,(SOCKADDR*)&sin,sizeof(sin));
ce code normalement doit envoyer une commande ping