PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Portscanner (Threads/fork?)


Phuket
15.11.2004, 19:26
Ich hab mir einen momentan noch sehr simplen Portscanner in Perl geschrieben der auch halbwegs funktioniert.
Problem ist das er momentan nur einen Port nach dem anderen scannt was ziemlich lange dauert wenn keine Antwort kommt.
Jetzt hab ich im Kamel Buch zwei Methoden gefunden die sich so anhören als wären sie das richtige. Nämlich Threads und fork.
Meine Frage ist welches der beiden (wenn überhaupt) besser/schneller ist, und unter Win Systemen genauso läuft wie unter Unix Systemen. (Fork scheint bei Win Probleme zu machen)

Wenn mir dann noch jemand anhand des folgenden Codeausschnittes meines Scanners noch rudimentär die Syntax von einem der beiden reinschreiben könnte wäre ich wunschlos glücklich :)


while ($port <= $endp)
{

$temp=IO::Socket::INET->new(
PeerAddr => "$host",
PeerPort => $port,
Proto => "tcp");

if ($temp)
{


foreach (@list) #List ist eine Portliste nach dem Schema 80 Http
{
if (/^$port\s/)
{print $_ . "\n" ;
print LOGFILE $_ . "\n" if $log ; }

}
}

close $temp ;
$port++;
}


Jan Krüger
16.11.2004, 11:26
Ich halte beides für ungeeignet -- ein paar tausend Threads sind meiner Meinung nach einfach ein bisschen viel. Ich würde eher non-blocking-I/O (nichtblockierende I/O-Verarbeitung) vorschlagen. Schau dich mal im CPAN um, vielleicht findest du ja was passendes für dein Programm.

Phuket
16.11.2004, 14:13
Hatte ja auch nicht an ein paar tausend Threads gedacht sondern eher an 10 :).

Hoffe ich hab deinen Vorschlag jetzt richtig verstanden aber non blocking I/O bringt mir in dem Fall ja nichts.Das Problem liegt einfach daran das immer nur eine while Schleife nach der anderen durchgearbeitet wird. Eine Modem Verbindung könnte aber schon 10 connects gleichzeitig behandeln.

MFG Phuket :)

Jan Krüger
17.11.2004, 12:24
Non-Blocking funktioniert so:
connect() blockiert nicht, sondern gibt die Kontrolle sofort an dein Programm zurueck. Du kannst also alle connect()s direkt nacheinander ausfuehren, ohne dass irgendwo Verzoegerungen auftreten (die Verbindung wird im Hintergrund hergestellt). Danach kannst du dann z.B. in einer select()-Schleife die Ergebnisse abfragen, sobald sie eintreffen. Wenn alle Ergebnisse da sind, beendest du.

10 Threads bringen dir etwa die 10-fache Geschwindigkeit; mit non-blocking-I/O reduziert sich die Ausfuehrungsdauer auf die von *einem* Verbindungsversuch (zzgl. die Zeit, die es dauert, alle Verbindungsversuche ueber die Leitung zu senden).

Phuket
17.11.2004, 17:16
Ok danke habs jetzt erstmal mit Threads realisiert werde mir aber deine Methode mal ansehen um noch etwas Geschwindigkeitsoptimierung reinzubringen :)