Port-Scanner nach Buch.



  • Hallöle und Grüezi wohl

    Ich bin gerade mit dem Buch: ISBN 978-3-8348-0378-8, dabei zu lernen wie man sich "steckdosen" Bastelt und damit umgeht. 🙂

    Ich habe gerade das beispiel durch "Port-Scanner, sprich, schauen ob offene ports existieren.

    Hier folgender Quellcode:

    #include <sys/socket.h>
    #include <sys/types.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    
    int main(int argc, char *argv[]){
    
        if (argc != 4){
            fprintf(stderr, "Ussage: %s <ip> <start_port> <end_port>", argv[0]);
            return 1;
        }
    
        unsigned short start_port = atoi(argv[2]);
        unsigned short end_port   = atoi(argv[3]);
        char *ip;
        ip = argv[1];
        int socket_nr, result, addr_size;
        struct sockaddr_in localhorst;
    
        for (; start_port <= end_port; start_port++){
            socket_nr = socket(AF_INET, SOCK_STREAM, 0);
            localhorst.sin_family    = AF_INET;
            inet_pton(AF_INET, ip,&localhorst.sin_addr.s_addr);
            localhorst.sin_port      = htons(start_port);
            memset(&(localhorst.sin_zero),
            addr_size = sizeof(localhorst);
    
            result = connect(socket_nr, (struct sockaddr *)&localhorst, addr_size);
    
            if (result == 0){
                printf("\n%s auf port: %d verbunden.", ip, start_port);
            }
            close(socket_nr);
        }
        printf("\n\n");
        return 0;
    }
    

    Das scheint aber nur gerade in meinem Lan zu gehen, sprich auf meinen eigenen PC "127.0.0,1" und die anderen im Lan "192.168.0.xxx", Ich habe einen Freund gefragt ob ich es mal auf seinen Server testen kann, er sagte ja, aber dabei stellte ich fest, das geht irgendwie nicht.

    Muss ich da evtl. eine art "socket.timeout" konstruieren ?
    Es geht mir sicherlich nicht darum, auf fremde IP's lozuschnüffeln, aber ich möchte doch gerne wissen, was bei meinem programm falsch läuft, es geht mir hier wirklich nur ums lernen.

    Happy greetings und bon nuit 🙂



  • ...



  • Es geht nicht, beudetet soviel wie, das programm startet, es pasiert aber rein gar nichts, im gegenzug, ist es eine IP im Lan, geht es reibungslos.

    Hmm an den Router und co. habe ich auch gedacht, aber habe es mal in Python geschrieben und da funktioniert es, da kann ich die Ip des Servers meines kollegen nehmen und nach offenen ports suchen. Also mit C geht es nicht, mit Python geht es, d.h. da muss doch irgendwie ein fehler sein ?

    Grüsse



  • So auf den ersten Blick sieht das hier komisch aus.

    memset(&(localhorst.sin_zero),
            addr_size = sizeof(localhorst);
    

    Prüf mal noch die Rückgabewerte der einzelnen Systemaufrufe.



  • Mein memset bei sowas sieht folgendermaßen aus
    memset(&(serv_addr.sin_zero), '\0', 8); // zero the rest of the struct

    und das funktioniert auch übers Lan hinaus. Hab ich aus beejs tutorial für Netzwerkprogrammierung abgekupfert.



  • wie wärs mit einer vernünftigen initialisierung?

    struct sockaddr_in localhorst = {0}; // alle struct member 0 setzen
    

    memset braucht man nicht.



  • memset(&(serv_addr.sin_zero), '\0', 8); // zero the rest of the struct
    

    Sowas ist nicht zu empfehlen, da die Größe des zu initialisierenden Structs nicht immer eaxkt 8 Bytes betragen muss. Gegenbeispiel aus meiner ws2def.h:

    typedef struct sockaddr_in {
    
    #if(_WIN32_WINNT < 0x0600)
        short   sin_family;    
    #else //(_WIN32_WINNT < 0x0600)
        ADDRESS_FAMILY sin_family;
    #endif //(_WIN32_WINNT < 0x0600)
    
        USHORT sin_port;
        IN_ADDR sin_addr;
        CHAR sin_zero[8];
    } SOCKADDR_IN, *PSOCKADDR_IN;
    

    Andere Windows Version, andere Größe von SOCKADDR_IN. ⚠



  • memset(&localhorst, 0, sizeof(localhorst));
    
    localhorst.sin_family    = AF_INET;
    // usw.
    

    Im übrigen hast Horst nichts mit Host gemeinsam...



  • hhhhhhhhhhhj schrieb:

    memset(&localhorst, 0, sizeof(localhorst));
    
    localhorst.sin_family    = AF_INET;
    // usw.
    

    Im übrigen hast Horst nichts mit Host gemeinsam...

    Falsch.
    Gemeinsamkeiten: 'H','o', 's', 't', außer das 'r'.
    Noch Fragen?



  • initialisator schrieb:

    wie wärs mit einer vernünftigen initialisierung?

    struct sockaddr_in localhorst = {0}; // alle struct member 0 setzen
    

    memset braucht man nicht.

    1+ 👍

    @TE

    Das ist wohl die mieseste scann Technik (full TCP connect)...damit stehst du auch sicher in den logs. Aber bist ja noch Anfänger...ok


Anmelden zum Antworten