Aporte: Protección de Aplicaciones con USB PenDrive

Aporte: Protección de Aplicaciones con USB PenDrive

Postby Cgallegoa » Thu Feb 21, 2008 6:26 pm

Hola amigos:

Aquí les paso unas pruebas que estoy haciendo para proteger nuestras aplicaciones contra la piratería.

http://mastersoft3000.com/publico/protect.zip

Parto de algunos premisas:

1.- La aplicación debe controlar constantemente la existencia de la llave USB correcta.
Se me ocurren dos formas: Usando un Timer (demasiado pesado), ó controlando en puntos críticos de la aplicación. Prefiero esta segunda forma.

En el ejemplo, al inicio de cada función invocada en el menú principal del progama se pone la rutina que controla la existencia de la llave y su correcta identificación.

Con esto evitamos que inicien la apliación en un PC, desconecten la llave, la pasen a otro PC y nos piratien

2.- Las rutinas de control no deben ralentizar de ninguna manera a la aplicación. Por esto creo que la la información correspondiente a la WMI se debe obtener una sola vez y al inicio, y guardar sus respuestas en variables a ser utilzadas posteriormente sin necesidad de volver a efectuar llamadas a la WMI. Esto incluye la indentificación de la unidad que tiene el control, ya que en un equipo puede estar conectado más de un USB a la vez, entonces, el control debe identificar cuál es la unidad a la que está conectado nuestra USB de seguridad.

Para guardar en variables utilicé la clase TPublic de Daniel Andrade (Alguien sabe qué es de él ?). Cada cual utilice el método que mejor le parezca.

3.- El control debería dar respuesta negativa en tres casos:
a.- NO hay USB conectado al equipo
b.- Hay USB conectado pero no está serializado (protegido)
c.- Hay USB y está serializado, pero el password no corresponde

Si se les ocurren más casos, por favor, aportenlos......

Falta encontrar la forma de controlar aplicacione en red: Por ejemplo, si un cliente adquire una apliacion para uso en un servidor y tres terminales, el programa debería ejecutarse en 4 equipos simultáneamente, cómo controlar que no haya un quinto equipo en ejecución ?

Así que amigos, aporto lo que tengo hasta ahora. Si les parece útil, por favor ayúdenme a completarla, de forma que fortalezcamos aún más a FIVEWIN y protejamos nuestras apliaciones sin encarecerlas con los altos costos que tienen las Llaves SENTINEL o HASP o cualquier otra (por hardware o software), y lo más importante, tenemos el código y el control a nuestra conveniencia.

Para probar adecuadamente el ejemplo que adjunto, primero por el menú "Set" seteen su llave. El password que elijan por favor escríbanlo al inicio de la Function Main() en Protect.prg:

oWMI:cElPassw := SuPassword

Recuerden que oWMI:cElPassw es generada con la clase TPublic. Pueden utilizar otro método. Sin embargo, para facilitar las pruebas, adjunto también la clase para quienes no la tengan. También adjunto el codigo con funciones de Marson de Paula a las que he hecho algunas modificaciones.

El ejemplo es un modelo básico. A partir de ahí, se puede sofisticar al gusto y necesidades de cada uno, tal como: Nombre de la aplicación, del cliente, prestaciones habilitadas o deshabilitadas, número máximo de terminales, fechas de vencimiento de Demos, etc. Todos estos datos se incorporan encriptados en el archivo "info.bin" (del ejemplo de Antonio). Sugiero que cada uno le ponga un nombre menos obvio a "info.bin". Creo que con imaginación las posibilidades son extensas. He hecho diferentes pruebas incluyendo fechas de vencimiento para Demos, y todo va OK. Sólo me falta lo del control de RED. Las pruebas las he realizado sobre Windows XP y Windows Vista y funcionan perfecto. Para Windows'98, creo que hay que instalar un parche de Microsoft que habilite el servicio WMI. No le he probado pues no tengo Windows'98 ni tampoco mis clientes.

El proceso de protección podría estar embebido en la aplicación a proteger, o mejor aún, en una DLL que se invoca desde el programa protegido.

La idea es que entre todos, si les parece, lo hagamos, y por supuesto, GRATIS Y CON CODIGO FUENTE INCLUIDO como aporte a todos los FIVEWINEROS (y por lo universal del código para todo el mundo), sin
egoísmos.

Ojalá regresáramos a aquellas maravillosas épocas del maestro Manuel Mercado, de Daniel Andrade, Ricardo Ramírez, Arturo Tamayo Daza, Hernan Ceccarelli, The Full, Ramón Avendaño, ufffff, la lista es laaaarga, quienes con una calidad humana extraordinaria y verdadero sentido de
compañerismo donaron su formidable código a la comunidad.

