Llave USB para aseguramiento de programas con C#
By: Date: marzo 11, 2011 Categories: Programación

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 thoughts on “Llave USB para aseguramiento de programas con C#

  1. Internet Explorer 8.0 Windows 7

    Pues si, pero no tendria mucho sentido, el resto del codigo es el codigo de la ventana, el boton y el evento click del boton, el codigo que realmente hace la deteccion esta publicado ahi en el articulo… el resto del codigo es de la libreria Windows Form que igual podria ser sustituido por Cocoa o GTK o en una de esas QT para los que les gusta KDE

    Mi consejo es que abras tu visual studio o tu ide, simplemente arrastres un boton y le metas codigo que publique en el evento Click del boton,

  2. Google Chrome 10.0.648.133 Windows 7

    He creado una aplicación sencilla que hace lo mismo que la tuya, pero ademas te proporciona tu código único con la función que arriba mencionas…

    No conocía este método para validar software, y he aprendido un poquito sobre C#

    La verdad que este tipo de publicaciones me encantan, ojala puedas postear más seguido de este tipo! Saludos desde la ciudad de México!

    PS. No conocía el SharpDevelop ya lo tengo instalado!

  3. Mozilla Firefox 3.6.15 Ubuntu Linux

    Rodrigo, este codigo practicamente es lo que quieres, solo agrega el objeto integer

    Si te das cuenta tengo un loop

    foreach (ManagementObject currentObject in theSearcher.Get())

    Cada USB conectado es una vuelta, si en codigo me pongo a contar las veces que repite el bucle, podria saber cuatos dispositivos estan conectados con solo agregar un entero e incrementarlo en cada vez

  4. Mozilla Firefox 10.0.2 Windows XP

    serias tan amable de decir donde entrar al programa por mas que veo el video no se como iniciaste, solo aparece el proyecto pero ni idea de donde o como jalo la usb llave gracias

  5. Google Chrome 29.0.1547.66 Windows 7

    Saludos, no soy programador ni nada por el estilo, no entiendo mucho de estos temas, pero me interesa copiar un llave que viene con unos equipos GPS para procesar unos datos en el software Topcon Tools, lo que necesito saber es como copiar esa llave a una usb común y corriente sin usar C#, ya que no dispongo de este en mi computador ni mucho menos lo se usar, tal vez si es posible realizar en C++ cmd, de windows 7. Espero disculpe mi jerga ya que no domino los temas informáticos. Gracias

  6. Google Chrome 51.0.2704.103 Windows 7

    Perdon la ignorancia soy nuevo en esto, podrias decirme cual seria el problema en este codigo que envio, pues omiti algunas lineas de tu codigo y me funciona perfectamente, quisiera saber que funcion tendrian esas lineas de codigo que omiti.
    Gracias, espero respondas.

    /*********************************/
    ManagementObjectSearcher theSearcher = new
    ManagementObjectSearcher(“SELECT * FROM Win32_DiskDrive WHERE InterfaceType=’USB'”);
    String llave_usb = “SERIE DEL HADWARE DE LA USB”;
    bool validar = false;
    foreach (ManagementObject currentObject in theSearcher.Get())
    {
    if(llave_usb == currentObject[“PNPDeviceID”].ToString ())
    {
    validar = true;
    }
    }

    if(validar == true)
    {
    MessageBox.Show(“Llave conectada”);
    }
    else
    {
    MessageBox.Show(“Llave no encontrada”);
    }

    /*********************************/

  7. Google Chrome 62.0.3202.94 Windows NT

    amigo tengo sofware el opty-way que funciona con una usb key. quiero saber como puedo hacer que funcione sin tener que conectar el usb key…

Responder a Isaac Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *