versuch Portscanner



  • Hallo,
    ich wollte wissen warum mein Portscanner so langsamm ist 😛
    ich weiß das der code nicht sehr gut ist aber bitte helft mir mal...

    hier der hauptteil

    SOCKADDR_IN addr;
    
      char ip[100];
    
      system("color 0c");
      cout << "Port Scanner!\nEnter the IP:";
      cin >>ip;
    
      cout<<"\n\n\nStart!!!\n\n";
    
      Sleep(500);
    
    while(1)
    {
      // Winsock starten
      rca=startWinsock();
    
      // Socket erstellen
      sa=socket(AF_INET,SOCK_STREAM,0);
    
      // Verbinden
      memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
      addr.sin_family=AF_INET;
      addr.sin_port=htons(port); // wir verwenden mal port 12345
      if (getIPAdress (ip, &addr) == SOCKET_ERROR) { 
    	  cout<<"\nIP ist nicht online!\n";
      }
    
        rca=connect(sa,(SOCKADDR*)&addr,sizeof(SOCKADDR));
        if(rca==SOCKET_ERROR)
        cout<<"Port: "<<port<<" is not open!\n";
    
    	else 
    	{
    	cout<<"Port: "<<port<<" is OPEN!\n";
    	ofstream pp("Open Port list.txt",ios_base::app);
    	pp<<"Port: "<<port<<" is OPEN!\n";
    	pp.close();
    	}
    
      closesocket(sa);
      WSACleanup();
    
      port++;
      if(port==10000)
    	  break;
      }
    

    ihr könnt ihn verändern wie ihr wollt 😛



  • Da abhängig von der Bandbreite ein TCP-Handshake unterschiedlich lang dauern kann, wartet connect() eine Weile bis es annimmt, dass keine Verbindung hergestellt werden kann.

    Eine Möglichkeit das zu Beschleunigen ist Parallelisierung, also durch mehrere Threads gleichzeitig mehrere Ports zu testen.

    Man könnte allerdings auch Raw Sockets verwenden (das Programm muss dann mit administrativen Rechten laufen) und den Handshake selber implementieren, dann lässt sich das ganze auch in einem Thread asynchron realisieren.
    Außerdem kann man den Handshake so unvollständig lassen (man lässt das letzte ACK Paket weg), dann wird der Versuch auch nicht geloggt, weil nie eine volle Verbindung zu Stande kommt. Man weiß aber, dass der Port offen ist 🙂

    Ich weiß nicht ob, das irgendwie geht, aber ich denke man könnte auch den timeout über irgendwelche Optionen ändern, sodass connect() schneller zurückkehrt. Das ist aber bei geringe Bandbreite wieder schlecht, da so langsame Verbindungen fälschlicherweise als geschlossene Ports interpretiert werden könnten.

    MfG DrakoXP



  • Cool danke dann verusch ich es aber mal mit mehreren theads 😛



  • eine sache gibt es noch ich wollte es jetzt so machen 😛

    for(int i=0;i==10000;i++)
    {
    CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)scanner, NULL, NULL,0);
    Sleep(200);
    port++;
    }

    (scanner ist dann das er jeden port einzelnd duchgeht)

    aber das wird geblocked 😛
    warum?



  • und an welcher Stelle im Code erfährt dein Thread, welchen Port er testen soll?


Anmelden zum Antworten