der tcp_header in den send_buf reinfummeln?



  • hallo,
    der Code habe ich compiliert, er geht.

    1.Ich fülle den ip_header, aber wie kommt er in den Buffer.

    2.Frage:

    Es gibt Portscanner die nutzen einmal:
    tcp_header->th_win
    ...und einmal...
    tcp_header->window
    ...Woher weis der Compiler, was der Progger meint?

    int send_packet(int socket,
                   struct sockaddr_in *target_addr,
                   struct sockaddr_in *your_addr,
                   unsigned char session_flags,unsigned long sequence)
    {
        struct iphdr        *ip_header;
        struct tcphdr       *tcp_header;
        struct pseudohdr    *pseudo_header;
        char                send_buf[40];
        int                 send_length;
        int                 sent_length;
    
        memset(send_buf,0,40);
        ip_header     = (struct iphdr *)send_buf;
        tcp_header    = (struct tcphdr *)(send_buf+sizeof(struct iphdr));
        pseudo_header = (struct pseudohdr *)((char*)tcp_header-sizeof(struct pseudohdr));
    
        pseudo_header->saddr     = your_addr->sin_addr.s_addr;
        pseudo_header->daddr     = target_addr->sin_addr.s_addr;
        pseudo_header->protocol  = IPPROTO_TCP;   
        pseudo_header->tcplength = htons(sizeof(struct tcphdr)); 
    
        tcp_header->th_sport = your_addr->sin_port;
        tcp_header->th_dport = target_addr->sin_port;
        tcp_header->th_off   = 5;
        tcp_header->th_flags = session_flags;
        tcp_header->th_seq   = htonl(sequence);
        tcp_header->th_ack   = htonl(0);
        tcp_header->th_win   = htons(512);
        tcp_header->th_sum   = in_cksum((u_short *)pseudo_header,sizeof(struct pseudohdr)+sizeof(struct tcphdr));
    
        memset(send_buf,0,sizeof(struct iphdr));
    
    ////////////////////////////////ip_header füllen /////////////////////////////////
    
        ip_header->saddr    = your_addr->sin_addr.s_addr;
        ip_header->daddr    = target_addr->sin_addr.s_addr;
        ip_header->version  = 4;
        ip_header->ihl      = 5;
        ip_header->ttl      = 255;
        ip_header->id       = rand()%0xffff;
        ip_header->protocol = IPPROTO_TCP;
        ip_header->tot_len  = htons(sizeof(struct iphdr)+sizeof(struct tcphdr));
        ip_header->check    = in_cksum((u_short *)ip_header,sizeof(struct iphdr));
    
    ////////////////////////////ip_heade ist gefüllt /////////////////////////////////
    
        send_length=sizeof(struct iphdr)+sizeof(struct tcphdr);
        sent_length=sendto(socket,send_buf,send_length,0,
                           (struct sockaddr *)target_addr,sizeof(struct sockaddr));
        if (send_length != sent_length) return -1;
        else return 0;
    }
    


  • Hallo,

    zu 1.: der ist schon im Buffer, auf die gleiche Weise wurde auch die "Verbindung" von ip_header mit dem Buffer hergestellt 😉

    zu 2.: es gibt zwei "Arten" der Struktur, die sich im wesentlichen nur in der Namensgebung unterscheiden, welche genommen wird, wird über ein #define gesteuert, siehe z.B. hier:

    http://en.wikipedia.org/wiki/Tcphdr

    MfG,

    Probe-Nutzer


Anmelden zum Antworten