Espero sus comentarios, aunque sea para decirme que esto no sirve para nada. Todos son bienvenidos.

Un abrazo,

Carlos Gallego
Cgallegoa
 
Posts: 494
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador

Postby cuatecatl82 » Thu Feb 21, 2008 7:17 pm

Estimado Carlos Gallego:

Esta es una excelente aportación muchas feleicidades, estoy seguro que muchos colegas han pensado alguna vez en poder tener un control anti-pirateria para nuestros sistemas que hemos realizado y que nos han costado su tiempo y esfuerzo para poderlas realizar... y que mejor, que sea gratuito, con codigo fuente entendible a nosotros..

Mucho exito con esta pequeña aportación que estoy seguro, poco a poco empezará a ser más grandiosa..

Solo tengo una duda. He bajado los fuentes y los he compilado pero faltan 2 funiones:

GetDriveType() y GetLocalDrives(), lo he compilado con XMate, será problema del gestor de aplicaciones..

Si fuera posible publicar estas dos funciones para que quede completo.

Saludos..
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Postby Cgallegoa » Thu Feb 21, 2008 9:00 pm

Hola Cuatecatl82:

Gracias por tus palabras.

Las funciones GetDriveType() y GetLocalDrives() son de FWH. De pronto tenga que ver con la versión. Yo uso FWH 8.02. Qué versión usas ?

Sin embargo, buscando por el foro, encontre lo siguiente:

Post de Antonio Linares del 02-Abr-2006
<<Dos muy buenas funciones utilizando las API's de Windows. GetLocalDrives() devuelve un arreglo con los drives presentes, y GetDriveType() no retorna el tipo de drive consultado. >>

http://hyperupload.com/download/016e521c60/getdrive.zip.html


Post de Antonio Linares del 12-Nov-2007
#pragma BEGINDUMP

#include <hbapi.h>
#include <windows.h>

HB_FUNC( GETLOGICALDRIVES )
{
hb_retnl( GetLogicalDrives() );
}

HB_FUNC( GETDRIVETYPE )
{
hb_retnl( GetDriveType( hb_parc( 1 ) ) );
}

#pragma ENDDUMP


Prueba y me comentas si te funcionó

Saludos,

Carlos Gallego
Cgallegoa
 
Posts: 494
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador

Postby Cgallegoa » Thu Feb 21, 2008 9:14 pm

Hola Cuatecatl82

En complemento al post anterior, lo correcto es GetLogicalDrives() en vez de GetLocalDrives().

En la respuesta te puse un código que está en un link, y un código en C. Mejor usa este y olvídate del link

Saludos,

Carlos Gallego
Cgallegoa
 
Posts: 494
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador

Postby Cgallegoa » Thu Feb 21, 2008 9:46 pm

Hola amigos,

Una versión mejorada poco a poco:

http://mastersoft3000.com/publico/protect.zip

Saludos,

Carlos Gallego
Cgallegoa
 
Posts: 494
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador

Postby cuatecatl82 » Thu Feb 21, 2008 10:58 pm

Excelente: :D Ahora ya funciona, con las modificaciones que me mencionas he podido hechar a volar el candado con un Disco USB de 2Gb.

El problema es de xHarbour ya que estoy un poco resagado todavia, pero espero ponerme al corriente muy pronto..

Hare unas cuantas modificaciones si me lo permites :wink: , y en cuanto tenga un tiempesito cuento que modifique, para poderlo hacer mucho más funcional y potente todavía..

Saludos desde Chiapas, México... Y gracias por esta valiosa Aportación...

I.S.C. Víctor Daniel Cuatecatl León.
www.soldisoft.unlugar.com
www.sisa.unlugar.com
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Postby Cgallegoa » Thu Feb 21, 2008 11:02 pm

Victor,

Me alegro que te funcionara. Bajaste la úlitma versión. ?

La idea es que entre todos la desarrollemos y así nos liberemos de las llaves pagas.

Saludos,

Carlos Gallego
Cgallegoa
 
Posts: 494
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador

Postby cuatecatl82 » Sat Feb 23, 2008 12:15 am

Estimado Carlos: 8)

En efecto he bajado la actualización, pero no me queda claro aún cual es el proposito, ya que ahora puedes ingresar cuantas terminales y el nombre de la aplicación a proteger..

Sería posible que nos proporcionaras una idea mas completa de este candado..


