Fiz um simples portscanner em java, porem ele estava testando porta a porta e estava muito lento resolvi colocar em threads, so que nao sei se fiz alguma coisa errada mais acontece que chega na porta 500(funcionando em threads) ele para de testar, o Scan continua rodano so que parece q a socket nao conecta mais ! Vou postar o codigo !!
Classe Repete (Threads)
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class Repete extends Thread {
String ark = "portas.txt";
String host;
int porta;
Repete(String host, int porta) {
this.host = host;
this.porta = porta;
}
public synchronized void run() {
try {
FileWriter escritor = new FileWriter(ark, true);
BufferedWriter buffer = new BufferedWriter(escritor);
//System.out.println("Trying: " + this.porta);
Socket s = new Socket(this.host, this.porta);
s.setSoTimeout(1);
buffer.write("Porta Aberta ==> "+ this.porta);
buffer.newLine();
buffer.flush();
buffer.close();
if (s.isConnected() == true) {
s.close();
}
}
catch (UnknownHostException ex) {
System.err.println(ex);
//break;
}
catch (IOException ex) {
}
}
}
e a Classe Main que chama Scan
public class Scan {
public static void main(String[] args) throws IOException {
if (args.length != 0 ) {
String host = args[0];
int ini = Integer.parseInt(args[1]);
int fina = Integer.parseInt(args[2]);
for (ini = Integer.parseInt(args[1]); ini < fina;ini++) { //aki eu quero q teste da porta 1 ate 65535, chega na 500 trava
Repete arroba = new Repete(host, ini);
synchronized (arroba) {
arroba.start();
}
}
}
me corrija se estiver errado, mais o buffer que estou utilizando nada mais serve para eu salvar a porta aberta no arquivo txt “portas.txt”, oq ele faz eh abrir uma socket na porta, se conectar esta aberta!
Socket s = new Socket(this.host, this.porta);
...
if (s.isConnected() == true) {
s.close();
}
Aham, se você criar um socket, ele eventualmente deve ser fechado, mesmo que não esteja conectado.
De qualquer maneira, port scanners decentes não tentam abrir conexões (o que é muito lento e pode eventualmente acabar falhando, e ainda por cima pode ser detectado pelo firewall do outro lado, que poderá acabar encerrando todas as conexões porque aparenta ser uma atividade suspeita); eles só mandam um único pacote da negociação TCP/IP e esperam uma determinada resposta, o que não dá para fazer diretamente em Java, nem mesmo com as APIs de Winsock (no caso do Windows).
Eles precisam usar outras APIs mais complicadas que trabalham diretamente com o protocolo IP.
No WinSock acho que você consegue, se achar uma API que trabalhe com os RAW Sockets.
Trabalhar diretamente é a morte, pq envolve escrever na mão o cabeçalho IP.
Mas é essa que é a idéia. Um port scanner que se preza consegue até ocultar quem ele é, para evitar problemas com firewalls.
Um exemplo de port scanner (do bem) está no site https://www.grc.com/x/ne.dll?bh0bkyd2 (ShieldsUp). Esse site consegue checar quais são as portas que alguém na Internet está inadvertidamente expondo em segundos.
mais meu port scanner foi feito apenos para uso didatico!! Para intender o funcionamento de sockets com host e websites! Nao consigui achar nenhuma documentacao melhor sobre isso. Voce tem alguma ideia ?