Windows Portscanner C++
-
Hallo.
Ich wollte mal einen Portscanner für Windows programmieren.
Leider streikt mein Debugger.
Ich glaube es liegt daran das der Socket nicht richtig beendet wird.
Ich programmier sonst eigentlich immer unter Linux, deswegen kann ich mir nicht weiter helfen.
Ich hoffe ihr könnt es.
#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(1, 1), &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,0); addr.sin_port = htons(port); if(!connect(s, reinterpret_cast<sockaddr*>(&addr), sizeof(sockaddr))) cout << "Verbindung an Port " << port << " erfolgreich" << endl; closesocket(s); } return 0; }Achso ich benutz "QT-Konsolenanwendung C++" als Programmierumgebung.

-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Was ist denn das Problem?
-
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 tosocket@12´ undefined reference tohtons@4´
undefined reference toconnect@12´ undefined reference toclosesocket@4´
collect2: Idreturned 1 exists statusleider 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).aspxZitat:
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"