Saludos...
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Postby Cgallegoa » Sat Feb 23, 2008 3:25 am

Hola Victor,

Supongamos que tienes dos aplicaciones, una que vendes en US $ 5,000 y otra en US $ 1000. El cliente te compra la de 1,000 para tres terminales, por lo cual me imagino cobrarás un recargo por cada terminal. Se me ocurre que el cliente podría tener también instalada en su computador la aplicación de 5,000, y hecho el vivo, el muy pícaro decide utilizar la USB que le diste. Dentro de la aplicación debería haber una variable que contenga el nombre del programa.

En uno díría cLaAplica:="MiApliacionde5000" y en el otro programa debería decir cLaAplica:="MiAplicacionde1000". (Los nombres con que tu quieras identificar tus programas)

Entonces, mi querido Victor, cuando haces el chequeo de la USB, obtienes de la misma el dato de a cuál aplicación está protegiendo, y este dato, lo comparas con la varible que tiene tu programa. Ejemplo

Flag en tu programa: cLaAplica:="MiAplicacionde5000" y la llave te devuelve cUSBAplica:="MiAplicade1000", luego comparas:

if cLaAplica == cUSBAplica
MsgInfo("Todo bien")
else
MsgInfo("No se pase de listo. Si quiere usar esta aplicación, paque por ella")
__Quit() // Chaoooo tramposo
endif

En general esa es la idea: que en la USB podemos tener la información que queramos, encriptada, con atributos de archivo "Escondido" y "Solo de lectura", y con control de CRC, etc., cuanta seguridad se te ocurra para que no te toquen el archivo en donde guardas tu información crucial, el cual estará indefectiblementado atado a la USB en donde lo pones. De esta manera, si te borran el archivo, o te lo cambian, o te lo alteran, o te lo copian a otra USB, en tu aplicación controlaras que nada de esto ocurra y evitarás que te piratien tu programa.

En cuanto a redes, en la llave guardas el número máximo de terminales que el cliente podrá usar. Recuerda que le vendiste para tres terminales, por lo tanto guardarás "3". En tu aplicación deberás ir controlando (en una base de datos super protegida, en un archivo binario, etc.) las terminales que van entrando. En esto estoy trabajando al momento para encontrar, si es que puedo y alquien nos ayuda, cuál es el mecanismo más seguro. Pero para el ejemplo supongamos que usamos una base de datos.

BaseControl.dbf (Usa un nombre bien complicado para despistar al enemigo)

Al inicio de tu aplicación, si los datos de control obtenidos de la USB están bien y el usuario puede continuar usando el programa, lo primero que debes hacer es agregar a la base la información de la terminal que ingresa (puedes usar NetName() o GetMacAddress() - eso está por determinarse) y cuentas cuántos registron tienes (Terminales que la están usando). Ese dato lo comparas con lo que guardaste en la USB y que cuando lo recuperas lo guardas en una variable nNumMaxTerm:=Val(de lo que tienes en la USB, 3 en el ejemplo)

If BaseControl->(OrdKeyCount()) < NumMaxenUSB
__dbAppend()
_Field->Terminal := NetName()
else
MsgInfo("Lo sentimos, ya completó su cupo de uso. Si desea usar una terminal más por favor cierre la aplicación en alguna terminal donde la esté usando, ó, no sea mala gente, compre la adicional")
__Quit() // Chaoooo
endif

Deberás tener en cuenta que en EXIT PROCEDURE siempre debes borrar de la base la terminal que salga de manera que siempre esté acutualizada. Me falta encontrar la forma de cómo hacerlo si la aplicación se cae intempestivamente (por ejemplo, por corte de luz).

En resumen: No se si has usado llaves como SENTINEL. La idea es que trabajen lo más cerca posible a como ellas lo hacen. Yo las uso, pero tiene un costo alto, a veces no hay buen soporte, a veces no tienen en stock y, lo más importante para mí, es que dependo de terceros para la seguridad de mis programas, y eso, no me gusta.

Puedes parametrizar tu llave para monousuario (un solito computador), redes, etc, y parametrizarla y acomodarla a tu gusto y necesidades dependiendo únicamente de tí.

Volviendo al tema de redes, envío un SOS a los expertos en SOCKETS, de pronto por ahí se puede hacer en control. No he encontrado hasta el momento la forma de poder saber en tiempo real, vía hardware, y nó solo por lo que guardo en la base de control, qué terminales están accediendo a la aplicación en un momento determinado.

