armerAzubi Geschrieben 7. November 2001 Geschrieben 7. November 2001 Meine Frage: kann mir einer die genaueren funktionen des progs erklären? wie kann ich den zugriff auf die ports beschleunigen? #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <iostream.h> #include <stdio.h> #include <winsock2.h> char oports; int portanzahl; int main() { WSADATA wsaData; WSAStartup(MAKEWORD(2,0), &wsaData); printf("***** Simple Portscanner v. 1.0 © 2001 by binarix *****\n\n"); printf("Sie koennen den Scanvorgang mit STRG+C abbrechen!\n\n\n"); char hostname[128]; printf("Geben Sie eine IP ein: "); gets(hostname); hostent *he = gethostbyname(hostname); cout << "Scanne von 1 bis "; cin >> portanzahl; sockaddr_in sa; sa.sin_family = AF_INET; CopyMemory(&sa.sin_addr, he->h_addr_list[0], sizeof in_addr); SOCKET s; for (int i = 0; i < portanzahl; i++) { s = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 0, 0); sa.sin_port = htons(i); printf("\nScanne Port %i...", i); if (connect(s, (sockaddr *)&sa, sizeof sockaddr_in) != SOCKET_ERROR) { printf("OFFEN!", i); oports=oports + i; shutdown(s, SD_BOTH); } closesocket(s); } WSACleanup(); cout << "Scannen beendet!"; return 0; } Zitieren
Klotzkopp Geschrieben 7. November 2001 Geschrieben 7. November 2001 Das Programm geht in einer Schleife durch alle Portnummern von 1 bis zur angegebenen und versucht, eine TCP-Verbindung zum Zielrechner auf diesem Port aufzubauen. Falls es klappt (auf dem Zielrechner hat jemand auf diesem Port "gehorcht"), wird "OFFEN!" ausgegeben und die Verbindung gleich wieder geschlossen. Du kannst den Zugriff z.B. beschleunigen, indem Du mehrere Threads startest. Zitieren
Crush Geschrieben 7. November 2001 Geschrieben 7. November 2001 Hier wird jeder Port einzeln geöffnet und gescannt. Das braucht natürlich schon seine Zeit. Ich habe das noch nicht probiert, aber es erscheint mir am einfachsten so zu arbeiten: Bestimmt bist Du schneller wenn Du mit CAsyncSocket() arbeitest (eigene Klasse von ableiten), alle Ports nacheinander öffnest und die virtuelle Member-Funktion CAsyncSocket::Accept(& rConnectedSocket,SOCKADDR*lpSockAddr = NULL, int*lpSockAddrLen=NULL); überschreibst. Es wird also ein Accept ausgelöst, sobald ein Port reagiert (egal ob positiv oder negativ) und das Ergebnis schreibst Du einfach in ein Array rein. Egal ob das jetzt mit dieser Klasse gelöst werden kann oder halt eine andere: Nur ein Asynchroner Zugriff erreicht die optimale Zugriffsgeschwindigkeit. Klotzkopp´s Multi-Threading ist natürlich auch eine Möglichkeit! <FONT COLOR="#a62a2a" SIZE="1">[ 07. November 2001 16:01: Beitrag 2 mal editiert, zuletzt von Crush ]</font> Zitieren
Klotzkopp Geschrieben 7. November 2001 Geschrieben 7. November 2001 @Crush: Ist Accept nicht für die "lauschende" Seite gedacht? Zitieren
Crush Geschrieben 7. November 2001 Geschrieben 7. November 2001 Keine Ahnung, bin kein Netzwerkfuzzy, dann halt Listen() überschreiben! Kann sein, daß der Server Accept() benutzt und der Client Listen(). Ich habe ja auch nur kurz mal in der MSDN rumgewühlt um zu schauen was es da überhaupt so gibt. @armerAzubi: Im schlimmsten Fall einfach ausprobieren, welcher von den Beiden anspricht! <FONT COLOR="#a62a2a" SIZE="1">[ 07. November 2001 17:30: Beitrag 1 mal editiert, zuletzt von Crush ]</font> Zitieren
multimac Geschrieben 7. November 2001 Geschrieben 7. November 2001 Klotzkopp sieht das schon richtig - normalerweise läuft es so ab: socket-Aufruf bind-Aufruf (Socket wird an eine bestimmte Adresse/Port gebunden) listen-Aufruf (Bereitschaft erklären, Information weitergeben wieviele Verbindungen angenommen werden können) accept-Aufruf (übernimmt eine neue Clientverbindung aus der "Listen"-Schlange) Zitieren
multimac Geschrieben 7. November 2001 Geschrieben 7. November 2001 Ok, ich versuche den Netzwerkpart mal einfach zu erklären. <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR> hostent *he = gethostbyname(hostname); //gethostbyname liefert einen Pointer auf einen Struct vom Typ "hostent" - dieser enthält den Namen des Hosts, die IP-Adresse, seine Aliasnamen, Adresstyp und Länge. Übrigens sehr fahrlässig an dieser Stelle, wenn der Hostname nicht aufgelöst werden kann, kopiert das Programm Müll in der CopyMemory-Funktion. sockaddr_in sa; //sockaddr_in ist die "Socketadresse". Hier werden Daten wie die Protokolfamilie (z.B. PF_INET), eine Portnummer oder in einer weiteren Struktur die IP-Adresse gespeichert. sa.sin_family = AF_INET; //Zuweisung der Protokolfamilie (hier->Internet-Socket) CopyMemory(&sa.sin_addr, he->h_addr_list[0], sizeof in_addr); //Hier wird die erste IP-Adresse (die durch die gethostbyname-Routine gefunden wurde) schlichtweg über die Struktur sin_addr kopiert. Die Struktur enthält also nun die Protokolfamilie und die IP-Adresse. SOCKET s; //Socket s = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 0, 0); //Socket wird zu einem "Internetsocket" mit TCP-Unterstützung, die letzten 3 Parameter sind mir unbekannt (kein Win-Programmierer) sa.sin_port = htons(i); //Umwandlung von "host byte order" nach "network byte order" - so ist sicher gestellt, das andere Systeme im Netzwerk das Paket richtig "verstehen". connect(s, (sockaddr *)&sa, sizeof sockaddr_in) //Voller TCP-Handshake - "s" ist der Kommunikationssocket, sa enthält die Informationen über das Remote-System shutdown(s, SD_BOTH); //Kommunikation auf dem Socket beenden. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.