portscanner array() problemchen

SaTaN

Erfahrenes Mitglied
Hallo ihr da draussen,

ich code gerade ein Portscanner aus Neugier.
In meinem Intranet funktioniert er sehr gut.
Das Problem ist wenn ich einen anderen scanne ins Internet rein
dauert das sehr sehr sehr lange.
Keine Angst ich scanne ein Freund der weis bescheid.
Nicht das Ihr mich jetzt hier zur Schnecke macht.

Es gibt 65535 Ports die ich gerne durchscannen würde.

Habe da verschiedene varianten getestet.

Hier erstmal mein code :
1.Variante
dauert im Intranet ca. 14,5 sec
im Internet unendlich
PHP:
$ip = "192.168.0.2";
  for($i=1; $i <= 65535; $i++) {
$port = array($i);
for ($k=0; $k<count($port); $k++) {
     $ports = $port[$k];
$giu = fsockopen($ip, $ports, &$errno, &$errstr, 1);
 if(!$giu) {
    //echo "Port ", $ports, " geschlossen<br>\n";
   } else {
    echo "Port ", $ports, " offen<br>\n";
fclose($giu);
    } //if !$giu
  } //for schleife $k
} //for schleife $i

2.Variante
Die leider nicht funktioniert.
Über ein 2 Dimensionales array()

PHP:
$ip = "192.168.0.2";

// Das array ist aus platzgründen gekürzt
$port = array( 
     "0" => array(1,2,3,4,....,1024), 
     "1" => array(1025,....,2048), 
     "2" => array(2049,....,3072), 
  .... 
  .... 
     "63" => array(64511,....,65535));

for ($k=0; $k<count($port); $k++) {
     $ports = $port[$k];
$giu = fsockopen($ip, $ports, &$errno, &$errstr, 1);
 if(!$giu) {
    //echo "Port ", $ports, " geschlossen<br>\n";
   } else {
    echo "Port ", $ports, " offen<br>\n";
fclose($giu);
    } //if !$giu
  } //for schleife $k

3. Variante die leider auch bei mir nicht funktioniert
Über ein einfaches array

PHP:
$ip = "192.168.0.2";

// Das array ist aus platzgründen gekürzt
$port = array(0,1,2,3,4,....,65535), 

for ($k=0; $k<count($port); $k++) {
     $ports = $port[$k];
$giu = fsockopen($ip, $ports, &$errno, &$errstr, 1);
 if(!$giu) {
    //echo "Port ", $ports, " geschlossen<br>\n";
   } else {
    echo "Port ", $ports, " offen<br>\n";
fclose($giu);
    } //if !$giu
  } //for schleife $k

Könnte mir jemand da weiter helfen?
Besteht die Möglichkeit die 1. Variante etwas zu tunen, also zu optimieren ?
Warum funktioniert es nicht mit 2. und 3. Variante ?
Schafft das array nicht soviele Zahlen aufzunehmen ?


Als Bonus würde ich gerne wissen gibt es in PHP eine Möglichkeit herauszufinden welcher Dienst hinter dem Port steckt ?
Um dann so eine Ausgabe zu machen :

Port 80 offen http / Webserver


Vielen Dank

euer SaTaN
 
Lösung überleg ich mir noch.. *g*
aber ist dir klar warum es im Intranet so gut Funktioniert ?
wenn du alle Ports durchscannen willst brauchste locker für die 2te variante min ne Stunde.

Warum?
du machst Verbindungen auf und zwar genau 65536
So nun zum eigentlichen Punkt. Du hast keine 100 MBIT Leitung die die so schnell soviele Verbindungen zu den Servern aufstellen kann.
Anfrage - Antwort;
im Intranet ist es klar dort brauchst du nicht ewig bis du ne Antwort bekommst.
In Php kannste ausserdem keinen richtigen Timeout handeln und ausserdem hast du keine Prozesse sonder nur einen Prozess.

Du machst Schleifen
Also frägst du den Server an.
Er wartet sagen wir 4 Sekunden und genau sollange wartet dein Script bei diesem Server.
Also hast du genau 65536 einzelne Serveranfragen die er nacheinander abarbeitet.
Hättest du Java,C/C++ genommen könntest du Treaths benutzen dann könntest du ob wohl noch eine Abfrage stattfindet weitere Anfragen stellen ohne das es dein Programm beinflussen würde...

Scanner über Php kannste vergessen :) ausser du hast halt die Lust zu warten gg

Ich hoffe ich hab dich nun zum überlegen angeregt, ob du den auch wirklich schreiben willst :O
 
Zuletzt bearbeitet:
Hallo SonicBe@m,

vielen Dank für deine rasche Antwort.
Ja das mit dem Internet wo du das gerade sagst ist mir das klar.

Für eine Lösung zur Optimierung wäre ich dir da auch sehr dankbar.
Ich hoffe du meinst das ernst.

Na ja die Erklärung von dir dazu ist sehr verständlich.

Nur würde ich das gerne weiter machen da ich schon viel Zeit investiert habe.
Das Thema finde ich auch dazu sehr interessant.
Zur Not muss man halt stundenlang warten. :-)

Vielen Dank für Hilfe


euer SaTaN
 
Hey SonicBe@m,

GOOGLE IST AUCH MEIN BESTER FREUND :-)

Das Script kenne ich.
Damit habe ich mich schon gestern angefreundet und ich bekamm immer fehlers.

Kann mit denn nichts anfangen.

Fatal error: Cannot use [] for reading in

Vielleicht kannst du mir was dazu sagen.
PHP:
//gleich nach MAIN
$CONN_PORT[]; 
$OPEN_PORTS[]; 

// gleich zu anfang in der Definition
$PORTSNUMBER[]; 
$PORTSDESCRIPTION[];

Vielen Dank

euer SaTaN
 
was auch immer
dann deklariere Sie richtig
PHP:
//gleich nach MAIN
$CONN_PORT = array(); 
$OPEN_PORTS = array(); 

// gleich zu anfang in der Definition
$PORTSNUMBER = array(); 
$PORTSDESCRIPTION = array();
 
Vorschlag zur Güte:

Mit eigenem Server auf z. B. Linux kannst Du einen Portscanner nehmen und das Ergebnis von PHP übernehmen lassen.

Das heißt im konkreten Fall das Programm arbeitet bestenfalls mit üblichen multiplen Threads unter Linux und scannt wesentlich schneller, da simultan mehrere Ports abgefragt werden.

Bei allen Ports kann das je nach Leitung immer noch ein paar minuten dauern, weshalb PHP dann dementsprechend ein höheres script-timeout bräuchte.

Greetz,
Neuro ;)
 
Hallo Neuro ;-)

Hmm, soll ich das jetzt so verstehen das ich den Portscanner der unter Linux läuft
unter PHP starten kann und das Ergebnis auswerten könnte in PHP ?

Unter Linux starte ich den Portscanner so :
nmap -sS -p80 -O <host, oder ip>

Wenn ich das so richtig verstanden habe könntest du mir irgendwie ein
ansatz Posten, oder du meldest dich bitte bei mir über ICQ.

Dann schnacken wir eine Runde :-)

Vielen Dank

euer SaTaN
 
Zurück