Отправка сырого пакета

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ntldr, 23 Feb 2010.

  1. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    PHP:
    struct sockaddr_in sin;

        
    sin.sin_family AF_INET;
        
    sin.sin_port htons(80);
        
    sin.sin_addr.s_addr inet_addr("192.168.0.100");
        
        
    char datagram[sizeof(ipheader)+sizeof(tcpheader)];
        
    ipheader *iph = (ipheader *)datagram;
        
    tcpheader *tcph = (tcpheader *)(datagram sizeof(ipheader));
        
    PS_HDR pseudo_header;

        
    memset(datagram0sizeof(datagram));

        
    iph->ip_hl         5;
        
    iph->ip_v         4;
        
    iph->ip_tos         0;
        
    iph->ip_len         sizeof(ipheader) + sizeof(tcpheader);
        
    iph->ip_id         rand();
        
    iph->ip_off         0;
        
    iph->ip_ttl         255;
        
    iph->ip_p         IPPROTO_TCP;
        
    iph->ip_sum         0;
        
    iph->ip_src         inet_addr("192.168.0.100");
        
    iph->ip_dst         sin.sin_addr.s_addr;

        
    tcph->th_sport     htons(getrandom(01500));
        
    tcph->th_dport     sin.sin_port;
        
    tcph->th_seq     rand();
        
    tcph->th_ack     0;
        
    tcph->th_x2         0;
        
    tcph->th_off     5;
        
    tcph->th_flags     TH_SYN;
        
    tcph->th_win     htons(512);
        
    tcph->th_sum     0;
        
    tcph->th_urp     0;

        
    pseudo_header.source_address  iph->ip_src;
        
    pseudo_header.dest_address      sin.sin_addr.s_addr;
        
    pseudo_header.placeholder      0;
        
    pseudo_header.protocol          IPPROTO_TCP;
        
    pseudo_header.tcp_length      htons(sizeof(tcpheader));

        
    memcpy((char*)&pseudo_header.tcptcphsizeof(tcpheader));
        
    iph->ip_sum  checksum((unsigned short *)&iphsizeof(ipheader));
        
    tcph->th_sum checksum((unsigned short *)&pseudo_headersizeof(pseudo_header));
     
        if (
    sendto(sdatagramsizeof(datagram), 0, (SOCKADDR *)&sinsizeof(sin)) == SOCKET_ERROR)
            return -
    1;
    в общем - пытаюсь отправить сырой SYN-пакет, но он не доходит, а сниффер пишет что адрес и порт отправки и назначения пустые. Адрес src И адрес сетевухи совпадают
     
  2. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    я не вижу слова socket
     
  3. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    ну я как бы убрал все лишнее тк работает как надо. ну вот то что перед этим

    PHP:
    int bOpt 1
    WSADATA asd;
    WSAStartup(MAKEWORD(2,2),&asd);
    SOCKET s socket(PF_INETSOCK_RAWIPPROTO_RAW);
    setsockopt(sIPPROTO_IPIP_HDRINCL, (char *)&bOptsizeof(bOpt))
     
  4. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Мб лучше pcap заюзать? )
     
  5. xa-xa89

    xa-xa89 Elder - Старейшина

    Joined:
    17 May 2008
    Messages:
    108
    Likes Received:
    27
    Reputations:
    2
    я может глупость скажу, но...
    memset(datagram, 0, sizeof(datagram));
    после этого с datagram ничего не произошло кроме как:
    sendto(s, datagram, sizeof(datagram), 0, (SOCKADDR *)&sin, sizeof(sin)
    соответственно оно отправляет все пустое(забитое нулями)
    или я чего-то не понял...
     
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Также не забывай, что винда не выпустит пакеты с поддельным адресом отправителя.
     
  7. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    ну да, вы не поняли :)
    PHP:
    ipheader *iph = (ipheader *)datagram
        
    tcpheader *tcph = (tcpheader *)(datagram sizeof(ipheader));
    этот код размечает эту строку на ip header и tcp header. Ну и сниффер показывает какую-то информацию в пакете

    2razb - pcap сложный, стоит не везде

    2slesh - проверил, совпадают
     
  8. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    [​IMG]

    сниффер показывает, как я понял, что эти данные как-то попали в тело пакета, а не в заголовок
     
  9. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,021
    Likes Received:
    1,200
    Reputations:
    327
    при использовании IP_HDRINCL да, но для udp.
    а для tcp эта опция запрещена вообще.

    поэтому решением является пикап =)

    а вообще, если хочется чегото "своего", то
    есть хороший пример из WDK - NDISPROT, для отправки вплоть до фальшивого исходного мак адреса вполне подойдет
     
    #9 sn0w, 25 Feb 2010
    Last edited: 25 Feb 2010
  10. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    мне кажется лишний sys за собой таскать не айс. Обойдусь connect() ;)