En todo caso, yo ya lo estoy probando en aplicaciones pequeñas para clientes de un sólo equipo y hemos hecho todas las pruebas posibles para violar la la seguridad y seguimos vírgenes (de pronto ha faltado malicia). Entonces ahora, esas apliaciones ya no las entregamos en CD, sino en USB (ahi incluímos el instalador) y cuando las instalan, el sistema genera un serial, el cliente me lo envía por Internet, le genero la Clave de acceso, y a partir de ahí la llave queda SETEADA y asegurada. Me está funcionando bien. Las USB las compro a US $ 8.oo y quedo como un rey.

Repito, estoy en fase de prueba, por lo que las estoy comenzando a usar en aplicaciones de bajo costo (US$ 80 a US$200), en donde si alguien me da en la cabeza, no me afecte mucho. En aplicaciones de costo importante, US$ 1,000 para arriba, me esperaré un poco más hasta estar seguro de lo que hago y de que no hay riesgo. Si todo sale bien, controlaré mis aplicaciones con sólo US$ 8.oo, si nó, pues seguiré pagando el alto costo que me cuestan las SENTINEL y dependiendo de lo que ellos hagan.

Respecto a la opción "SET" en el menú, es una simple idea de cómo sería una interfas para que tú setees la USB. Esta opción la deberás poner en un programa aparte que sólo tú controlarás, NUNCA incluírla en las aplicaciones que envíes a tus clientes. Por comodidad en el programita de prueba la puse como una opción más para, por aquello de la pereza, desde ahí mismo jugar con diferentes configuraciones a la USB, pero, repito, esa será tu arma secreta.

No sé si toda esta perorata te ha despejado en algo tus dudas, ojalá que sí.

Un abrazo,

Carlos Gallego
Cgallegoa
 
Posts: 494
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador

Postby Antonio Linares » Sat Feb 23, 2008 11:26 am

FWH 8.02 proporciona un ejemplo completo en samples\protect.prg de protección de aplicaciones usando un pendrive (llave usb)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby cuatecatl82 » Sat Feb 23, 2008 4:02 pm

Estimado Carlos:

Me quedó más que clara tu idea y cuenta conmigo para poder mejorarla, si gustas podemos entre los dos optimizarla al maximo compartiendo ideas, de hecho realize unas modificaciones a la primera versíon, tanto esteticos como de programación, ahora que tengo la idea de lo que necesitas plasmar en esta aportación me daré a la tarea de agregar lo que mejoraste en tu segunda actualización. Si gustas te doy mi correo personal para que compartamos ideas y por su puesto nuestros codigos fuente.. danyleon82@hotmail.com

Estos son los cambios que realize, checalos y me dices..

http://rapidshare.com/files/94259399/Pruebas.zip.html




Saludos Maestro Linares:

Gusto en saber de usted, en efecto, sabemos que a partir de la versión 2008 de Fivewin ya cuenta con esta valiosa herramienta, pero para aqullos como yo que todavía no nos actualizamos por motivos economicos necesitamos de esta valiosa herramienta, y nos vemos en la necesidad de buscar alternativas a nuestro alcanze como esta...

Esperando seguir con su apoyo.. :lol:

I.S.C. Víctor Daniel Cuatécatl León.
www.sisa.unlugar.com
www.soldisoft.unlugar.com
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Postby Cgallegoa » Sat Feb 23, 2008 6:23 pm

Hola Antonio:

Por supuesto que partí desde tu ejemplo samples\protect.prg. Discúlpame si no lo mencioné antes.

Lo que pasa es que en tu ejemplo está sólo como parametrizar la USB. De ahí, a controlar EFICIENTEMENTE una aplicación (Sin riesgos de seguridad y sin afectar perfomance), hay un largo trecho. Lo que quise hacer es cómo aplicarla al software que se va a proteger, y lo más importante, cómo controlar una aplicación en RED.

Soy un usuario intensivo de Llaves SENTINEL SUPERPRO y SENTINEL NET y pienso que con la base que tú nos diste, podemos construír nuestro propio sistema de llaves, los más cercano posible a cómo funcionan las SENTINEL, logrando con esto abaratar costos y sobre todo, tener 100% control de lo que hacemos, lo que me parece lo más interesante. Y claro, poner el código resultante a disposición de todos los usuarios de FIVEWIN.
Este año inicié con el propósito de que las cosas nuevas que fuera logrando y que pensara que fueran de interés público, las voy a donar, con todo su código fuente, a la comunidad Fiwenera con un único interés: Aportar un granito de arena para su fortalecimiento y de esta manera, retribuír por todo lo que he recibido de ella.

