Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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;

}

Geschrieben

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.

Geschrieben

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>

Geschrieben

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>

Geschrieben

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)

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...