Protege tu programa en VB6 - I

Tamaño de letra:

Introducción.

Empezamos este nuevo ciclo intentando explicar cómo proteger un poco más nuestras aplicaciones realizadas en Visual Basic 6. Como hemos comentado en otros tutoriales tenemos principalmente dos formas de proteger nuestro programa: desde el mismo código o desde el programa ya compilado. En este tutorial vamos a hablar de la protección desde el código fuente. Vamos a tratar de poner las cosas difíciles con un sólo serial único en una aplicación con limitaciones. Este ejemplo que exponemos hoy aquí es muy básico y sencillo. En tutoriales posteriores lo complicaremos mucho más. La descarga de los archivos que se necesitan para seguir este tutorial se encuentran al final del artículo(abajo). En la descarga hay dos ejemplos: 001a -> es un ejemplo en VB6 de cómo NO se debe realizar una comprobación de serial, 001b -> es un simple ejemplo de cómo se ha escondido todo un poco de los ojos del cracking para ir entrando en materia. Debes analizar ambos códigos y cualquier duda que te surja será bienvenida.

Muchos programadores no se explican cómo es posible que en 3 minutos esté crackeada su aplicación que le ha costado en algunos casos años de trabajo... Pues aunque no te lo creas existen multitud de programas donde la protección anti-Cracking es mínima (casi nula). Seguramente el programador no entienda la forma de pensar de un Cracker pero vamos a verlo de la forma más sencilla posible. Este primer tutorial será muy sencillo.

 

Primer simple ejemplo

 

Exe de ejemplo en VB6

Abre el ejemplo vb6-001a. Ábrelo desde Visual Basic 6. Como puedes observar, seas programador experto o novato, es un código muy sencillo. Primeramente se abre una ventana que nos pregunta por un código de activación: si lo ponemos mal el programa será DEMO, si lo ponemos bien el programa será registrado y sin limitaciones.
¿Cuál es la limitación? Cuando es DEMO pone la palabra DEMO en el título de la ventana y además desactiva la tercera opción: "Color de fondo verde (sólo registrado)". Ejecútalo y observa.

Este programa es muy sencillo de crackear ya que deja muchísimas cosas a la vista que seguidamente veremos. Así a simple vista vemos que en el código fuente se comprueba directamente la contraseña:

If txt_code.Text = "karmany" Then
programa.Show
Else
...


y justo después de esa comparación se desactiva una opción:

programa.c03.Enabled = False

y además se pone en el título la palabra DEMO:


programa.Caption = programa.Caption & " DEMO"

¿Cómo piensa un Cracker?

Bien, para que el lector se pueda hacer una idea general:  imagina que depuras tu aplicación desde VB6. Como sabes, puedes poner breakpoints (Puntos de interrupción en VB6), puedes parar en un determinado sitio, puedes poner el cursor sobre una variable y te dice  el valor de la misma, puedes agregar inspecciones etc... pues un Cracker hace lo mismo... ¿Cómo que lo mismo?
Efectivamente, aunque tú lo haces desde VB6 el cracker lo hace desde el código ensamblador... y hará las mismas comprobaciones que tú. Entonces ahora viene una pregunta que te hago.. Viendo el código fuente, ¿Cuanto tardarías en encontrar un serial válido? Seguramente dirás segundos... pues un cracker te dirá lo mismo: segundos.

Sobre Visual Basic 6

La Edición Profesional y la Edición Empresarial de Visual Basic permiten compilar en código nativo. Hay dos formas de compilación: código nativo y p-code. Las antiguas versiones de VB compilaban en p-code. ¿Qué es mejor para tu programa? Esta es la pregunta que se hacen muchos programadores. La ayuda de Microsoft MSDN(Microsoft Developer Network) no es que lo deje muy claro. Un enlace interesante de la MSDN:

http://msdn.microsoft.com/en-us/library/aa240843.aspx

Existen bastantes diferencias entre una compilación u otra. La nativa tiene diversas opciones de optimización y depuración que no están en p-code. P-code (pseudo código) es un código intermedio, son opcodes que luego las librerías de VB tienen que "traducir" a código ensamblador. La mayoría de la gente prefiere compilar en código nativo. Para el tema que tratamos es mucho más sencillo crackear en nativo que en p-code. El cod. nativo se puede modificar rápidamente y es sencillo entenderlo, sin embargo, el p-code son opcodes y no es sencillo modificarlo y hacer pruebas. Mucha gente no sabe ni cómo modificar un VB6 compilado de esta última forma.

Pero aquí viene tu decisión. Si tu programa no es muy pesado y no requiere recursos tal vez deberías pensar en compilarlo en p-code por lo que te acabo de comentar.

