scanner de red en

21
Scanner de Red en Vb.net Publicado por ingsistele en marzo 29, 2012 Existen ocasiones en que nos encontramos conectados a una red LAN y por alguna razon nos gustaria conocer detalles de otros equipos que esten conectados a dicha red, para determinarlo se podrian usar varios comandos de DOS, sin embargo se podria automatizar este proceso mediante una aplicacion que scanee toda la red en la que nos encontremos a traves del grupo de direccion ip al que pertenezca y nos permita ver el resultado encontrado de una manera visualmente ordenada. en la siguiente image podemos ver la forma de la aplicacion que pretendemos desarrollar: Bien, manos a la obra, comencemos… entre los controles a utilizar tenemos: * 2 grillas o DatagridView * 5 Textbox * 3 Botones

Upload: hackimi

Post on 11-Aug-2015

60 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Scanner de Red En

Scanner de Red en Vb.net

Publicado por ingsistele en marzo 29, 2012

Existen ocasiones en que nos encontramos conectados a una red LAN y por alguna razon nos gustaria conocer detalles de otros equipos que esten conectados a dicha red, para determinarlo se podrian usar varios comandos de DOS, sin embargo se podria automatizar este proceso mediante una aplicacion que scanee toda la red en la que nos encontremos a traves del grupo de direccion ip al que pertenezca y nos permita ver el resultado encontrado de una manera visualmente ordenada.

en la siguiente image podemos ver la forma de la aplicacion que pretendemos desarrollar:

Bien, manos a la obra, comencemos…

entre los controles a utilizar tenemos:

* 2 grillas o DatagridView

* 5 Textbox

* 3 Botones

* 1 RadioButton

* Varios labels y groupbox (para indicar los nombres de cada campo y ordenar el diseño).

al agregar los controles al formulario deberiamos de crear un diseño parecido al que se ve en la siguiente imagen:

Page 2: Scanner de Red En

cabe aclarar que se esta utilizando una grilla para almacenar la direccion Ip, nombre del equipo y estado, y una segunda grilla para ir almacenando la direccion MAC de cada equipo, los datos se van cargando de forma paralela en cada grilla, es decir que la informacion que aparece en una fila es equivalente a la de la fila en la otra grilla (se realiza este proceso de esta manera usando 2 grillas a conveniencia para facilitar ciertas operaciones que se hacen internamente en el programa).

Pasando a la seccion de codigo del formulario, debemos importar las siguientes librerias:

01 Imports System

02  

03 Imports System.Net

04  

05 Imports System.Net.NetworkInformation

06  

07 Imports System.Text

08  

09 Imports System.Text.RegularExpressions

10  

11 Imports System.Net.Dns

Luego, Declaramos las siguientes variables como globales:

01 Dim cont, aux As Integer

02 Private inicio, fin As Integer

03  

04 Public c() As String

Page 3: Scanner de Red En

05  

06 Public d() As String

07  

08 Dim direccion_Ip As String

09  

10 Dim mimac As String

11  

12 Dim encontro As Integer

Bien, ahora pasemos al evento load del formulario, alli lo que haremos sera almacenar en un archivo plano todas las direcciones fisicas o MAC de nuestro computador (Habran tantas direcciones como interfaces de red tengamos), ademas vamos a traer todas las direcciones Ip de las interfaces de red que esten activas y las vamos a cargar en el combobox para luego escoger la ip local de nuestro pc e identificarlo dentro de la red. el codigo de dicho evento load es el siguiente:

01Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

02  

03 Me.Lblmsg.Visible = False

04  

05 Me.Button1.Enabled = False

06  

07 Try

08  

09 Shell("cmd.exe /c getmac >mi_mac.txt", AppWinStyle.Hide)

10  

11 Catch ex As Exception

12  

13 End Try

14 '++++++++++++++++++++++++++++++++++++++++

15  

16 Dim nombre_Host As String = GetHostName.ToString

17  

18 'traigo todas las ip y las coloco en el combo

