Senza categoria

ping in vb IV Parte

[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!)

Lascia un commento