Sobre el código fuente

Para proteger tu código, tienes primeramente que seguir dos consejos que considero esenciales:

1.-      Nunca hagas aparecer en memoria el serial correcto. Si observas el ejemplo 001a verás que se compara directamente: If txt_code.Text = "karmany" ¿Por qué es esto un error? Pues porque si se examinan (en el programa ya compilado) las cadenas de texto, "karmany" aparecerá. El serial "karmany" no es muy común pero si aparece "HEI3-FJDK6-HD78" pues llama enseguida la atención. Recuerda esto: el primer punto de referencia de un cracker son las cadenas de texto. De igual modo hay que eliminar ese DEMO, porque la palabra DEMO nos llevará rápidamente a la zona en la que nos registramos (llamada zona caliente). ¿Cómo se pueden evitar las cadenas de texto? Para el serial puedes pasar el ASCII a decimal o hexadecimal, hacer operaciones matemáticas y luego hacer la comparación. Con eso evitas que aparezca el serial directamente. Por ejemplo no es lo mismo:

If txt_code.Text = "karmany"


que como se hace en el ejemplo b esto:


For i = 1 To Len(txt_code.Text)
If (Asc(Mid(txt_code.Text, i, 1)) Xor serial(i + 1)) <> 1 Then Exit For
Next i

2.-     Evita que tu programa se registre totalmente con un simple "if->end if". Este error es también muy común y hace que tu aplicación esté crackeada en segundos. ¿Por qué hay que evitar esto? Porque un simple "if->end if" se convierte en código ensamblador en un simple salto condicional, y un cracker modificando un sólo un byte de tu aplicación ya compilada la dejará registrada. Hay que buscar formas de evitar este if aunque esto es algo más complejo de implementar ya que VB6 tiene bastantes limitaciones y no es como por ejemplo en Visual C++, que puedes ejecutar y crear directamente código ensamblador... en VB6 no es sencillo. De todos modos en tutoriales posteriores veremos cómo ejecutar ensamblador con VB6. Entonces... hay que buscar alternativas. En el ejemplo 001b se me ha ocurrido una forma muy utilizada: usar excepciones. Si no se cumple una condición, puedes crear una excepción y automáticamente el código será redirigido a otra zona. En el ejemplo b desbordo la variable integer que en VB6 tiene un límite superior de 32767 y hago que valga 32768. Por supuesto esto es una forma muy muy sencilla y que se ve a simple vista, pero imagina que creas una gran subrutina donde realizas operaciones con tu serial (algo que sea difícil de analizar) y finalmente en medio de ese código generas una excepción...

 

Parte de código fuente

 

Estos dos puntos son muy importantes. Una vez llegados a este punto, lo siguiente es un amplísimo abanico de posibilidades. Para empezar para este primer tutorial y no alargarlo mucho más, nos tiene que quedar claro que debemos hacer dos simples cosas:
1.-No mostrar ningún serial real en memoria (tanto en memoria dinámica como no) por ningún motivo
2.-Evitar el registro del programa con un simple "if-else if" o con alguna simple comparación.

Seguiremos analizando esto y mucho más en siguientes tutoriales. Cuando hayas leido hasta aquí, te darás cuenta que lo principal de todo esto es saber qué hacer. Tú eres programador, aquí te daremos consejos pero el mayor trabajo es tu imaginación. Existen millones de obstáculos, de verdad.

En el siguiente tutorial de protección sobre VB6 nos centraremos en las formas de evitar que un serial aparezca en memoria. Aquí hemos hecho unas simples operaciones matemáticas para que veas las diferencias. Examina el código del ejemplo 001a y después el código del ejemplo 001b y compara. Verás que ambos programas hacen lo mismo y sólo hemos añadido un poco de código más. Dejo también los ejecutables compilados en código nativo y p-code para el que quiera examinarlos.

Descarga de los ejemplos:

Última actualización: Martes, 12 Julio 2011
Comentarios  
0 # Jovenc 04-12-2022 15:11
como se Haria en visual basic Net?
0 # Editor 04-12-2022 15:59
Ufff! Ostras!
La verdad que no lo he intentado. Pero creo que no será difícil implantarlo en VB NET, pero lo importante no es el código es tener la idea. No compares nunca directamente el serial correcto en tu programa y evita que el registro de tu programa sea un simple if-else
0 # Anonimo 12-10-2022 17:05
excelente :-* :-* :-*
0 # Anonimo 12-10-2022 17:01
Buen Tutorial Amigo, como se Haria en visual basic Net?
0 # alex churrasco 22-04-2015 02:12
muy wueno me encanto

No tiene privilegios para responder a los comentarios.


 
Visitas: 8481253