19  

20 Me.TextBox_ipl.Items.Clear()

Page 4: Scanner de Red En

21  

22 For Each ip In System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName).AddressList

23  

24 If ip.AddressFamily = Net.Sockets.AddressFamily.InterNetwork Then

25  

26 'Añadir solo las correspoondientes a IP4

27  

28 Me.TextBox_ipl.Items.Add(ip.ToString)

29  

30 End If

31  

32 Next

33  

34 End Sub

Ahora, procedemos a codificar nuestro boton validar, lo que hara es determinar si una direccion ip esta bien escrita y determinar a que grupo pertenece la ip, coloquemos lo siguiente en dicho boton:

01Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

02  

03 Me.DataGridView1.Rows.Clear()

04  

05 Me.grilla_mac.Rows.Clear()

06  

07 ' Me.TextBox_ipl.Items.Clear()

08  

09 Me.TextBox_equipol.Clear()

10  

11 Me.TextBox_macl.Clear()

12  

13 Me.TextBox_estadol.Clear()

14  

15 If TextBox1.Text <> "" Then

16  

Page 5: Scanner de Red En

17 checkRejex(TextBox1.Text)

18  

19 Else

20  

21 Me.Lblmsg.Visible = True

22  

23 Lblmsg.Text = "Por favor Ingrese Una Ip Valida!"

24  

25 Lblmsg.ForeColor = Color.Red

26  

27 End If

28  

29 If TextBox2.Text <> "" Then

30  

31 checkRejex(TextBox2.Text)

32  

33 Else

34  

35 Me.Lblmsg.Visible = True

36  

37 Lblmsg.Text = "Por favor Ingrese Una Ip Valida!"

38  

39 Lblmsg.ForeColor = Color.Red

40  

41 End If

42  

43 End Sub

La funcion checkRejex es la encargada de verificar cada una de las ip, procedemos a crearla:

01 Private Sub checkRejex(ByVal strFindin As String)

02  

03 Dim myRegex As New Regex("^(([01]?\d\d?|2[0-4]\d|25[0-5])\.){3}([01]?\d\d?|25[0-5]|2[0-4]\d)$")

04  

05 If myRegex.IsMatch(strFindin) Then

Page 6: Scanner de Red En

06  

07 Me.Lblmsg.Visible = True

08  

09 Lblmsg.Text = "Direccion Ip Valida"

10  

11 Lblmsg.ForeColor = Color.Green

12  

13 Me.Button1.Enabled = True

14  

15 Else

16  

17 Me.Lblmsg.Visible = True

18  

19 Lblmsg.Text = "Por favor Ingrese Una Direccion Ip Valida!"

20  

21 Lblmsg.ForeColor = Color.Red

22  

23 End If

24  

25 End Sub

Bien Amigos, pasemos ahora al boton scanear, aqui es donde se realiza el proceso de busqueda y presentacion de los resultados, para poder comenzar el escaneo es necesario que seleccione la ip local del pc en el combobox de la izquierda y luego se defina el rango de ip a explorar, habiendo cumplido con este requisito, basicamente lo que se hace es determinar cual es la direccion mac que se esta utilizando, para ello nuevamente se ejecuta la instruccion getmac, luego en el archivo que se crea, lo recorremos hasta encontrar el caracter que indica que esta activo \ y tomamos la primera direccion encontrada (es de resaltar que el caracter “\” se encuentra en la posicion 20 de la cadena de caracteras).

el codigo del boton escanera es el siguiente:

01Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

02  

03 If (Me.TextBox_ipl.Text = "") Then

04  

05 MsgBox("Seleccione su direccion Ip Local por favor!", MsgBoxStyle.Exclamation, "Notificacion")

Page 7: Scanner de Red En

06  

07 Else

08  

09 direccion_Ip = Me.TextBox_ipl.Text

10  

11 'Capturo la direccion mac local

12  

13 Dim datos2 As String

14  

15 Dim j As Integer

16  

