Portscanner in Java

Data

by "dlrm9m"

 

11/Jume/2006

UIC's Home Page

Published by Quequero

La guerra è pace

La libertà è schiavitù

L'ignoranza è forza

Bell'idea, grazie dlrm!

La guerra è pace

La libertà è schiavitù

L'ignoranza è forza

....

E-mail: [email protected]
Nick, UIN, canale IRC/EFnet frequentato

....

Difficoltà

()NewBies (X)Intermedio ( )Avanzato ( )Master

 
 

Introduzione

Ci imbatteremo oggi nella progettazione di un port scanner in jsp .Io dò per scontato che qualcosa sul java la sappiate ma cmq farò qualche accenno nel corso del tutorial

Tools usati

Oracle jdev 10.0g www.oracle.com
La documentazione sul java della sun java.sun.com

Essay

Per prima cosa ci servono due file.Una classe java e un file.jsp
Creiamoli dal menù e cominciamo a lavorare sulla classe java.Cosa fa un port scanner?
Bè semplice prova a stabilire una connessione con la porta del l'host tramite un socket.Bene in java abbiamo un costruttore che fa proprio questo lavoro
Il costruttore lo troviamo java.net.Socket .Ma per capire come funziona consultiamo la documentazione http://java.sun.com/j2se/1.4.2/docs/api/index.html .Come vediamo il costrutto Soket

 
Socket(String host, int port)

ammette 2 valori .Uno String per l'host e uno Integer per la porta.Come vediamo il costruttore può funzionare anche in altri modi ma a noi gli altri nn interessano.Cominciamo a buttar giù un pò di listato:


package project1;\\ questo indica il progetto di cui fa parte la classe
import java.net.Socket;\\include il costruttore Socket


Prima di andare avanti vi ricordo un pò di teoria sui metodi
Un metodo è formato così:

attributo tipo dato di ritorno nome del metodo(eventuali parametri in ingresso)

attributo:Public o Private
tipo di dato di ritorno:Può essere Int String Void...
nome del metodo:E' il nome che volete dare al metodo
(eventuali parametri in ingresso):Sono paremetri che arrivano da altre classi

esempio:

public int Uno (int a, int b)

Questo è un metodo che restituisce un valore int avendo in ingresso 2 parametri int

Ora dopo questa breve parentesi andiamo avanti:

creiamo la nostra classe e la chiamiamo port con la p maiuscola e dentro incorporiamo il nostro costruttore Socket che è formato così:

public Socket(String host,int port)
throws UnknownHostException,
IOException

Come vediamo troviamo pure un throws cioè la possibilità che il costrutto non vada .Infatti può generare 2 errori .L'host che abbiamo inserito non esiste oppure c'è stato un 'errore di I/O .Per ovviare a questo problema usiamo il Throwable per gestire più errori
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Throwable.html

Infine usiamo un try per verificare se la connessione avviene .
OK continuiamo con il listato

class Port{
public String Socket(String host,int port) {



try
{
Socket a =new Socket(host,port);


return ris.toString();
}
catch(Throwable e) {
}
}
}
 


