Генерация Icmp-сообщения (winpcap)

keepergf

New member
18.05.2013
1
0
#1
есть проблемочка: нужно заполнить поле данных в отправляемом icmp-сообщении с типом=3 и кодом=0 (впрочем код не важен). подскажите чем и как можно заполнить это поле? (язык c++)

C++:
typedef struct ethernet_header
{
UCHAR dest[6];
UCHAR source[6];
USHORT type;
}  ETHER_HDR , *PETHER_HDR , FAR * LPETHER_HDR , ETHERHeader;

typedef struct ip_hdr
{
unsigned char ip_header_len:4; 
unsigned char ip_version :4;
unsigned char ip_tos; 
unsigned short ip_total_length;
unsigned short ip_id;

unsigned char ip_frag_offset :5;

unsigned char ip_more_fragment :1;
unsigned char ip_dont_fragment :1;
unsigned char ip_reserved_zero :1;

unsigned char ip_frag_offset1; 

unsigned char ip_ttl; 
unsigned char ip_protocol; 
unsigned short ip_checksum; 
unsigned int ip_srcaddr; 
unsigned int ip_destaddr; 
} IPV4_HDR;

typedef struct icmp_hdr
{
BYTE type; 
BYTE code; 
USHORT checksum;
USHORT id;
USHORT seq;
} ICMP_HDR;



int SizeData = DefDataType(type);
int sizePack = sizeof(ETHER_HDR) + sizeof(IPV4_HDR) + sizeof(ICMP_HDR)+ SizeData;
u_char *packet = new u_char[sizePack];
ETHER_HDR *ethr= (ETHER_HDR *)packet;
IPV4_HDR *ip_hdr = (IPV4_HDR *)(packet + sizeof(ETHER_HDR));
ICMP_HDR *icmp_hdr = (ICMP_HDR *)(packet + sizeof(IPV4_HDR) + sizeof(ETHER_HDR));
memset(packet, 0, sizePack);

/*set mac source*/
ethr->source[k] = ethhdr->dest[k];

/*set mac destination*/
ethr->dest[k] = ethhdr->source[k];

ethr->type = htons(0x0800);

ip_hdr->ip_header_len = 5;
ip_hdr->ip_version = 4;
ip_hdr->ip_tos = 0;
ip_hdr->ip_total_length = ntohs(28 + (u_short)SizeData); 
ip_hdr->ip_id = GetCurrentProcessId() + seqid;
ip_hdr->ip_frag_offset = 0;
ip_hdr->ip_ttl = 128;
ip_hdr->ip_protocol = 1;

/* set IP address destination*/
ip_hdr->ip_destaddr = iphdr->ip_srcaddr;

/*set IP address source*/
ip_hdr->ip_srcaddr = iphdr->ip_destaddr;

ip_hdr->ip_checksum = in_cksum((unsigned short *)ip_hdr, sizeof(IPV4_HDR));

/* set ICMP type and code*/
icmp_hdr->type = type;
icmp_hdr->code = code;

icmp_hdr->id = icmphdr->id;
icmp_hdr->seq = icmphdr->seq;
seqid += 0x0100;//++

UCHAR *data = (UCHAR *)(packet + sizeof(IPV4_HDR) + sizeof(ETHER_HDR) + sizeof(ICMP_HDR));

//вот тут надо как-то заполнить data. (тип 3. код 0. и wireshark или ping корректно воспринимали этот ответ)

icmp_hdr->checksum = in_cksum((unsigned short*)(packet+ sizeof(IPV4_HDR) + sizeof(ETHER_HDR)), sizeof(ICMP_HDR) +			
DefDataType(type));

pcap_sendpacket(fp, packet, sizePack);