17 j = 0

18  

19 Shell("cmd.exe /c getmac >mi_mac.txt", AppWinStyle.Hide)

20  

21 FileOpen(1, "mi_mac.txt", OpenMode.Input, OpenAccess.Read)

22  

23 While Not EOF(1)

24  

25 datos2 = LineInput(1)

26  

27 ReDim Preserve d(j)

28  

29 d(j) = datos2

30  

31 j = j + 1

32  

33 End While

34  

35 FileClose(1)

36  

37 '----------------------

38 ''ya tengo todas las mac de mi computador, ahora busco la que estoy utilizando

39  

Page 8: Scanner de Red En

40 encontro = 0

41  

42 For cont2 As Integer = 3 To j - 143 ' MsgBox(d(cont2)(20))

44  

45 If (d(cont2)(20) = "\") And (encontro = 0) Then

46  

47 'si es igual, esta es la mac que estoy utilizando

48  

49 mimac = d(cont2).Substring(0, 18)

50  

51 encontro = 1

52  

53 ' MsgBox(mimac)

54  

55 End If

56  

57 Next

Bien hasta aqui solo se ha extraido la direccion mac local del equipo, la imagen siguiente nos pude dar idea del proceso que se ha realizado:

Ahora, continuando con  nuestro codigo en el boton scanear, hay que realizar una operacion ciclica de ir haciendo ping a cada direccion ip incluida en el rango y asi determinar si el equipo esta disponible o no en la red.

ademas vamos a utilizar el comando arp -a que lista todas las direcciones mac o fisicas de las direcciones ip que vallamos recorriendo en el ciclo y de esa manera obtenemos la informacion que estamos buscando, luego se agregan los resultados a las grillas y los datos del equipo local

Page 9: Scanner de Red En

en sus respectivos campos de texto, podemos ver la continuacion del codigo del boton scanera a continuacion:

001 Dim ping_usuario As New Ping

002  

003 Dim opt = New PingOptions()

004  

005 Dim data As String

006  

007 Dim xxx As Integer

008  

009 opt.DontFragment = True

010  

011 Dim xx As String

012  

013 Dim reply As PingReply

014  

015 Dim cc As Integer = 0

016  

017 Dim cco As Integer = 0

018  

019 Me.Button2.Enabled = False

020  

021 Me.Button1.Enabled = False

022  

023 Me.TextBox1.Enabled = False

024  

025 Me.TextBox2.Enabled = False

026  

027 Try

028  

029 '// Create a buffer of 32 bytes of data to be transmitted.

030  

031 data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

032  

033 Dim buffer() As Byte = Encoding.ASCII.GetBytes(data)

Page 10: Scanner de Red En

034  

035 Dim timeout As Integer = 120

036  

037 Dim h As String

038  

039 Dim v() As String

040  

041 v = Split(TextBox1.Text, ".")

042  

043 inicio = v(UBound(v))

044  

045 v = Split(TextBox2.Text, ".")

046  

047 fin = v(UBound(v))

048  

049 cont = -1

050  

051 '..........

052  

053 If (inicio > fin) Then

054  

055 MsgBox("La Direccion Ip es Invalida, La Direccion de inicio debe ser Menor que la Final!", MsgBoxStyle.Exclamation, "Advertencia")

056  

057 Me.Button2.Enabled = True

058  

059 Me.TextBox1.Enabled = True

060  

061 Me.TextBox2.Enabled = True

062  

063 Exit Sub

064  

065 End If

066  

067 xxx = CInt(v(0))

Page 11: Scanner de Red En

068  

069 If xxx >= 0 And xxx <= 127 Then

070  

071 Label9.Text = "La Red es de Clase: A"

072  

073 End If

074  

075 If xxx >= 128 And xxx <= 191 Then

076  

077 Label9.Text = "La Red es de Clase: B"

078  

079 End If

080  

081 If xxx >= 192 And xxx <= 223 Then

082  

083 Label9.Text = "La Red es de Clase: C"

084  

085 End If

086  

087 '..........

088  

089 For index As Integer = inicio To fin

090  

091 xx = v(0) & "." & v(1) & "." & v(2) & "." & index

092  

093 reply = ping_usuario.Send(xx, timeout, buffer, opt)

094  

095 If (reply.Status = IPStatus.Success) Then

096  

097 h = Dns.GetHostEntry(xx).HostName

098  

099 Shell("cmd.exe /c arp -a >dir_mac.txt")

100  

101 If (Trim(direccion_Ip) <> xx) Then

Page 12: Scanner de Red En

102  

103 'esta es mi IP(Ip Local)

104  

105 DataGridView1.Rows.Add(xx, h, "Encontrado")

106  

107 Else

108  

109 Me.TextBox_ipl.Text = xx

110  

111 Me.TextBox_equipol.Text = h

112  

113 Me.TextBox_macl.Text = mimac

114  

115 Me.TextBox_estadol.Text = "Encontrado"

116  

117 End If

118  

119 cont = cont + 1

120  

121 End If

122  

123 Next

124  

125 'dirm()

126  

127 Me.Button2.Enabled = True

128  

129 Me.TextBox1.Enabled = True

130  

131 Me.TextBox2.Enabled = True

132  

133 '------

134  

135 Dim datos As String

Page 13: Scanner de Red En

136  

137 Dim i As Integer

138  

139 FileOpen(1, "dir_mac.txt", OpenMode.Input, OpenAccess.Read)

140  

141 While Not EOF(1)

142  

143 datos = LineInput(1)

144  

145 ReDim Preserve c(i)

146  

147 c(i) = datos

148  

149 i += 1

150  

151 End While

152  

153 FileClose(1)

154  

155 If (cont <> 0) Then

156  

157 aux = 3

158  

159 'si se encontraran equipos en red

160  

161 'verifico cuantos equipos hay

162  

163 'asigno a la grilla todas las direcciones

164  

165 For udg = aux To (cont + aux) - 1

166  

167 grilla_mac.Rows.Add(c(udg).Substring(23, 18))

168  

169 Next

Page 14: Scanner de Red En

170  

171 '----------------------

172  

173 End If

174  

175 Catch ex As Exception

176  

177 End Try

178  

179 End If

180  

181 End Sub

Por ultimo solo debemos colocar en nuestro boton cerrar la instruccion

1 Close()

Bien ya hemos terminado la aplicacion ahora tenemos que probarla, para ello hay que establecer direcciones ip a los equipos que tengamos y constatar que pertenezcan al mismo grupo de trabajo, he decidido establecer a mi tarjeta de red la siguiente direccion ip: 192.168.169.1

Dicha Ip corresponde al adaptador anfitrion de mi maquina virtual vmware, ahora voy a configurar la direccion ip del cliente en mi maquina virtual en la cual tengo instalado el windows xp, en la siguiente imagen se ve la ip que le he colocado:

Page 15: Scanner de Red En

Ahora podemos probar la conexion haciendo ping del equipo host al virtual:

y ahora probemos haciendo ping del equipo virtual al anfitrion:

Page 16: Scanner de Red En

Bien, ya sabemos que los equipos estan conectados, llego la hora de poner a prueba nuestro programa ejecutandolo:

Como se puede ver en la imagen, ya estan cargadas todas las direcciones ip del equipo (dependiendo de las interfaces que tengamos activas), procedemos a escoger la local con la cual vamos a realizar la busqueda, luego establecemos un rango de ip que pertenezcan a la misma clase y hacemos clic sobre validar, si todo esta bien, se activara el boton scanear y procedemos a presionarlo para comenzar la busqueda:

Page 17: Scanner de Red En

Como resultado podemos observar que se ha encontrado los equipos que estan conectados a la red y tambien se han mostrado los detalles del equipo local.

Eso es todo amigos, espero y les resulte de utilidad la aplicacion, para descargarla has clic sobre el siguiente enlace: