Schnellste Möglichkeit, Ports mit Java zu scannen
Ich aus sehr einfachen port-scanner, aber es läuft zu langsam, also ich bin auf der Suche nach Weg, um es Scannen schneller. Hier ist mein code:
public boolean portIsOpen(String ip, int port, int timeout) {
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(ip, port), timeout);
socket.close();
return true;
} catch (Exception ex) {
return false;
}
}
diesen code hier prüfen, wenn bestimmte port offen ist auf bestimmte ip. Für timeout I ein minimaler Wert von 200, weil wenn ich tiefer gehen, es nicht genügend Zeit, um den test-port. Gut Es funktioniert gut, dauert aber zu viel zum Scannen von 0 bis 65535. Gibt es eine andere Möglichkeit, die vielleicht Scannen von 0 bis 65535 in weniger als 5 Minuten?
InformationsquelleAutor der Frage Rohit Malish | 2012-07-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie brauchen, 200ms für jede der 65536 ports (im schlimmsten Fall eine firewall blockiert alles, damit Sie Ihr hit-timeout für jeden einzelnen port), die Mathematik ist ziemlich einfach: Sie brauchen 13k Sekunden, oder etwa 3 Stunden und eine Hälfte.
Haben Sie 2 (nicht ausschließliche) Möglichkeiten, es schneller zu machen:
Seit der operation ist der I/O gebunden sind (im Gegensatz zu CPU-gebunden-das heißt, Sie verbringen Zeit mit dem warten auf I/O, und nicht für riesige Berechnung abgeschlossen ist), können Sie viele, viele threads. Versuchen Sie, beginnend mit 20. Sie würden teilen, die 3 Stunden und eine Hälfte unter Ihnen, so beträgt die erwartete maximale Zeit beträgt etwa 10 Minuten. Denken Sie nur daran, dass dieser Druck auf der anderen Seite, dh, der gescannte host finden Sie unter riesigen Netzwerk-Aktivität mit "unvernünftig" oder "Fremd" - Muster, so dass der scan sehr leicht zu erkennen.
Den leichtesten Weg (also mit minimalen änderungen), ist die Verwendung der ExecutorService und Zukunft der APIs:
Dann können Sie etwas tun:
Wenn Sie brauchen, um wissen welche ports offen sind (und nicht nur wie vielewie im obigen Beispiel), brauchen Sie, um ändern Sie den Rückgabetyp der Funktion zu
Future<SomethingElse>
woSomethingElse
halten würde, den Hafen und das Ergebnis des Scans, so etwas wie:Ändern Sie dann
Boolean
zuScanResult
im ersten snippet, und zurücknew ScanResult(port, true)
odernew ScanResult(port, false)
statt nurtrue
oderfalse
EDIT: Tatsächlich, habe gerade gemerkt: in diesem Fall brauchen Sie nicht die ScanResult Klasse Ergebnis + - Anschluss, und immer noch wissen, welcher port offen ist. Da Sie hinzufügen der futures zu einem Listedie bestelltund später, Sie Verfahren Sie in der gleichen Reihenfolge Sie HinzugefügtSie hätten einen Zähler, Sie würde Schrittweite für jede iteration, um zu wissen, welchen port Sie es zu tun haben. Aber, hey, das ist nur vollständig und präzise. Nicht immer versuchen zu tun, dasses ist schrecklich, meistens bin ich beschämt, dass ich dachte, über dieses... Über die ScanResult-Objekt ist viel saubererder code ist einfacher zu Lesen und zu verwalten, und ermöglicht Ihnen, später, zum Beispiel, verwenden Sie eine
CompletionService
zur Verbesserung der scanner.InformationsquelleAutor der Antwort Bruno Reis
Abgesehen von der Parallelisierung der scan verwenden, können Sie erweiterte port-scanning-Techniken wie diejenigen, die (der TCP SYN-und TCP-FIN-scanning) hier erklärt: http://nmap.org/nmap_doc.html. VB-code für eine Implementierung finden Sie hier: http://h.ackack.net/spoon-worlds-fastest-port-scanner.html
In Ordnung, diese Techniken zu verwenden, jedoch müssen Sie die Verwendung von raw-TCP/IP-sockets. Sie verwenden sollten, RockSaw Bibliothek.
InformationsquelleAutor der Antwort Hakan Serce
Code-Beispiel ist inspiriert von "Bruno Reis"
InformationsquelleAutor der Antwort Jack
Für Android-versuchen Sie, diese Awesome Bibliothek
https://github.com/stealthcopter/AndroidNetworkTools
InformationsquelleAutor der Antwort Bala Vishnu
Wenn Sie sich entscheiden, die Nmap-option und wollen weiter mit Java haben, sollten Sie sich auf Nmap4j SourceForge.net (http://nmap4j.sourceforge.net). Es ist eine einfache API, die ermöglicht Ihnen die Integration von Nmap in eine java-app.
--Jon
InformationsquelleAutor der Antwort Jon
Schrieb ich meine eigenen asynchronen Portscanner arbeiten java-service, Scannen von ports über TCP-SYN-Scan wie Nmap tut. Es unterstützt auch die IMCP-ping-scans und die mit einem sehr hohen Durchsatz (je nach dem, was das Netzwerk verkraften kann):
https://github.com/subes/invesdwin-webproxy
Intern verwendet es eine java-Bindung pcap und stellt seine Dienste via JMS/AMQP. Aber Sie können es auch verwenden, direkt in Ihrer Anwendung, wenn Sie nichts dagegen haben es mit root-Berechtigungen.
InformationsquelleAutor der Antwort subes