COme vediamo viene creata una connessione con il SOcket
Tralasciamo per un pò la parte java e passiamo al jsp.In pratica a noi serve un pagina in jsp in cui ci sia un form con 2 textbox [una per l'host e una per la porta da esaminare] e infine un button che premuto mandi al costrutto Socket l'host e la porta.

Vediamo come possiamo fare

Teoria sui tag jsp:

il jsp hai i tag che si indicano con

<% %>

per includere si usa
<%@ %>

per stampare a video

<%= %>

Ok cominciamo a costruire la pagina jsp

includiamo prima di tutto i Packages

<%@ page import ="java.util.*,java.lang.*,project1.Port,java.lang.Integer.*" %>
 


Vediamole in dettaglio java.util.*,java.lang.* servono per caricare gli Object ,la classe Socket e tutto quello che ci può servire
project1.Port ->>Questa inclusione serve per includere la classe Port che nel mio caso fa parte del Package project1

Creiamo un'stanza alla classe

 

<% Port a;
a= new Port();
%>

 

 

D'ora in poi a rappresentera il nostro riferimento alla classe Port

Cosa importante che dimenticavo di dire Il nome della pagina jsp non ve lo scordate

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"/>
<title>Portscanner</title>
</head>


Questa me la risparmio....

Passiamo al body

Ricordavate che dovevamo creare un form con 2 textbox e un button?
Bene eccole qua

<body>
<form action="ilnomedellavostrapagina.jsp" method="post" >
Host<input type="text" name="host" /><br>
Port<input type="text" name="porta" /><br>
<input type="submit" name="invia" value="invia" />
</form>

Non penso ci siano commenti da fare no?


Ora arriva la parte bella....ihih


Facciamo un piccolo algoritmo sui nostri STEP

1)l'utente immetterà l'host ,la porta e premerà il button
2)Il form invierà le informazioni a questa stessa pagina quindi dobbiamo prepararla a ricevere le info
3)Richiamiamo la classe java
4)Restituiamo all'utente il risultato

Premesso che la fase 1) la farà l'utente passiamo alla 2)

Prepariamo la pagina all'arrivo dei dati con il metodo request.getParameter che riceve i parametri inviati dal form

<% String host =request.getParameter("host");
String port =request.getParameter("porta");

MA se notate bene c'è una cosa che nn và

public Socket(String host,int port) -->accetta un int e uno String

Come facciamo???Bene eco perchè abbiamo incluso java.lang.Integer.* FAremo una conversione da String a int.

C'è da dire una cosa però prima.La funzione che andremo a richiamare parte subito all'apertura della pagina e se non trova valori và in errore.Quindi dobbiamo mettere un controllo che verifichi che la variabile da trasformare nn sia nulla.Così dopo la conversione mandiamo i dati alla classe Port

if(port!=null)
{
int portint = Integer.parseInt( port );
%>
<%= a.Socket(host,portint) %>
<%
}
%>

 

</body>
</html>

 

Esaminiamo questa parte
<%= a.Socket(host,portint) %>
Inviamo i dati e aspettiamo un risultato che stamperemo con <%=

Con la jsp abbiamo terminato.Torniamo alla classe java

Allora la classe Port ha ricevuto i valori e deve restituire il risulato della connessione alla jsp

Per far questo possimao sfruttare usiamo la funzione StringBuffer
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/StringBuffer.html

StringBuffer risultato =new StringBuffer();

Creiamo cosi una StringBuffer con nome risultato.Il metodo di questo costruttore che useremo sarà

append(String str) Che restituiràuna stringa

MA vediamolo in atto


Ometto la parte iniziale della classe

try
{
Socket a =new Socket(host,port);
StringBuffer risultato =new StringBuffer();
risultato.append("si ok è aperta");

return risultato.toString();
}

COme vediamo lo StringBuffer risultato contiene "si ok è aperta"
Siccome dobbiamo far tornare una valore stringa lo convertiamo in string con il toString.

Abbiamo quasi finito....


Ora implementiamo la stessa cosa nel catch

catch(Throwable e) {
StringBuffer male =new StringBuffer();
male.append("no,no");
return male.toString();

 

Quindi la classe Port completa è questa

 

public class Port {


public String Socket(String host,int port) {



try
{
Socket a =new Socket(host,port);
StringBuffer risultato =new StringBuffer();
risultato.append("si ok è aperta");

return risultato.toString();
}
catch(Throwable e) {
StringBuffer male =new StringBuffer();
male.append("no,no");
return male.toString();
}


}

}

FiNE

Note finali

Grazie a tutta la UIC. Al forum e a tutti quanti!!!!

Disclaimer

Divertitevi a smanettare sempre.