Scrivere un PortScanner in Java che utilizzi più di un thread. Ovviamente creare 65535 thread (uno per ogni connessione diversa) non è una buona idea. Si vuole chiedere all'utente in numero di thread da utilizzare. Nel caso di k thread, ognuno analizzerà 65535/k porte.
Ecco una possibile struttura per la classe thread potrebbe essere la seguente.
public class checkPorts extends Thread{ private String IP; /* l'hostname dell'host */ private int lPort; /* il numero di porta iniziale da cui iniziare la scansione */ private int hPort; /* il numero di porta finale su cui termina la scansione */ public checkPorts(String IP, int lPort, int hPort){ this.IP = IP; this.lPort = lPort; this.hPort = hPort; } public void run(){ try { /* da completare */ } catch ( Throwable e ) { /* da completare */ } } }
Il programma dovrebbe avere in input da riga di comando le seguenti opzioni
Uso: java portScanner [-hostname ] [options]
Effettua un'analisi delle porte di uno o più host.
-hostname: specifica un hostname (default: localhost)
-fip: specifica un indirizzo IP iniziale (default: 127.0.0.1)
-tip: specifica un indirizzo IP finale (default: 127.0.0.1)
-lp: il numero di porta iniziale (default: 1)
-hp: il numero di porta finale (default: 65535)
-thread: il massimo numero di thread da utilizzare (default: 1)
-timeout: specifica il numero di millisecondi che lo scanner deve usare per ogni porta
Esempi:
$java portScanner -hostname www.id.qwerty.it
$java portScanner -fip 1x3.132.19x.2 -tip 1x3.132.19x.255 -lp 200 -thread 5 -timeout 2000
Per il timeout notare che il costruttore utilizza un timeout di default da utilizzare per stabilire una connessione. Per poter specificare un timeout bisogna a) creare una Socket senza connessione utilizzando il costruttore Socket(), e poi b) attivare esplicitamente la connessione con il metodo connect(SocketAddress endpoint, int timeout) .
Nel caso in cui l'utente non specifica correttamente le opzioni visualizzare l'uso descritto al punto precedente
Modificare lo scanner in modo tale che se trova un server installato sulla porta 80 visualizza il tipo di server installato. In particolare effettuare una richiesta al server del tipo
GET /index.html HTTP/1.0\n\n
ed estrarre dalla risposta il valore del campo Server.