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?