RAW Socket unter XP No Error



  • Hi

    Folgeder Code sollte ein Raw Socket unter XP (nicht SP2) erstellen.
    Er lässt sich mit gcc kompilieren, aber ich bekomme dann immer:

    sendto() No Error

    Und zwar bei:

    if(sendto(s, buffer, ntohs(ip->total_len ), 0, (struct sockaddr*)&to, sizeof(to))==-1){ 
            perror("sendto() error"); 
        }
    

    Und Paket wird keins verschickt! Was ist das Problem?

    // includes 
    #include <winsock2.h> 
    #include <ws2tcpip.h> 
    #include <windows.h> 
    #include <stdio.h> 
    
    // header 
    struct iphdr { 
        unsigned int    len:4; 
        unsigned int    ver:4; 
        unsigned char     tos; 
        unsigned short     total_len; 
        unsigned short     ident; 
        unsigned short     frag_and_flags; 
        unsigned char     ttl; 
        unsigned char     proto; 
        unsigned short     checksum; 
        unsigned int     sourceIP; 
        unsigned int     destIP; 
    }; 
    
    //Header TCP 
    struct tcphdr 
    { 
       unsigned short sport; 
       unsigned short dport; 
       unsigned int   seqnum; 
       unsigned int   acknum; 
       unsigned char  DataOffset; 
       unsigned char  Flags; 
       unsigned short Windows; 
       unsigned short Checksum; 
       unsigned short UrgPointer; 
    }; 
    
    // main entry 
    int main(int argc, char *argv[]) 
    { 
        // private 
        WSADATA             wsa;     
        int                 s; 
        unsigned int        on=1; 
        struct iphdr        *ip; 
        struct tcphdr       *tcp; 
        struct sockaddr_in  to; 
        struct in_addr      addr; 
        char                buffer[1024]; 
    
        // setup winsock 
        WSAStartup(MAKEWORD(2,2), &wsa); 
    
        // create socket 
        if((s = socket(AF_INET, SOCK_RAW, IPPROTO_TCP))==-1){ 
            printf("socket() error\n"); 
            return 0; 
        } 
    
        // set some options 
        if (setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char*)&on, sizeof(on)) == -1){ 
            printf("setsockopt() error\n"); 
            return -1; 
        } 
    
        // create header 
        ip = (struct iphdr*) buffer; 
        tcp = (struct tcphdr*) (buffer + sizeof(struct iphdr)); 
    
        memset(ip, 0, sizeof(struct iphdr)); 
        ip->ver      = 4; 
        ip->len      = 5; 
        ip->total_len    = htons(sizeof(struct iphdr) + sizeof(struct tcphdr)); 
        ip->ident        = 2; 
        ip->ttl          = 255; 
        ip->proto        = IPPROTO_TCP; 
        ip->sourceIP = inet_addr("192.168.1.11"); 
        ip->destIP       = inet_addr("192.168.1.12"); 
    
        memset(tcp, 0, sizeof(struct tcphdr)); 
        tcp->sport = htons(1024); 
        tcp->dport = htons(54321); 
        tcp->seqnum  = 2; 
        tcp->DataOffset  = 5; 
        tcp->acknum  = 1; 
        tcp->Windows = htons(65535); 
    
        to.sin_addr.S_un.S_addr  = ip->destIP; 
        to.sin_family = AF_INET; 
        to.sin_port = tcp->dport; 
    
        printf("Ziel: %s:%i\n", inet_ntoa(to.sin_addr), ntohs(tcp->dport )); 
        addr.s_addr = ip->sourceIP ; 
        printf("Quelle: %s:%i\n", inet_ntoa(addr), ntohs(tcp->sport )); 
    
        if(sendto(s, buffer, ntohs(ip->total_len ), 0, (struct sockaddr*)&to, sizeof(to))==-1){ 
            perror("sendto() error"); 
        } 
    
        // quit 
        getchar(); 
        return 0; 
    }
    


  • Ich habe jetzt hier IPPROTO_TCP in RAW gewechselt... Es kommt kein Error...
    allerdings stimmt der TCP Header jetzt nie, die länge Beträgt 0 Byte....

    // create socket 
        if((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW))==-1){ 
            printf("socket() error\n"); 
            return 0; 
        }
    

Anmelden zum Antworten