Llave USB para aseguramiento de programas con C#

Este tipo de sistema de seguridad es fácilmente saltable para la mayoría de los programadores armados con un simple debuger, aunque para el grueso de la población es una llave efectiva, muchos productos no confían en las activaciones en línea ni series que se ponen al instalar el programa por que los ven como inservibles, Ellos confían en las llaves.

En México Programas como primavera entre otros requieren de tener una llave, la llave no es otra cosa que un dispositivo que se conecta al PC, originalmente esto era un aparato conectado aun puerto serie RS232 de 9 pines o a un puerto paralelo de 25 pines. Estos aparatos tienen grabados un código único en su hardware que el programa verifica antes de ejecutar la parte útil del programa, si la llave no está disponible, el programa se cierra y deja de ejecutarse.

En la actualidad los puertos RS232 conocidos como COM1 y COM2 y el paralelo LPT1 ya están extintos de la vida cotidiana, solo equipos profesionales cuentan con al menos un puerto COM1 Serial RS232. Sin embargo las llaves pueden evolucionar a los USB, cada USB de almacenamiento tiene grabada una llave en el hardware única y esta puede ser usada como llave.

El siguiente código de C# muestra cómo obtener el numero de hardware de un USB

using System.Management;

    ManagementObjectSearcher theSearcher = new
ManagementObjectSearcher(“SELECT * FROM Win32_DiskDrive WHERE
InterfaceType=’USB'”);
foreach (ManagementObject currentObject in theSearcher.Get())
{
  ManagementObject theSerialNumberObjectQuery = new
ManagementObject(“Win32_PhysicalMedia.Tag='” +
currentObject[“DeviceID”] + “‘”);

  

String nserieenhardware =
“USBSTOR\\DISK&VEN_KINGSTON&PROD_DT_101_II&REV_1.00\\0019E02D40CFF9B0764A0D39&0”;

if (nserieenhardware == currentObject[“PNPDeviceID”].ToString ())
MessageBox.Show  (“La llave USB esta conectada”);

           

        }
    }
}

Como se ve yo en mi variable nserieenhardware ya tengo la serie, esto es por que antes de que el código quedara de esta forma , primero obtuve el serial usando currentObject[“PNPDeviceID”] de esta manera solo tengo que comparar mi variable con su cadena estatica con lo que devuelva currentObject[“PNPDeviceID”].

Este código es mucho mas básico que uno para producción, por ejemplo aquí dejo como texto simple la cadena del hardware que espero recibir, pero igual podría convertirla en un HASH para dificultar su lectura.

Para probar este código, lo he metido en un programa C# con Windows Form y en el evento click de un botón, que la hará de verificador de la llave, en un programa de producción el código podría estar en el evento de la ventana cuando termine de cargarse para que se ejecute por si solo al inicio.

Prueba de concepto

14 Comments

Responder a Alejandro Ruiz Cancelar respuesta

Comment spam protected by SpamBam