Pero, por la poca participación que ha habido en este hilo, me da la impresión de que, o me embarqué en una quijotada, o que no llama la atención el uso de USBs para controlar la antipiratería, o que los compañeros ya están asegurando sus aplicaciones con USB y yo ando despistado queriendo enteder porqué el agua tibia es tibia. Si es esto úlitmo, pues hombre, compartan la información, y ojalá el código, y si esto no nace del corazón, pues póngalo a la venta, que de pronto habemos algunos interesados. Sigo pensando que sería regio que lograramos una adecuada sustitución de las mochilas comerciales existentes a través de nuestro propio código, con FiveWin. Tú que opinas ?

Un abrazo,

Carlos Gallego
Cgallegoa
 
Posts: 494
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador

Postby Antonio Linares » Sat Feb 23, 2008 7:01 pm

Carlos,

Tu iniciativa me parece muy buena, y de hecho eso es lo que buscamos muchas veces desde FiveTech: el "abrir puertas", el ofrecer posibilidades de hacer cosas nuevas.

El que exista más ó menos interés, es algo que ya no depende de nosotros :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby Cgallegoa » Sat Feb 23, 2008 7:28 pm

Antonio,

Entendido Maestro. Con tu palmadita en el hombre me basta para continuar. :lol:

Ahora, la pregunta del millón: Cómo controlar en RED. A través de Sockets, o qué recomiendas ?

Saludos,

Carlos Gallego
Cgallegoa
 
Posts: 494
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador

Postby Cgallegoa » Sat Feb 23, 2008 8:10 pm

Hola Victor,

Me alegro de que ya tomaras la idea. Vi tu ejemplo y está perfecto. Sin embargo, si te parece, sigamos trabajando sobre la segunda versión. Recuerda que lo ideal es que podamos parametrizar en la llave (mochila como la llaman por esos lares) la mayor cantidad de información posible para hacerla SUPER VERSATIL. Has trabaja con llaves Sentinel o algún tipo parecido ?

En otras palabras, que la llave pueda controlar:

- Que es la correcta y UNICA autorizada para el software que se controla.
- Que en TODO el tiempo en que la apliación esté en uso, la llave esté conectada y sea la UNICA autorizada.
- Que si se presenta alguna irregularidad al inicio de la aplicación impida su ejecución.
- Que si se presenta algún tipo de irregularidad estando en uso la aplicación, se avise al usuario e impida que se siga ejecutando.
- Que permita definir Fechas de vencimiento para Demos. en días, horas, etc.
- Que permita definir Número de veces en uso para Demos.
- Que permita definir Número MAXIMO DE TERMINALES a acceder simultáneamente (RED) a la aplicación.
- Que permita definir cuáles partes o prestaciones de la aplicación y cuáles no, se puedan usar
- Que permita definir proteger a través de la MISMA llave a más de una aplicación.
- Que permita parametrizar número de cuotas y fechas de vencimientos para venta de nuestras aplicaciones a crédito.
- Que se pueda parametrizar vía internet. Ejemplo: El usuario adquirió el derecho de uso para 3 terminales, y como el condenado es próspero y en crecimiento, nos compra una cuarta terminal, entonces, que vía internet podamos hacerle el ajuste a la llave para que use sus 4 terminales.
- Que lave y planche la ropa y cocine el almuerzo........... :D

Esa es la idea: Super versatilidad, recontra seguridad, que no afecte para nada la velocidad y estabilidad de ejecución de las aplicaciones protegidas, y que sea muy fácil de implementar. Con muy pocos ajustes en nuestro código tenemos un blindaje, a un ínfimo costo y controlado 100% por nosotros mismos, contra los piratas o clientes vivos que nos quieren aprovechar.

En consecuencia, el proyecto debe tener tres partes importantes:

1.- Todo el proceso de seguridad y control de las llaves.
2.- La Interfase de Parametrización, mediante la cual setearemos las llaves a enviarle a los clientes.
3.- Guías para implementación de la seguridad en nuestras apliacaciones. Sugerencias de cómo y en qué partes implementarla. Por supuesto, esto estará a criterio de cada uno. Simplemente sugeriremos guias de uso.

Creo que todo este proceso, más que en código procedural, debería orientarse hacia Objetos, por lo que, de pronto, valga la pena crear una Clase TProtect y seguir en esa vía. Acepto sugerencias pues el desarrollo de Clases no es mi fuerte. :cry:

Saludos,

Carlos Gallego
Cgallegoa
 
Posts: 494
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 107 guests