Windows Portscanner C++



  • danke es hat funktioniert 👍

    PS.: meinte compiler bzw linker

    leider hab ich noch ein problem

    das program liefert mir immer einen rückgabewert 0 und stützt ab
    ich verwende diesen code

    #include <QtCore/QCoreApplication>
    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
    #include <windows.h>
    #include <winsock2.h>
    #include <string>
    #include <unistd.h>
    
    using namespace std;
    
    int main()
    {
        WSADATA wsa;
                if (WSAStartup(MAKEWORD(2, 0), &wsa))
                {
                    printf("WSAStartup() failed, %lu\n", (unsigned long)GetLastError());
                    return EXIT_FAILURE;
                }
    
        string ip;
        cout << "IP Adresse:";
        cin >> ip;
        struct sockaddr_in addr;
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = inet_addr(ip.c_str());
        for (int port = 1 ; port<65000; ++port )
        {
            int s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
            addr.sin_port = htons(port);
    
            if(!connect(s, reinterpret_cast<sockaddr*>(&addr), sizeof(addr)))
            {
              cout << "Verbindung an Port " << port << " erfolgreich" << endl;
            }
                 closesocket(s);
                 WSACleanup ();
        }
    return 0;
    }
    


  • Spontan fällt auf dass dein WSACleanup an der falschen Stelle sitzt (sollte erst nach der for-Schleife kommen)

    Bemühe mal deinen Debugger um rauszufinden in welcher Zeile er abschmiert 😉



  • Hmm dass ist ja ein total nutzloser weg es zu machen da connect() bei default auf "blocking" gestellt ist.

    mit WSAIoctl() socket auf nicht blockierend schalten?

    msdn -> winsock2 reference.



  • Ok und wie stell ich den socket auf nicht blocken?
    😕



  • connect ist nicht auf blocking gestellt.



  • Belli schrieb:

    connect ist nicht auf blocking gestellt.

    Also so wie das da steht ist connect blockierend.

    @TE
    Es ist nicht wirklich sinnvoll den Socket auf nicht-blockierend zu stellen da hier gerne mal offene Ports übersehen werden. Andererseits dauert es so ziemlich lange. Die Lösung: Threads.
    Teile den Port Bereich also in x (10 - 100? muss man testen) Teile und lasse jeden von einem eigenen Thread überprüfen.



  • Nö, connect ist nicht blockierend. Der Socket ist blockierend, aber connect blockiert trotzdem nicht, sondern kehrt mit einem Fehlercode zurück, wenn es fehlschlägt:
    http://msdn.microsoft.com/en-us/library/ms737625(v=vs.85).aspx

    Zitat:
    On a blocking socket, the return value indicates success or failure of the connection attempt.



  • also er gibt mir schonmal nicht mehr den Rückgabewert 0 aus

    findet aber keine offenen ports bzw. macht nix



  • Belli schrieb:

    Zitat:
    On a blocking socket, the return value indicates success or failure of the connection attempt.

    ...und das kann mehrere Sekunden dauern bis die Funktion returned (bei blocking sockets)

    @luggas: Bau dir mal noch mehr Ausgaben rein, aka "Verbinden mit %Port%", "Port geschlossen: %Port%" und warte mal ne Weile.
    connect() kann ziemlich lange brauchen um festzustellen dass da nix reagiert...



  • also ich hab jetzt diesen code hier und er sagt immer fehlgeschlagen

    #include <QtCore/QCoreApplication>
    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
    #include <windows.h>
    #include <winsock2.h>
    #include <string>
    #include <unistd.h>
    #include <conio.h>
    
    using namespace std;
    
    int main()
    {
        WSADATA wsa;
                if (WSAStartup(MAKEWORD(2, 0), &wsa))
                {
                    printf("WSAStartup() failed, %lu\n", (unsigned long)GetLastError());
                    return EXIT_FAILURE;
                }
    
        string ip;
        cout << "IP Adresse:";
        cin >> ip;
        int i;
        int j;
        cout << "Von Port: ";
        cin >> j;
        cout << "Bis Port: ";
        cin >> i;
        struct sockaddr_in addr;
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = inet_addr(ip.c_str());
        for (int port = j ; port<=i; ++port )
        {
            int s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
            addr.sin_port = htons(port);
    
            if(!connect(s, reinterpret_cast<sockaddr*>(&addr), sizeof(addr)))
              cout << "Verbindung an Port " << port << " erfolgreich" << endl;
            else
                cout << "Verbindung an Port " << port << " fehlgeschlagen" << endl;
            closesocket(s);
        }
        getch();
    WSACleanup ();
    return 0;
    }
    

    ich hab grad mal meine linux v-box gescannt und da war einer erfolgreich

    aber warum geht das bei windows nicht?



  • Welche Ports scannst du denn? 😃
    (Bin mir gerade nicht mehr ganz sicher aber ich glaube nicht dass man bei jedem Schleifendurchlauf einen neuen socket erstellen muss.)



  • Wie schlecht manche Leute doch meinen Code kopieren.



  • ja sry ich will das alles irgendwie verstehn und deswegen nehm ich deinen code

    ich scann von 1 bis 100 alles aber es schlägt alles fehl



  • Von 1-100 aber welche IP? Sollten die Ports denn überhaupt offen sein?



  • na ich scann mich selbst^^ zu test zwecken als in meinem netzwerk "192.168.178.22"



  • Hast du denn überhaupt Programme offen die auf Port 1-100 lauschen?



  • Genau das ist die Frage - wo nichts lauscht da sollte auch kein Port ansprechbar sein! Am besten du startest einfach einen simplen Server: (ungetestet - wenn da was nicht geht frag einfach kurz 😉 )

    int main()
    {
      int sock, acc_sock;
      struct sockaddr_in addr;
      int addr_size;
      WSADATA wsadata;
    
      if (WSAStartup(MAKEWORD(2,2), &wsadata) != 0)
        printf("WSAStartup() failed with error: %i.\n", WSAGetLastError());
    
      while (1)
      {
        sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (sock == INVALID_SOCKET)
          printf("socket() failed with %i.\n", WSAGetLastError());
    
        memset(&addr, 0, sizeof(addr));
        addr.sin_addr.s_addr = INADDR_ANY;
        addr.sin_family = AF_INET;
        addr.sin_port = 2500;
        addr_size = sizeof(addr);
    
        if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR)
          printf("bind() failed with %i.\n", WSAGetLastError());
    
        if (listen(sock, 3) == SOCKET_ERROR)
          printf("listen() failed with %i.\n", WSAGetLastError());
    
        if (accept(sock, (struct sockaddr*)&addr, &addr_size) == INVALID_SOCKET)
          printf("accept() failed with %i.\n", WSAGetLastError());
    
        printf("client connected<!>\n");
        closesocket(sock);
      }
      WSACleanup();
      return 0;
    }
    


  • mit WSAIoctl, habe ich doch da hingeschrieben. giyf



  • ok ich hab jetzt mal probiert den server selbst zu programmieren

    ich wollt mal fragen ob das so geht

    #include <QtCore/QCoreApplication>
    #include <windows.h>
    #include <winsock2.h>
    #include <unistd.h>
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <conio.h>
    
    using namespace std;
    
    int main()
    {
    
        WSAData wsa;
        if(WSAStartup(MAKEWORD(2,2),&wsa)!=0)
        {
            printf("WSAStartup() failed with error: %i.\n", WSAGetLastError());
            return 1;
        }
        cout << "Bitte Warten!";
        while (1)
        {
    
        int s = socket(AF_INET,SOCK_STREAM,0);
        int addr_size;
    
        struct sockaddr_in addr;
        addr.sin_addr.s_addr = INADDR_ANY;
        addr.sin_family = AF_INET;
        addr.sin_port = 21;
        addr_size = sizeof(addr);
    
        if (bind(s,(struct sockaddr*)&addr,sizeof(addr))==-1)
        {
            perror("bind() failed");
                    return 2;
    
        }
        if (listen(s,3)==-1)
        {
            perror("listen() failed");
            return 3;
        }
    
        if (accept(s,(struct sockaddr*) &addr, &addr_size)==-1)
        {
            perror("accept() failed");
                    return 4;
        }
    
        printf("client connected<!>\n");
        getch();
        closesocket(s);
    
        }
        WSACleanup();
        return 0;
    }
    

    ach ja und der compiler sagt mir bei dem code das bei accept was nicht stimmt

    😋


Anmelden zum Antworten