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

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(datagram, 0, sizeof(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(0, 1500));
        
    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.tcp, tcph, sizeof(tcpheader));
        
    iph->ip_sum  = checksum((unsigned short *)&iph, sizeof(ipheader));
        
    tcph->th_sum = checksum((unsigned short *)&pseudo_header, sizeof(pseudo_header));
     
        if (
    sendto(s, datagram, sizeof(datagram), 0, (SOCKADDR *)&sin, sizeof(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_INET, SOCK_RAW, IPPROTO_RAW);
    setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&bOpt, sizeof(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() ;)