{"id":544,"date":"2011-03-11T00:18:34","date_gmt":"2011-03-11T06:18:34","guid":{"rendered":"http:\/\/www.lastdragon.net\/?p=544"},"modified":"2014-10-07T08:26:56","modified_gmt":"2014-10-07T14:26:56","slug":"llave-usb-para-aseguramiento-de-programas-con-c","status":"publish","type":"post","link":"https:\/\/www.lastdragon.net\/?p=544","title":{"rendered":"Llave USB para aseguramiento de programas con C#"},"content":{"rendered":"<p>Este tipo de sistema de seguridad es f\u00e1cilmente saltable para la mayor\u00eda de los programadores armados con un simple debuger, aunque para el grueso de la poblaci\u00f3n es una llave efectiva, muchos productos no conf\u00edan en las activaciones en l\u00ednea ni series que se ponen al instalar el programa por que los ven como inservibles, Ellos conf\u00edan en las llaves.<\/p>\n<p>En M\u00e9xico 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\u00f3digo \u00fanico en su hardware que el programa verifica antes de ejecutar la parte \u00fatil del programa, si la llave no est\u00e1 disponible, el programa se cierra y deja de ejecutarse.<\/p>\n<p>En la actualidad los puertos RS232 conocidos como COM1 y COM2 y el paralelo LPT1 ya est\u00e1n 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 \u00fanica y esta puede ser usada como llave.<\/p>\n<p>El siguiente c\u00f3digo de C# muestra c\u00f3mo obtener el numero de hardware de un USB<\/p>\n<blockquote><p>using System.Management;<\/p>\n<p>\n&nbsp;&nbsp;&nbsp; ManagementObjectSearcher theSearcher = new<br \/>\nManagementObjectSearcher(&#8220;SELECT * FROM Win32_DiskDrive WHERE<br \/>\nInterfaceType=&#8217;USB'&#8221;); <br \/>\nforeach (ManagementObject currentObject in theSearcher.Get()) <br \/>\n{ <br \/>\n&nbsp; ManagementObject theSerialNumberObjectQuery = new<br \/>\nManagementObject(&#8220;Win32_PhysicalMedia.Tag='&#8221; +<br \/>\ncurrentObject[&#8220;DeviceID&#8221;] + &#8220;&#8216;&#8221;); <\/p>\n<p>&nbsp;&nbsp; <\/p>\n<p>String nserieenhardware =<br \/>\n&#8220;USBSTOR\\\\DISK&amp;VEN_KINGSTON&amp;PROD_DT_101_II&amp;REV_1.00\\\\0019E02D40CFF9B0764A0D39&amp;0&#8221;;<\/p>\n<p>if (nserieenhardware == currentObject[&#8220;PNPDeviceID&#8221;].ToString ())<br \/>\nMessageBox.Show&nbsp; (&#8220;La llave USB esta conectada&#8221;);<\/p>\n<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <\/p>\n<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br \/>\n&nbsp;&nbsp;&nbsp; }<br \/>\n}<\/p><\/blockquote>\n<p>Como se ve yo en mi variable nserieenhardware ya tengo la serie, esto es por que antes de que el c\u00f3digo quedara de esta forma , primero obtuve el serial usando currentObject[&#8220;PNPDeviceID&#8221;] de esta manera solo tengo que comparar mi variable con su cadena estatica con lo que devuelva currentObject[&#8220;PNPDeviceID&#8221;].<\/p>\n<p>Este c\u00f3digo es mucho mas b\u00e1sico que uno para producci\u00f3n, por ejemplo aqu\u00ed dejo como texto simple la cadena del hardware que espero recibir, pero igual podr\u00eda convertirla en un HASH para dificultar su lectura.<\/p>\n<p>Para probar este c\u00f3digo, lo he metido en un programa C# con Windows Form y en el evento click de un bot\u00f3n, que la har\u00e1 de verificador de la llave, en un programa de producci\u00f3n el c\u00f3digo podr\u00eda estar en el evento de la ventana cuando termine de cargarse para que se ejecute por si solo al inicio.<\/p>\n<p>Prueba de concepto<\/p>\n<p><iframe loading=\"lazy\" width=\"420\" height=\"315\" src=\"\/\/www.youtube.com\/embed\/7Se-zVpw_E8\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este tipo de sistema de seguridad es f\u00e1cilmente saltable para la mayor\u00eda de los programadores armados con un simple debuger, aunque para el grueso de la poblaci\u00f3n es una llave efectiva, muchos productos no conf\u00edan en las activaciones en l\u00ednea ni series que se ponen al instalar el programa por que los ven como inservibles,&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-544","post","type-post","status-publish","format-standard","hentry","category-programacion"],"_links":{"self":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/544","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=544"}],"version-history":[{"count":1,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/544\/revisions"}],"predecessor-version":[{"id":1120,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/544\/revisions\/1120"}],"wp:attachment":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=544"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=544"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=544"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}