Creare un port scanner in Java
Ovviamente non parliamo di un port scanner professionale come potrebbe essere NMap.
Però, alla fine della fiera anche se scritto in Java, si è rivelato abbastanza veloce.
Cominciamo con una classe che raccoglie i nostri risultati:
public class ScannerResult {
private int port;
private boolean isOpen;
public ScannerResult(int port, boolean isOpen) {
this.port = port;
this.isOpen = isOpen;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public boolean isOpen() {
return isOpen;
}
public void setOpen(boolean open) {
isOpen = open;
}
}
Qui viene tenuta traccia del numero della porta e se è aperta / chiusa.
Questo controllo lo faremo tramite Socket e InetSocketAddress.
Ecco il resto del codice:
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
public class Main {
public static void main(String[] args) {
String ip = "192.168.1.185";
System.out.println("===Scanning " + ip + "===");
try {
ExecutorService es = Executors.newFixedThreadPool(100);
int timeout = 200;
List<Future<ScannerResult>> list = new ArrayList<>();
for (int port = 1; port <= 65535; port++) {
list.add(portOpened(es, ip, port, timeout));
}
es.shutdown();
int openPorts = 0;
for (final Future<ScannerResult> f : list) {
if (f.get().isOpen()) {
openPorts++;
System.out.println(f.get().getPort());
}
}
System.out.println("L'indirizzo " + ip + " ha " + openPorts + " porte aperte");
} catch (InterruptedException | ExecutionException ex) {
System.out.println(ex.getMessage());
}
System.out.println("===END===");
}
public static Future<ScannerResult> portOpened(ExecutorService es, String ip, int port, int timeout) {
return es.submit(() -> {
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(ip, port), timeout);
socket.close();
return new ScannerResult(port, true);
} catch (Exception ex) {
return new ScannerResult(port, false);
}
});
}
}
Come vedete abbiamo usato ExecutorService e newFixedThreadPool.
Qui ho indicato 100 thread, e sulla mia CPU a 8 core ci ha messo circa 25 secondi.
Ma se volete una spiegazione migliore sul perchè ne ho messi cosi tanti, guardate il thread su iprogrammatori.it.
Infine, io ho messo un indirizzo IP fisso, ma potete anche metterlo da input.
O meglio ancora, impostarne più di uno come esercizio.
Enjoy!
java executorservice future socket inetsocketaddress
Commentami!