Доброго времени суток!
есть проблемочка: нужно заполнить поле данных в отправляемом icmp-сообщении с типом=3 и кодом=0 (впрочем код не важен). подскажите чем и как можно заполнить это поле? (язык 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);
|
|