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

Тема в разделе "C/C++/C#", создана пользователем keepergf, 18 май 2013.

  1. keepergf

    keepergf New Member

    Регистрация:
    18 май 2013
    Сообщения:
    1
    Симпатии:
    0
    есть проблемочка: нужно заполнить поле данных в отправляемом 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);
     
Загрузка...
Похожие Темы - Генерация Icmp сообщения
  1. lmike
    Ответов:
    3
    Просмотров:
    633
  2. framd
    Ответов:
    1
    Просмотров:
    782
  3. DamirAstana
    Ответов:
    11
    Просмотров:
    1.874
  4. Kee_Keekkenen
    Ответов:
    1
    Просмотров:
    1.293
  5. vladis222
    Ответов:
    11
    Просмотров:
    2.554

Поделиться этой страницей