www.mikrocontroller.net

Forum: PC-Programmierung TCP-Portscnanner in C


Autor: Manuel Schneider (doc-snyder)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute

Ich habe mit folgendem Programm 2 Probleme:
#include <stdio.h>
#include <windows.h>



int main(int argc, char **argv)
{
  //Definitionen und Deklarationen
  int temp;
  int begin;
  int end;
  int sd;
  int loop;
  WSADATA firstsock;
  char hostname[100];
  struct sockaddr_in HOST_ADDR;


  // Input
  printf("Enter ip to scan :\t");
  gets(hostname);
  if(!(isdigit(hostname[0])))
    exit(EXIT_FAILURE);
  printf("Enter starting port :\t");
  scanf("%d" , &begin);
  printf("Enter ending port :\t");
  scanf("%d" , &end);
  system("cls");


  //Initialisiere winsock
  if (WSAStartup(MAKEWORD(2,0),&firstsock) != 0)
    {
    fprintf(stderr,"WSAStartup() failed!");
    exit(EXIT_FAILURE);
    }


  //Host definieren
  HOST_ADDR.sin_family = AF_INET;
  HOST_ADDR.sin_addr.s_addr = inet_addr(hostname);


  // Alle Daten Ausgeben und mainloop starten
  printf("Hostname:\t%s\t%d\n"
      "Startport:\t%d\n"
      "Endport:\t%d\n\n", hostname, HOST_ADDR.sin_addr.s_addr, begin, end);


  // Schleife um die einzelnen Ports abzufragen
  for(loop = begin; loop <= end; loop++)
    {
    HOST_ADDR.sin_port = htons(loop);

    //Socket öffnen
    sd = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP);
    if (sd == -1)
      printf("Socket could not be created.\n");

    //Versuche mit Port zu verbinden
    temp = connect(sd , (struct sockaddr *)&HOST_ADDR , sizeof HOST_ADDR);
    if (temp == -1)
      printf("Port %d is closed.\n", loop);
    else
      printf("Port %d is open\n", loop);

    //Socket schließen
    temp = closesocket(sd);
    if (temp == -1)
      printf("Socket %s:%d could not be closed properly.\n",hostname, loop);
    }


  //Beende winsock
  WSACleanup();


  printf("Portscan has finished\n");
  system("pause");
  return EXIT_SUCCESS;
}



Erstens funktioniert er nicht mit dem localhost (127.0.0.1) und zweitens 
ist das kreieren der Sockets ziemlich langwierig. ( 1 Portscan dauert 
ungefähr eine halbe Sekunde - bei 65k ports - phu ...)
Hat jemand eine Idee wie ich dem Programm ein bisschen Feuer unterm 
A.... machen und/oder mich selbst scannen kann?
Ich sollte vllt dazu erwähnen, dass ich wenn ich andere Hosts scanne mit 
wireshark die Pakete auf dem Interface flitzen sehe. Wenn ich aber 
localhost scanne nicht( ist vllt auch normal bin mir aber nicht sicher 
).

Wäre für jede Hilfe dankbar.

Grüße
Manuel

