Sockets



  • Sers,
    Ich versuche hier eine Anfrage an meinen PC mit gefälschtem IP-Header zu machen.
    Ich hab das von einem Quelltext für Linux. Hab es auch Linux richtig compiliert bekommen (schon ne Weile her...)

    Für Windows bekomm ich es auch compiliert aber es läuft nicht wie ich will.
    Hier der Code:

    // 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, (sockaddr*)&to, sizeof(to))==-1){
            perror("sendto() error");
        }
    
        // quit
        getchar();
        return 0;
    }
    

    Bei sendto() bekomm ich diesen Fehler:

    sendto() error: no error
    

    Mmhh.
    Naja vielleicht kann mir ja jemand helfen. Vielleicht auch jemand aus der Linuxecke...

    cu para
    😃



  • hi

    ich bekomme diesen Code gar nicht erst kompiliert immer diese errors, hat jemand ne ahnung?

    http://home.tiscalinet.ch/teuffenthal/Different/das.bmp

    sorry das ich immer so komische sachen frage, aber bin neu in C, vorher nur vb



  • Versuch's mal mit SOCKADDR* (also in Großbuchstaben) - evtl. ist auch dein PSDK zu alt 🙄
    Und poste doch bitte das nächste mal direkt die Fehlermeldungen und nicht als Bild (und schon gar nicht als BMP 👎 )



  • Hatte ein bisschen stress beim uploaden ➡
    werde es morgen testen.



  • Hi habe ihn jetzt compiliert 😃 aber bekomme beim ausführen immer dieser error:
    setsockopt<> error

    hat jemand ne idee könnte es an win98 liegen 😕 ?



  • Hallo,

    die Kombination IPPROTO_IP/IP_HDRINCL wird für Win98 nicht unterstützt, siehe hier

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/ipproto_ip_socket_options.asp

    MfG



  • hi danke gibt es irgendein anderer weg das gleichwohl zum laufen zu bringen, oder ein patch oder so etwas für win98? 🙄



  • mit http://winpcap.polito.it/ kannst du auch unter win9x pakete komplett selbst bauen und versenden



  • ich habe es installiert, aber es funzt leider immer noch nicht! 😞



  • sry bin dumm, muss natürlich etwas komplett neues schreiben mit winpcap, aber ich fand in den docs gerade nicht was flags senden kann, hat noch jemand ideen?

    gb


Anmelden zum Antworten