e ai pessoal, agora irie monstra um passo a passo de como criar um Scanner de port em java (coisa simples pessoal )
bem antes de qualquer coisa vamos criar um class principal
no java em especifico o socket fica dentro da Biblioteca java.net , e sua chamada funciona da seguinte maneira :
bem nosso host terá que ser inserido pelo usuário,eu usarei o método scanner para isso...
eu costumo tratar erros com o Try/catch , acho mas simples, para que não usar funciona assim:
OBS>ele se encontra na biblioteca Input/output =
java.io.IOException;
que tal colocamos isso em um código ?let's go
primeiro vamos a uma analise por linha
depois do main temos a chamada do scanner
temos agora o Try que ira testa execultar o que ta lá dentro,no caso:
primeiro eu peço para o usuário inserir o alvo do scanner, depois uso o scanner para captura a string digita pelo usuário, e guardo seu conteúdo na variável host,agora se o usuário digitou alvo valido , eu pego a minha variável alvo e igualo a ao ip do host, por exemplo se o usuário digita o domínio dns do alvo: exemplo.com.br , essa linha vai pega o ip,uma especie de ping
depois eu passo a variável para minha função scan, então vamos a nossa função *---*
depois eu declaro duas variáveis porta e numero_de_portas
são do tipo inteiro...
mas o que diabo é numero de portas Ramon?
numero_de_portas é a variável que usaremos que defini nosso for, já já eu explico >.<
bem , se você lembra que mas acima eu peguei o domino e converti em ip, agora farei o inverso,é o que temos na próxima linha
o for vai fazer um loop de 0, até o valor da nossa variável numero_de_portas, bem irei coloca o numero 65536, é o numero máximo recebido por uma porta
ok, então irei declarar agora os valor para as variaveis e testa no for
enquanto isso dentro do for...
depois disso outro try,e então caímos no socket
mas se não conectar na porta?
ai temos um caso de catch
ok... mas e se o usuário não digita um host valido quando for pedido?
dai nos entremos no catch da função main :
eiii Ramon temos um problema, isso é muito lerdo :S
concordo com você , querem uma ideia para deixa-lo mas rápido?hehehe
não faça o for contar numeros em ordem, afinal nem todo numero é uma porta, e geralmente buscamos portas de serviços exclusivos,então que tal fazemos um array de porta para passa os elementos do array no for?
não é má ideia né!
então vamos as melhoras....
primeiro vamos mudar as variaveis de :
bem apos isso , nosso for fica assim:
que tal colocar um timeout(é o tempo de tentativa)
mas como fazer isso é simples é so declara o socket vazio e depois usar a função connect(),que receber
e no nosso código fica assim:
bem no geral nosso código ficou
bem antes de qualquer coisa vamos criar um class principal
- Código:
public class portscanner {
public static void main (String argv[]){
}// end main
}//end class
no java em especifico o socket fica dentro da Biblioteca java.net , e sua chamada funciona da seguinte maneira :
- Código:
Socket variavel = new Socket(ip,port);
bem nosso host terá que ser inserido pelo usuário,eu usarei o método scanner para isso...
eu costumo tratar erros com o Try/catch , acho mas simples, para que não usar funciona assim:
OBS>ele se encontra na biblioteca Input/output =
java.io.IOException;
- Código:
try{
tentei e deu certo
}
catcha(que_tipo_de_erro variavel_do_erro){
System.err.println(e );//imprimir o erro
}
que tal colocamos isso em um código ?let's go
- Código:
import java.net.*;
import java.io.IOException;
import java.util.Scanner;
public class portscanner {
public static void main(String[] args)
{
Scanner ms = new Scanner(System.in);
InetAddress alvo=null;
try {
System.out.println("Insira o Alvo:");
String host = ms.nextLine();
if(host!=null)
{
alvo = InetAddress.getByName(host);
scan(alvo);
}//if end
}//try end
catch (UnknownHostException e)
{
System.err.println(e );
}//catch end
System.out.println("Scanner Finalizado");
}//main end
public static void scan(final InetAddress remote)
{
int porta,numero_de_portas;
String hostname = remote.getHostName();
for (porta=0; porta < numero_de_portas ; porta++) {
try {
Socket s = new Socket(alvo,porta);
System.out.println("A porta " + porta + " do Host " + hostname + " Esta Aberta ");
s.close();
}//try end
catch (IOException ex) {
continue
}//catch end
}//for end
}//função scan end
}//class teste end
primeiro vamos a uma analise por linha
depois do main temos a chamada do scanner
- Código:
Scanner ms = new Scanner(System.in);
- Código:
InetAddress alvo=null;
temos agora o Try que ira testa execultar o que ta lá dentro,no caso:
- Código:
try {
System.out.println("Insira o Alvo:");
String host = ms.nextLine();
if(host!=null)
{
alvo = InetAddress.getByName(host);
scan(alvo);
}//if end
}//try end
primeiro eu peço para o usuário inserir o alvo do scanner, depois uso o scanner para captura a string digita pelo usuário, e guardo seu conteúdo na variável host,agora se o usuário digitou alvo valido , eu pego a minha variável alvo e igualo a ao ip do host, por exemplo se o usuário digita o domínio dns do alvo: exemplo.com.br , essa linha vai pega o ip,uma especie de ping
depois eu passo a variável para minha função scan, então vamos a nossa função *---*
- Código:
public static void scan(final InetAddress ip)
{
int porta;
int numero_de_portas = 65536;
String hostname = ip.getHostName();
for (porta=0; porta < numero_de_portas ; porta++) {
try {
Socket s = new Socket(alvo,porta);
System.out.println("A porta " + porta + " do Host " + hostname + " Esta Aberta ");
s.close();
}//try end
catch (IOException ex) {
continue
}//catch end
}//for end
}//função scan end
}//class teste end
depois eu declaro duas variáveis porta e numero_de_portas
são do tipo inteiro...
mas o que diabo é numero de portas Ramon?
numero_de_portas é a variável que usaremos que defini nosso for, já já eu explico >.<
bem , se você lembra que mas acima eu peguei o domino e converti em ip, agora farei o inverso,é o que temos na próxima linha
- Código:
String hostname = ip.getHostName();
o for vai fazer um loop de 0, até o valor da nossa variável numero_de_portas, bem irei coloca o numero 65536, é o numero máximo recebido por uma porta
ok, então irei declarar agora os valor para as variaveis e testa no for
- Código:
int porta;
int numero_de_portas = 65536;
enquanto isso dentro do for...
depois disso outro try,e então caímos no socket
- Código:
Socket s = new Socket(alvo,porta);
- Código:
System.out.println("A porta " + porta + " do Host " + hostname + " Esta Aberta ");
ai o socket fechaAporta 0 do Host exemple.com.br Esta Aberta
- Código:
s.close();
mas se não conectar na porta?
ai temos um caso de catch
- Código:
catch (IOException ex) {
continue
}//catch end
}//for end
}//função scan end
ok... mas e se o usuário não digita um host valido quando for pedido?
dai nos entremos no catch da função main :
- Código:
catch (UnknownHostException e)
{
System.err.println(e );
}//catch end
- Código:
System.out.println("Scanner Finalizado");
e ai fechamos a função main e o programa ta prontoScanner Finalizado
eiii Ramon temos um problema, isso é muito lerdo :S
concordo com você , querem uma ideia para deixa-lo mas rápido?hehehe
não faça o for contar numeros em ordem, afinal nem todo numero é uma porta, e geralmente buscamos portas de serviços exclusivos,então que tal fazemos um array de porta para passa os elementos do array no for?
não é má ideia né!
então vamos as melhoras....
primeiro vamos mudar as variaveis de :
- Código:
int porta;
int numero_de_portas = 65536;
- Código:
int i;//quase que um padrão para o for
int[] porta = {7,20,21,23,25,53,67,68,69,79,80,88,106,110,111,113,119,123,137,138,139,143,143,161,192,311,122,389,427,443,445,464,500,514,515,532,548,554,587,600,1023,623,625,626,631,660,687,749,985,993,995,1099,8043,1640,1649,1701,1723,1900,2049,2196,2336,3004,3031,3283,3306,3478,3497,3632,3659,3689,4111,4398,4488,4500,5003,5009,5060,5100,5190,5222,5223,5269,5298,5350,5351,5353,5432,5678,5897,5898,5900,5988,6970,9999,7070,7777,8000,8999,8005,8008,8080,8087,8089,8096,8170,8171,8175,8443,8800,8843,8821,8826,8891,9006,9100,11211,16080,16384,16403,16393,16402,16403,16472,24000,24999,42000,42999,49152,65535,50003,50006};//principais portas
bem apos isso , nosso for fica assim:
- Código:
for (i=0; i < porta.length; i++)
- Código:
Socket s = new Socket(alvo,porta[i]);
System.out.println("A porta " + porta[i] + " do Host " + hostname + " Esta Aberta ");
que tal colocar um timeout(é o tempo de tentativa)
mas como fazer isso é simples é so declara o socket vazio e depois usar a função connect(),que receber
o timeout é em milisegundosconnect(new InetSocketAddress(ip,porta), timeout);
e no nosso código fica assim:
- Código:
Socket s = new Socket();
s.connect(new InetSocketAddress(remote,porta[i]), 1000);
bem no geral nosso código ficou
- Código:
import java.net.*;
import java.io.IOException;
import java.util.Scanner;
public class portscanner {
public static void main(String[] args)
{
@SuppressWarnings("resource")
Scanner ms = new Scanner(System.in);
InetAddress alvo=null;
try {
System.out.println("Insira o Alvo:");
String host = ms.nextLine();
if(host!=null)
{
alvo = InetAddress.getByName(host);
scan(alvo);
}//if end
}//try end
catch (UnknownHostException e)
{
System.err.println(e );
}//catch end
System.out.println("Scanner Finalizado");
}//main end
public static void scan(final InetAddress remote)
{
int i;
String hostname = remote.getHostName();
int[] porta = {7,20,21,23,25,53,67,68,69,79,80,88,106,110,111,113,119,123,137,138,139,143,143,161,192,311,122,389,427,443,445,
464,500,514,515,532,548,554,587,600,1023,623,625,626,631,660,687,749,985,993,995,1099,8043,1640,1649,1701,1723,
1900,2049,2196,2336,3004,3031,3283,3306,3478,3497,3632,3659,3689,4111,4398,4488,4500,5003,5009,5060,5100,5190,
5222,5223,5269,5298,5350,5351,5353,5432,5678,5897,5898,5900,5988,6970,9999,7070,7777,8000,8999,8005,8008,8080,
8087,8089,8096,8170,8171,8175,8443,8800,8843,8821,8826,8891,9006,9100,11211,16080,16384,16403,16393,16402,16403,
16472,24000,24999,42000,42999,49152,65535,50003,50006};
for (i=0; i < porta.length; i++) {
try {
Socket s = new Socket();
s.connect(new InetSocketAddress(remote,porta[i]), 1000);
System.out.println("A porta " + porta[i] + " do Host " + hostname + " Esta Aberta ");
s.close();
}//try end
catch (IOException ex) {
}//catch end
}//for end
}//função scan end
}//class teste end