Autor: Tobias O. (tobey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht das Erstellen vom Socket dauert so lange, sondern das Verbinden. 
Ich weiß nicht genau ob man alle Signale unter Windows benutzen kann, 
aber wenn, dann wäre das aller einfachste ein sig alarm nach 5 Sekunden 
oder so zu senden, wodurch das Verbinden abgebrochen wird. Das zweit 
einfachste wäre es, den Socket nicht blockieren zu lassen, dann 
Verbinden und per select() darauf warten, ob man in den Socket schreiben 
darf.

Autor: Manuel Schneider (doc-snyder)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tobias O. schrieb:
> Nicht das Erstellen vom Socket dauert so lange, sondern das Verbinden.
> Ich weiß nicht genau ob man alle Signale unter Windows benutzen kann,
> aber wenn, dann wäre das aller einfachste ein sig alarm nach 5 Sekunden

Ich will den Port nur öffnen und wieder schließen. Ob offen oder nicht 
prüfe cih dann am Rückgabewert. 5 Sekunden sind viel zu lange!

> oder so zu senden, wodurch das Verbinden abgebrochen wird. Das zweit

Das erledige ich mit closesocket() allerdings kann ich da nicht während 
dem Verbinden reinpfuschen weil socket() solange blockiert, bis die 
Verbindung steht.

> einfachste wäre es, den Socket nicht blockieren zu lassen, dann
> Verbinden und per select() darauf warten, ob man in den Socket schreiben
> darf.

Socket nict blockieren lassen??? Wie meinen?

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mach für jeden Verbindungsversuch nen eigenen Thread. Und dann immer 
eine bestimmte Anzahl von Threads gleichzeitig laufen lassen.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..nennt mich einen Spielverderber, aber wäre es nicht einfacher, einen 
fertigen Scanner wie nmap [1, 2] zu verwenden?

HTH

[1] http://de.wikipedia.org/wiki/Nmap
[2] http://nmap.org/

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manuel Schneider schrieb:
> Tobias O. schrieb:
>> Nicht das Erstellen vom Socket dauert so lange, sondern das Verbinden.
>> Ich weiß nicht genau ob man alle Signale unter Windows benutzen kann,
>> aber wenn, dann wäre das aller einfachste ein sig alarm nach 5 Sekunden
>
> Ich will den Port nur öffnen und wieder schließen. Ob offen oder nicht
> prüfe cih dann am Rückgabewert. 5 Sekunden sind viel zu lange!

Wenn auf dem Port keine Antwort erfolgt, weil die Firewall des Rechners 
die blockiert, dauert es ziemlich lange, bis ein Timeouut kommt.

>> oder so zu senden, wodurch das Verbinden abgebrochen wird. Das zweit
>
> Das erledige ich mit closesocket() allerdings kann ich da nicht während
> dem Verbinden reinpfuschen weil socket() solange blockiert, bis die
> Verbindung steht.

Nicht socket(), sondern connect() blockiert.

>> einfachste wäre es, den Socket nicht blockieren zu lassen, dann
>> Verbinden und per select() darauf warten, ob man in den Socket schreiben
>> darf.
>
> Socket nict blockieren lassen??? Wie meinen?

Du kannst vor dem connect() den Socket auf non-blocking stellen. Dann 
kehrt die Funktion sofort zurück.
Dann kannst du per select mit timeout warten. Damit kannst du auch auf 
mehrere Sockets gleichzeitig warten. Alternativ kann man sich auch ein 
SIGIO schicken lassen, wenn die Verbindung aufgebaut ist und dann darauf 
reagieren.
Oder du kannst die Timeouts des Sockets verstellen, damit er schneller 
zurückkehrt. Zumindest unter Linux geht das, aber Windows kann das 
bestimmt auch.

Autor: doc-snyder (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Du kannst vor dem connect() den Socket auf non-blocking stellen. Dann
> kehrt die Funktion sofort zurück.

Wie funktioniert das?

> Dann kannst du per select mit timeout warten. Damit kannst du auch auf
> mehrere Sockets gleichzeitig warten. Alternativ kann man sich auch ein
> SIGIO schicken lassen, wenn die Verbindung aufgebaut ist und dann darauf
> reagieren.
> Oder du kannst die Timeouts des Sockets verstellen, damit er schneller
> zurückkehrt. Zumindest unter Linux geht das, aber Windows kann das
> bestimmt auch

...und das?

Laut www.sockets.com gibbets da nix mit timeout...
SOCKET PASCAL FAR socket ( int af, int type, int protocol);

af
    An address format specification. The only format currently supported is PF_INET, which is the ARPA Internet address format. 
type
    A type specification for the new socket. 
protocol
    A particular protocol to be used with the socket, or 0 if the caller does not wish to specify a protocol.
int PASCAL FAR connect ( SOCKET s, const struct sockaddr FAR * name, int namelen);
s
    A descriptor identifying an unconnected socket. 
name
    The name of the peer to which the socket is to be connected. 
namelen
    The length of the name.

Grüße vom Kaiserstuhl

Autor: Tobias O. (tobey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
er meint ja auch setsockopt()

Autor: smoerre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ..nennt mich einen Spielverderber, aber wäre es nicht einfacher, einen
> fertigen Scanner wie nmap [1, 2] zu verwenden?
der Tip war eigentlich gut, weil nmap auch im Quelltext vorliegt.

Autor: doc-snyder (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja allerdings ca. 30 MB Source-code wenn ich mich Recht erinnern kann. 
Wer so nett ist und suchen will darf mir gerne die Richti8ge stelle 
raussuchen.
Aber sonst ist nmap natürlich klasse. Ich nutze es natürlich auch um 
meinen Portscannner zu testen.
Trotzdem Danke

Autor: Gerry E. (micky01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht hilft Dir ja der Hinweis auf "netcat" weiter. Das liegt im 
Quellcode vor; der Code ist zwar nicht jedermanns Sache, aber vom Umfang 
schön klein...

Suche auch mal nach O_NONBLOCKING.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.