Windows Portscanner C++



  • 1. Wenn du winsock2.h nimmst dann übergib doch auch eine Version 2.x an WSAStartup()
    2. Übergib anstatt "0" doch IPPROTO_TCP (an Funktion socket())
    3. Übergib der Funktion "connect" doch sizeof(addr)

    4. Leider kann ich nur meckern, weiterhelfen wird das wohl nicht.. aber vielleicht kann dir ja geholfen werden wenn Du noch mal schreibst WAS GENAU dein Problem ist 😃 (Was passiert / was sollte passieren)



  • naja der debugger gibt aus

    undefined reference to WSAStartup@8´ undefined reference toinet_addr@4´
    undefined reference to socket@12´ undefined reference tohtons@4´
    undefined reference to connect@12´ undefined reference toclosesocket@4´
    collect2: Idreturned 1 exists status

    leider erstellt er nichteimal ne exe
    wegen diesen fehlermeldungen



  • Ich behaupte mal das sagt schon der Compiler/Linker und nicht der Debugger.
    Die winsock-Lib ist vermutlich nicht eingebunden. (VC-Compiler: "ws2_32.lib", MingW, etc. meist "libws2_32.a")
    Wie man das konkret einbindet hängt vom Compiler/IDE ab...



  • 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;
    }
    

Anmelden zum Antworten