Introducción
En este artículo les explico como hacer una aplicación que esté corriendo en nuestro equipo
como un "servicio de windows", este software nos detectará cuando se conecte una memoria USB a nuestro computador
y determinará si está autorizada, si no lo está la formatea sin pedir confirmación.
IMPORTANTE:
POR FAVOR LEE ATENTAMENTE ESTE ARTÍCULO ANTES DE USAR EL CÓDIGO.
YA QUE SI LO USAS DE FORMA INADECUADA PUEDES PERDER INFORMACIÓN GRABADA EN DISCOS
(o memorias) USB.
Tal como se indica en el texto:
La comprobación de si la memoria está o no autorizada para
conectarse en nuestro equipo lo hacemos evaluando si existe
un archivo que llamaremos kill.dll
Contenido
En la empresa donde trabajo actualmente teníamos muchos problemas con los virus, ya que algunos
empleados (tal vez mal intencionados) conectaban memorias USB infectadas en los computadores que tenemos en las sucursales,
propagando de esa forma los virus, algunos muy dañinos, otros no tanto.
Luego de tratar de encontrar una solución a dicha problemática, decidí crear un software que sólo
permitiera que ciertas memorias USB autorizadas se pudiesen conectar a nuestros equipos y si esta memoria no estaba
"autorizada" sería formateada. Todo el código ha sido hecho por mí, lo único diferente que utilizo es una dll que
descargué de Internet, la cual sirve para colocar el icono de la aplicación en el systray y mostrará un mensaje cuando
la memoria no esté "autorizada" diciendo que la ha formateado... jejeje... Esta aplicación esta hecha en Visual Basic .NET 2008,
pero debe funcionar para las versiones anteriores
Nota:
Amigos, este código se los coloco, primero, porque considero que el sitio del Guille ha sido de gran ayuda en mi
carrera como Desarrollador en .NET y segundo porque he visto que muchas personas están buscando un código parecido a este,
les agradezco que utilicen este código sólo para su seguridad y el de su
compañía...
El código:
Vamos a iniciar un nuevo proyecto del tipo Aplicación de Windows, al formulario que se crea sólo le vamos a agregar
un control de tipo Timer, lo llamaré Temporizador. En la clase del formulario colocaremos las siguientes declaraciones:
'Esta constante corresponde al valor del WParam del mensaje que se envia a la forma cuando se minimiza
Private Const SC_MINIMIZE = &HF020&
'Esta variable nos coloca el icono en el systray y nos muestra los mensajes correspondientes
Private Msg As New globoShell
'Para el tipo del disco
Private l_Tipo As String = As String Nothing
'Vector que tiene guardado las posibles unidades
Private Vector() As String = {"C", "D", "E", "F", "G", "H", "I"}
Utilizaré un método que nos va a permitir saber si nuestra aplicación está en ejecución, esto lo hacemos para evitar
que nuestra aplicación se cargue más de una vez. Este método no recibe ningún parámetro y retorna un booleano:
Public Function InstanciaPrev() As Boolean
If UBound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName)) > 0 Then
Return True
Else
Return False
End If
End Function
En el Load del Formulario colocaremos el siguiente código, primero preguntaremos si ya se está ejecutando la aplicación,
luego preguntaremos si tenemos un acceso directo de nuestra aplicación en la carpeta inicio, esto es para que cada vez
que un usuario inicie sesión en nuestro equipo la aplicación comience automáticamente, minimizamos nuestra aplicación,
no permitimos que se muestre en la barra de tareas, mandamos el formulario al systray y habilitamos el temporizador... Por
cierto, nuestra aplicación la llamaremos Daemon y nuestro formulario Frm_BorradoUSB:
'Evaluamos que no esté cargada la aplicación
If InstanciaPrev() Then
'Cerramos la nueva aplicación
Application.Exit()
End If
'Evaluaremos si no se encuentra el acceso directo a nuestra aplicación en la carpeta inicio
If Not File.Exists("C:\Documents and Settings\All Users\Menú Inicio\Programas\Inicio\Daemon.exe.lnk") Then
'Creamos el acceso directo
Dim ob As Object = CreateObject("WScript.Shell")
Dim vlnk As Object
vlnk = ob.CreateShortcut & _
("C:\Documents and Settings\All Users\Menú Inicio\Programas\Inicio\Daemon.exe.lnk")
'Buscamos nuestro .exe, puede estar en cualquier carpeta
vlnk.Targetpath = Application.StartupPath & "\Daemon.exe"
vlnk.Save()
End If
'Minimizamos la ventana
WindowState = FormWindowState.Minimized
'No permitimos que aparezca en la barra de herramientas
ShowInTaskbar = False
'Adicionamos el icono en el systray
Msg.AddIcon( Me )
'Habilitamos el temporizador
Temporizador.Enabled = True
Utilizaré una propiedad llamada Tipo que nos retornará el tipo de disco que se encuentra conectado a nuestro
computador, tenga en cuenta que las memorias USB siempre son de tipo USB:
Public Property Tipo() As String
Get
Return l_Tipo
End Get
Set(ByVal value As String)
l_Tipo = value
End Set
End Property
Al timer utilizado le coloqué un intervalo por defecto de 1000 milisegundos (un segundo), esto quiere decir que
el software cada segundo estará buscando si tenemos una memoria USB conectada. Ahora, en el evento Tick del Timer
colocaremos el siguiente código:
'Determinamos los discos que tenemos
Dim DatosHDD As New ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive")
'Recorremos todos los discos conectados para ver cuales son de tipo USB
For Each DskWmi As ManagementObject In DatosHDD.[Get]()
Dim Dsk As New Frm_BorradoUSB
Dsk.Tipo = DskWmi("InterfaceType").ToString()
If Dsk.Tipo = "USB" Then
'Ejecutamos el método que nos verifica si es una memoria autorizada
Ejecutar()
End If
Next
Crearemos un método que se llamará Ejecutar el cual nos determinará si la memoria USB está autorizada o no, si
no lo está llamará a otro método que se encargará de formatear la USB. La comprobación de si la memoria está o no
autorizada para conectarse en nuestro equipo lo hacemos evaluando si existe un archivo que llamaremos kill.dll:
Private Sub Ejecutar()
'Deshabilitamos temporalmente el timer
Temporizador.Enabled = False
'Variable que guarda la unidad de la memoria
Dim U As String = Unidad()
'Obtenemos los subdirectorios y los archivos localizados en la carpeta raíz de la memoria
Dim strDir2() As String
Dim strFlies2() As String
strDir2 = System.IO.Directory.GetDirectories(U & ":\", "*.*")
strFlies2 = System.IO.Directory.GetFiles(U & ":\", "*.*")
'Evaluamos si la memoria está autorizada
If Not File.Exists(U & ":\kill.dll") Then
'La memoria no está autorizada, pero evaluamos si está vacía
If strDir2.Length > 0 Or strFlies2.Length > 0 Then
'Mostramos el mensaje de formateo
Msg.WNotification("HAS CONECTADO UNA MEMORIA USB COMO DISCO " & U & ":\ FORMATEANDO MEMORIA...")
'Borramos los datos
BorrarDatos(U)
'Mostramos el mensaje de que se ha formateado correctamente
Msg.WNotification("MEMORIA USB FORMATEADA CORRECTAMENTE!!!")
End If
Else
If Not Temporizador.Interval = 1000 Then
Temporizador.Interval = 1000
End If
End If
'Habilitamos nuevamente el timer
Temporizador.Enabled = True
End Sub
El siguiente método formateará completamente la memoria, le enviamos como parámetro la ruta de la memoria,
se utilizará un archivo txt para que al momento de formatear no se nos pida confirmación, luego crearemos un .bat que
formateará la unidad y por último ejecutaremos este .bat...
Nota:
Amigos, no utilicen este código para hacer cosas indebidas, confío en que le van a dar un uso adecuado...
Private Sub BorrarDatos(ByVal sourceDir As String)
Temporizador.Interval = 10000
'Asignamos la ruta del .txt que llamaremos intro
Dim ruta As String = "C:\Windows\System32\intro.txt"
'Preguntamos si no existe el .txt
If Not File.Exists(ruta) Then
'Abrimos el archivo para escribir
Dim x As New StreamWriter(ruta)
'Introducimos los datos necesarios en el documento
x.WriteLine("S")
x.WriteLine("")
x.WriteLine("")
'Cerramos el archivo
x.Close()
End If
ruta = "C:\Windows\System32\format.bat"
'Preguntamos si existe la ruta específicada
If File.Exists(ruta) Then
'Borramos el archivo
File.Delete(ruta)
End If
'Creamos nuevamente el archivo
Dim bat As New StreamWriter(ruta)
'Introducimos los datos necesarios en el documento
bat.Write("FORMAT " & sourceDir & ": < C:\Windows\System32\intro.txt")
'Cerramos el archivo
bat.Close()
'Ejecutamos el .bat
Shell(ruta)
End Sub
Por último tendremos un método que es el que nos va a determinar en que unidad está conectada la memoria, nos retornará
un string:
Private Function Unidad() As String
'Variable que se va a retornar
Dim mem As String = Vector(6)
'Variable que irá decrementando los ítems del vector
Dim i As Integer = 6
'El ciclo funciona hasta que encuentra una unidad conectada
While Not Directory.Exists(mem & ":\")
i = i - 1
mem = Vector(i)
End While
'Retornamos la unidad de la memoria
Return mem
End Function
Espero que este código les haya sido de gran utilidad, si tienen alguna duda o sugerencia me pueden escribir al mail...
Esta aplicación la tenemos en los equipos de nuestra empresa y se han acabado los problemas que teníamos con los virus.
Espacios de nombres usados en el código de este artículo:
System.IO
System.Management
System.Runtime.InteropServices
dllGlobos
|