[MiMMuZ] per non pensare alla sua ex ha scritto:
PING DA VB
#############################-Disclaimer Legale-#############################
Tutto il materiale qui presente è stato scritto a puro scopo didattico, l’autore non si assume nessuna responsabilità per le informazioni qui riportate. Questo materiale può essere divulgato, modificato e chi vuole può pure metterci il prorpio nome, la gloria non fa per me!
#############################################################################
COSA è RICHIESTO:
-una conoscenza di base del VB
-il compilatore per VB
-la capacità di dichiarare un’API
-conoscenza di base su PING e TRACEROUTE
Eccomi ancora qui con un’altra di quelle guide quasi inutili che cercano di ampliare la vostra conoscenza del VB. Certo, il Visual Basic non è sicuramente un linguaggio di programmazione molto utile fra gli aspiranti hacker, ma dal mio modesto punto di vista trovo in lui un valido punto di inizio per capire la sintassi di linguaggi più complessi come il C. Quindi se avrete il coraggio di seguirmi in questa nuva guida cercherò di illustrarvi come si pinga col VB e sul pricipio del TRACEROUTE. Voglio precisare che quà dentro troverete solo una rielaborazione in base alle mie esperienze di un esempio trovato su un sito di VB.
PARAGRAFI:
1-TEORIA SUL PING E SUL TRACE
2-CONDICE PER PINGARE
———————> TEORIA SUL PING E SUL TRACE < -------------------------
Come dovrebbero sapere tutti quelli che si apprestano a leggere questo manuale il PING è l'operazione con la quale si controlla la raggiungibilità di un compiuter sulla rete. Per mezzo di pacchetti spediti col protocollo ICMP il nostro programma pingatore dovrà saper calcolare il tempo di risposta e, se questa non avviene entro un tempo stabilito (TTL-Time To Live) segnala il compiuter remoto come non raggiungibile. Ma, come avrà osservato chi avrà tentato di creare un programma Ping in precendenza, ne nel Winsock.ocx ne nella libreria Winsock.dll non c'è nessun comando o funzione che permetta di fare ciò. Il problema si risolve sapendo che esiste un'altra DLL (Icmp.dll) che permette di fare ciò. Utlizando ulcne funzioni di questa libreria non è difficile realizzare un semplice ma affidabile Ping. La prima cosa da fare sarà aprire un canale di comunicazione e per questo useremo la funzione IcmpCreateFile. Creato il canale la funzione ci darà un handle per esso e noi procederemo con l'invio del pacchetto ICMP per il quale prima setteremo valori relativi al TTL e al contenuto del pacchetto. Contemporaneamente alla chiamata della funzione per l'invio del pacchetto (IcmpSendEcho) chiameremo una funzione che controlli eventuali errori durante l'invio. Una volta ricevuta la risposta (o scaduto il TTL) chiuderemo il canale usando la funzione IcmpCloseHandle e l'handle relativo al canale. Molto semplice in teoria, un po' più complesso in pratica dato che il pacchetto ICMP richiede molte strutture.
Altro programma realizzabile con la funzioni relative ai pacchetti ICMP è un TRACEROUTE. Questo programma si pone come obiettivo quello di mostrci il percorso di un pacchetto prima di arrivare a destinazione. Praticamente un Trace si realizza chiamando uno dopo l'altro delle funzioni ping per la quali viene aumentato il TTL gradualmente. Una volta spedito un pacchetto con TTL=1 se questo non viene rispettato (quindi l'ip si trova fuori dalla nostra sotto rete) si genera un errore così viene aumentato il TTL e ci veien restituito l'host del primo server incontrato sulla nostra strada. Questo continua finchè il ping non giunge a destinazione. Non dovrebbe essere difficile.
---------------------------> CONDICE PER PINGARE < ---------------------------
Le API necessarie per la creazione di un Png sono le seguenti:
Public Declare Function IcmpCreateFile Lib "ICMP.DLL" () As Long
'Apre il canale di comunicazione
Public Declare Function IcmpCloseHandle Lib "ICMP.DLL" (ByVal lngHandle As Long) AS Integer
'Chiude il canale
Public Declare Function IcmpSendEcho Lib"ICMP.DLL" (ByVal lngHanlde As Long, ByVal lIP As Long, ByVal strData As String, ByVal intDataLen As Integer, ByVal usrOpt As ICMPREQOPT, ByVal bytBuff As Byte, ByVal lngRepLen As Long, ByVal lngTimeOut As Long) As Long
'Crea e invia il pacchetto ICMP
Public Declare Function IcmpGetLastError Lib "WSOCK32".DLL" Alia "WSAGetLastError" () As Long
'Controlla eventuali errori
Il ping richiede anche un nutrito numero di strutture e costanti:
'Costanti per le API
Public Const IP_STATUS_BASE = 11000
Public Const IP_SUCCESS = 0
Public Const IP_BUF_TOO_SMALL = (11000 + 1)
Public Const IP_DEST_NET_UNREACHABLE = (11000 + 2)
Public Const IP_DEST_HOST_UNREACHABLE = (11000 + 3)
Public Const IP_DEST_PROT_UNREACHABLE = (11000 + 4)
Public Const IP_DEST_PORT_UNREACHABLE = (11000 + 5)
Public Const IP_NO_RESOURCES = (11000 + 6)
Public Const IP_BAD_OPTION = (11000 + 7)
Public Const IP_HW_ERROR = (11000 + 8)
Public Const IP_PACKET_TOO_BIG = (11000 + 9)
Public Const IP_REQ_TIMED_OUT = (11000 + 10)
Public Const IP_BAD_REQ = (11000 + 11)
Public Const IP_BAD_ROUTE = (11000 + 12)
Public Const IP_TTL_EXPIRED_TRANSIT = (11000 + 13)
Public Const IP_TTL_EXPIRED_REASSEM = (11000 + 14)
Public Const IP_PARAM_PROBLEM = (11000 + 15)
Public Const IP_SOURCE_QUENCH = (11000 + 16)
Public Const IP_OPTION_TOO_BIG = (11000 + 17)
Public Const IP_BAD_DESTINATION = (11000 + 18)
Public Const IP_ADDR_DELETED = (11000 + 19)
Public Const IP_SPEC_MTU_CHANGE = (11000 + 20)
Public Const IP_MTU_CHANGE = (11000 + 21)
Public Const IP_UNLOAD = (11000 + 22)
Public Const IP_ADDR_ADDED = (11000 + 23)
Public Const IP_GENERAL_FAILURE = (11000 + 50)
Public Const MAX_IP_STATUS = 11000 + 50
Public Const IP_PENDING = (11000 + 255)
Public Const PING_TIMEOUT = 200
Public Const WS_VERSION_REQD = &H101
Public Const WS_VERSION_MAJOR = WS_VERSION_REQD \ &H100 And &HFF&
Public Const WS_VERSION_MINOR = WS_VERSION_REQD And &HFF&
Public Const MIN_SOCKETS_REQD = 1
Public Const SOCKET_ERROR = -1
Public Const MAX_WSADescription = 256
Public Const MAX_WSASYSStatus = 128
'struttura ICMP_OPTIONS
Public Type ICMP_OPTIONS
Ttl As Byte
Tos As Byte
Flags As Byte
OptionsSize As Byte
OptionsData As Long
End Type
Dim ICMPOPT As ICMP_OPTIONS
'Struttura ICMP_ECHO_REPLY
Public Type ICMP_ECHO_REPLY
Address As Long
status As Long
RoundTripTime As Long
DataSize As Long 'formerly integer
' Reserved As Integer
DataPointer As Long
Options As ICMP_OPTIONS
Data As String * 250
End Type
'Struttura HOSTENT
Public Type HOSTENT
hName As Long
hAliases As Long
hAddrType As Integer
hLen As Integer
hAddrList As Long
End Type
'Struttura WSADATA
Public Type WSADATA
wVersion As Integer
wHighVersion As Integer
szDescription(0 To MAX_WSADescription) As Byte
szSystemStatus(0 To MAX_WSASYSStatus) As Byte
wMaxSockets As Long
wMaxUDPDG As Long
dwVendorInfo As Long
End Type
Public Const NCBASTAT As Long = &H33
Public Const NCBNAMSZ As Long = 16
Public Const HEAP_ZERO_MEMORY As Long = &H8
Public Const HEAP_GENERATE_EXCEPTIONS As Long = &H4
Public Const NCBRESET As Long = &H32
Public Type NET_CONTROL_BLOCK 'NCB
ncb_command As Byte
ncb_retcode As Byte
ncb_lsn As Byte
ncb_num As Byte
ncb_buffer As Long
ncb_length As Integer
ncb_callname As String * NCBNAMSZ
ncb_name As String * NCBNAMSZ
ncb_rto As Byte
ncb_sto As Byte
ncb_post As Long
ncb_lana_num As Byte
ncb_cmd_cplt As Byte
ncb_reserve(9) As Byte ' Reserved, must be 0
ncb_event As Long
End Type
Public Type ADAPTER_STATUS
adapter_address(5) As Byte
rev_major As Byte
reserved0 As Byte
adapter_type As Byte
rev_minor As Byte
duration As Integer
frmr_recv As Integer
frmr_xmit As Integer
iframe_recv_err As Integer
xmit_aborts As Integer
xmit_success As Long
recv_success As Long
iframe_xmit_err As Integer
recv_buff_unavail As Integer
t1_timeouts As Integer
ti_timeouts As Integer
Reserved1 As Long
free_ncbs As Integer
max_cfg_ncbs As Integer
max_ncbs As Integer
xmit_buf_unavail As Integer
max_dgram_size As Integer
pending_sess As Integer
max_cfg_sess As Integer
max_sess As Integer
max_sess_pkt_size As Integer
name_count As Integer
End Type
Public Type NAME_BUFFER
name As String * NCBNAMSZ
name_num As Integer
name_flags As Integer
End Type
Public Type ASTAT
adapt As ADAPTER_STATUS
NameBuff(30) As NAME_BUFFER
End Type
Tantine vero!
Passiamo ora ad analizzare un po' di codice (il codice l'ho trovato su WWW.Visual-Basic.IT, avevopoca voglia di farlo comunque garantisco che lo spiega meglio l'auore coi suoi commenti che io!)
Una delle prime cose da fare è convertire l'indirizzo in un IP numerico.
Function AddressStringToLong(ByVal tmp As String) As Long
Dim K As Integer
Dim IPpart(1 To 4) As String
K = 0
'estraiamo gli ottetti dall'indirizzo ip
While InStr(tmp, ".") > 0
K = K + 1
IPpart(K) = Mid(tmp, 1, InStr(tmp, “.”) – 1)
tmp = Mid(tmp, InStr(tmp, “.”) + 1)
Wend
K = K + 1
IPpart(K) = tmp
If K <> 4 Then
AddressStringToLong = 0
Exit Function
End If
‘creiamo il long utilizzando i dati dell’indirizzo IP
AddressStringToLong = Val(“&H” & Right(“00” & Hex(IPpart(4)), 2) & _
Right(“00” & Hex(parts(3)), 2) & _
Right(“00” & Hex(parts(2)), 2) & _
Right(“00” & Hex(parts(1)), 2))
End Function
Public Function HiByte(ByVal wParam As Long) As Integer
‘Restistuisce la ‘parola’ piu’ significativa
HiByte = wParam \ &H100 And &HFF&
End Function
Public Function LoByte(ByVal wParam As Long) As Integer
‘Restistuisce la ‘parola’ meno significativa
LoByte = wParam And &HFF&
End Function
Public Function SocketsInitialize() As Boolean
‘Inizializza il Socket e ne restituisce l’eventuale stato
Dim WSAD As WSADATA
Dim X As Integer
Dim szLoByte As String
Dim szHiByte As String
Dim szBuf As String
X = WSAStartup(WS_VERSION_REQD, WSAD)
‘Controllo la risposta del Winsock
If X <> 0 Then
MsgBox “Impossibile avviare Windows Sockets!”, vbCritical, “Ping Test”
Exit Function
End If
‘Controllo la versione della libreria Winsock
If LoByte(WSAD.wVersion) < WS_VERSION_MAJOR Or _
(LoByte(WSAD.wVersion) = WS_VERSION_MAJOR And _
HiByte(WSAD.wVersion) < WS_VERSION_MINOR) Then
szHiByte = Trim$(Str$(HiByte(WSAD.wVersion)))
szLoByte = Trim$(Str$(LoByte(WSAD.wVersion)))
szBuf = "Le versione " & szLoByte & "." & szHiByte & " del Windows Sockets"
szBuf = szBuf & " non e' supportata "
MsgBox szBuf, vbExclamation
Exit Function
End If
'Controlla che ci sia un socket disponibile
If WSAD.wMaxSockets < MIN_SOCKETS_REQD Then
Exit Function
End If
'Socket inizializzato
SocketsInitialize = True
End Function
Public Sub SocketsCleanup()
'Disalloca il socket
Dim X As Long
X = WSACleanup()
If X <> 0 Then
MsgBox “Errore ” & Trim$(Str$(X)) & ” in fase di disallocamento del socket”, vbExclamation
End If
End Sub
Public Function GetStatusCode(status As Long) As String
‘restituisce un messaggio in funzione del valore status
Dim msg As String
Select Case status
Case IP_SUCCESS: msg = “ip success”
Case IP_BUF_TOO_SMALL: msg = “ip buf too_small”
Case IP_DEST_NET_UNREACHABLE: msg = “ip dest net unreachable”
Case IP_DEST_HOST_UNREACHABLE: msg = “ip dest host unreachable”
Case IP_DEST_PROT_UNREACHABLE: msg = “ip dest prot unreachable”
Case IP_DEST_PORT_UNREACHABLE: msg = “ip dest port unreachable”
Case IP_NO_RESOURCES: msg = “ip no resources”
Case IP_BAD_OPTION: msg = “ip bad option”
Case IP_HW_ERROR: msg = “ip hw_error”
Case IP_PACKET_TOO_BIG: msg = “ip packet too_big”
Case IP_REQ_TIMED_OUT: msg = “ip req timed out”
Case IP_BAD_REQ: msg = “ip bad req”
Case IP_BAD_ROUTE: msg = “ip bad route”
Case IP_TTL_EXPIRED_TRANSIT: msg = “ip ttl expired transit”
Case IP_TTL_EXPIRED_REASSEM: msg = “ip ttl expired reassem”
Case IP_PARAM_PROBLEM: msg = “ip param_problem”
Case IP_SOURCE_QUENCH: msg = “ip source quench”
Case IP_OPTION_TOO_BIG: msg = “ip option too_big”
Case IP_BAD_DESTINATION: msg = “ip bad destination”
Case IP_ADDR_DELETED: msg = “ip addr deleted”
Case IP_SPEC_MTU_CHANGE: msg = “ip spec mtu change”
Case IP_MTU_CHANGE: msg = “ip mtu_change”
Case IP_UNLOAD: msg = “ip unload”
Case IP_ADDR_ADDED: msg = “ip addr added”
Case IP_GENERAL_FAILURE: msg = “ip general failure”
Case IP_PENDING: msg = “ip pending”
Case PING_TIMEOUT: msg = “ping timeout”
Case Else: msg = “unknown msg returned”
End Select
‘Restituisco lo stato ed il messaggio associato
GetStatusCode = CStr(status) & ” ( ” & msg & ” )”
End Function
Public Function Ping(szAddress As String, ECHO As ICMP_ECHO_REPLY) As Long
‘Funzione per ‘pingare’
Dim hPort As Long
Dim dwAddress As Long
Dim sDataToSend As String
Dim iOpt As Long
‘Dim ECHO As ICMP_ECHO_REPLY
‘stringa da inviare (32 bytes)
sDataToSend = String(32, “A”)
‘Converto l’indirizzo IP in un LONG
dwAddress = AddressStringToLong(szAddress)
‘Ottengo un handle
‘per l’Internet Control Message Protocol (ICMP) requests
hPort = IcmpCreateFile()
‘Effettuo in PING
If IcmpSendEcho(hPort, _
dwAddress, _
sDataToSend, _
Len(sDataToSend), _
0, _
ECHO, _
Len(ECHO), _
PING_TIMEOUT) Then
‘Se la funzione va a buon fine, il valore
‘ ECHO.Stat deve essere 0
‘ ECHO.RoundTripTime e’ il tempo in ms per i completamento del ping
‘ ECHO.Data sono i dati ‘ritornati’ terminati da una carattere NULL
‘ ECHO.Address E’ l’indirizzo IP che risponde
‘ ECHO.DataSize e’ la lunghezza della string in ECHO.Data
‘Restituisco il tempo di risposta
Ping = ECHO.RoundTripTime
Else
‘Altrimenti restituisco l’errore (indentificandolo con un segno di meno)
Ping = ECHO.status * -1
End If
‘Chiudo l’handle della comunicazione
Call IcmpCloseHandle(hPort)
End Function
Ecco fatto. Ora vediamo come metter in pratica queste funzioni prese in prestito.
La prima cosa da fare è dimensionare il pacchetto:
Dim ECHO As ICMP_ECHO_REPLY
Quindi aprire il canale e iniziamo a pingare:
If SocketsInitialize=True Then
‘in caso positivo, inizio il ping… e faccio 4
strResult = “”
‘Effettuo il ping su l’indirizzo IP, passando
‘l’indirizzo IP e la struttura ECHO (passata per riferimento)
Call Ping(Dati, ECHO)
‘I byte ricevuti
Dimensione_Risposta = ECHO.DataSize & ” bytes”
‘Messaggio o errore di ritorno
Risposta = GetStatusCode(ECHO.status)
‘Indirizzo IP pingato
IP_Pingato = ECHO.Address
‘Il tempo di risposta
Tempo_Risposta = ECHO.RoundTripTime & ” ms”
‘Visualizzo i dati
If Left$(ECHO.Data, 1) <> Chr$(0) Then
Dati_Reply = Left$(ECHO.Data, (InStr(ECHO.Data, Chr$(0))) – 1)
End If
‘Rilascio il socket
SocketsCleanup
End If
Ed ecco fatto il Ping! Se non avete tutto chiaro provate a rileggere oppure contattatemi. Anche per sta volta ho concluso (anceh se a ben pensarci di mio ho scritto solo 60 righe! MALE!)