ESTUDIO COLECTIVO DE DESPROTECCIONES
Última Actualizacion: 25/10/2001

Programa Quitanag 1.00 W95 / W98 / NT
Descripción Cargador para eliminación de nags con fuentes comentadas.
Tipo Tutorial técnicas de cracking.
Tipo de Tutorial [X]Original, []Adaptación, []Aplicación, []Traducción
Url  
Protección Nag Screen
Dificultad 1) Principiante, 2) Amateur, 3) Aficionado, 4) Profesional, 5) Especialista
Herramientas Compilador de C para Windows, Spy++ y un editor gráfico.
Objetivo Eliminar Nag Screens.
Cracker Mr.Blue
Grupo Whiskey Kon Tekila
Fecha 2 de Abril de 2000

INTRODUCCION

De todos es conocida la manía de los programadores shareware de recordanos continuamente que la versión que estamos utilizando no está registrada. Debe aterrorizarles que los usuarios se olviden de que están utlizando versiones shareware.

Quién haya leído mi tutorial para crackear el Cuentapasos 3.75 rev 372, recordará como nos deshacíamos de la nag inicial del programa. En ese tutorial se describía, de manera muy somera la manera de simular pulsaciones del ratón desde código, para pulsar "virtualmente" el botón de 'Aceptar' sin necesidad de intervención del usuario.

En este tutorial profundizaremos en esta versátil técnica que nos permitirá hacer muchas otras cosas, aparte de simular clics de ratón. Se presentará una pequeña aplicación, escrita en C para que nadie tenga excusa de que no se entera, que leerá los datos necesarios de un fichero .INI, datos que necesita el programa para localizar el botón que debemos pulsar. Esta facilidad permitirá configurar el programa según la aplicación "vícitma" y las características de su nag.

Vistazo general

Nuestro objetivo serán las nagscreens que aparecen en casi cualquier programa shareware nada más arrancarlo, y que obligan al usuario a pulsar un botón determinado. El diseño de las nags es muy variado, pero en todas hay un botón que es el que usuario debe pulsar.

Variaciones más comunes:

  1. Algunos programadores "malévolos" inhabilitan dicho botón durante uno o más segundos para intentar obligar al usuario a que se lea la nag.
  2. Otros programadores, aún más "malvados", aleatorizan la posición del botón a pulsar, cambiándolo de sitio entre ejecución y ejecución y obligando igualmente al usuario a echarle un vistazo a la nag.
  3. Finalmente, otros programadores que hacen sus "deberes" y que conocen como las gastan algunos crackers, "ocultan" la funcionalidad del botón deseado. Para ello, en lugar de colocar en el botón el texto adecuado, 'Ok' o 'Aceptar', incrustan una imagen de ese mismo texto. Esto, como se verá más adelante, lo único que logra es complicarnos un poquito más la tarea de localizar el botón a pulsar.

Ejemplo de estas "complicaciones" es la nag del Cuentapasos, que a partir de la revisión 379 de la versión 3.75 incorpora simultáneamente todas estas complicaciones.

Nuestro QuitaNag, deberá en primer lugar arrancar la aplicación "víctima", localizar la nag cuando ésta aparezca, localizar el botón correcto dentro de la nag y finalmente pulsarlo. La aplicación QuitaNag debe encontrarse en el mismo directorio que el ejuctable "víctima", en donde también debe encontrarse el fichero de configuración "QuitaNag.ini" con todos los datos correspondientes a la aplicación víctima.

Aquí teneis el QuitaNag 1.00 con el código fuente.

Buscando ventanas

Para abreviar me salto toda la inicialización del programa durante la cual localizará el fichero "QuitaNag.ini", que debe estar presente en el mismo directorio de la aplicación, cargará los datos de configuración y arrancará a la "víctima". Todo esto viene convenientemente comentado en los fuentes del programa.

Para distinguir la nag del resto de ventanas que puede abrir la aplicación, utilizaremos el caption o título de la ventana, para lo que examinaremos todas la ventanas que correspondan a la aplicación y nos quedaremos con aquella en la que muestre en su título una cadena determinada, utilizada para distinguirla de las restantes ventanas.

Necesitamos una función que nos liste las ventanas que creadas por un determinado proceso. Esto lo realizará EnumThreadWindows. Los parámetros son los siguientes:

  1. Identificardor del proceso.
  2. Dirección de la función de callback.
  3. Parámetro para la función de callback.

El primer parámetro no es más que el identificador del proceso del cual queremos obtener la enumeración de sus ventanas. Este identificador nos lo devuelve la función CreateProcess tras arrancar la aplicación.

El segundo parámetro es la dirección de la función que se encargará de distinguir "nuestra" ventana de las restantes. Por cada una de las ventanas de la aplicación, EnumThreadWindows invocará a esta función de callback pasándole como parámetros el handle de la ventana y los parámetros que le pasamos en tercer lugar.

La enumeración finalizará cuando se hayan enumerado todas las ventanas creadas por el proceso "objetivo", o bien cuando la función de callback desee finalizar la enumeración. En nuestro caso, la función de callback abortará la enumeración cuando haya encontrado la ventana que busca.

La función de callback puede ser más o menos complicada según la complejidad que entrañe la localización de la nag. En nuestro caso será sencillito ya que vamos a suponer que con el título de la ventana ya es suficiente. En otros casos, puede que el título no nos baste para distinguir la nag de otras ventanas.

El título que buscamos es el que hemos leído del fichero de configuración, y la función encargada de devolvernos el título de una ventana es GetWindowText. Nuestra función de callback, que he bautizado como BuscaVentana, solo tiene que verificar si el título que le devuelve GetWindowText contiene la cadena que buscamos o no.

Se ha incluído en QuitaNag un temporizador también configurable que evita que el programa se quede buscando indefinidamente una ventana. El valor de este temporizador debe ser ligeramente superior al tiempo que tarda la aplicación en crear y mostrar la nagscreen desde que se comienza a ejecutar, lo cual también depende de lo rápida que sea la máquina en donde se ejecuta...

Buscando botones

Una vez localizada la ventana, nos queda buscar el botón que debemos cliquear para que la nag deje de darnos la tabarra...

Al igual que existen funciones para enumerar ventanas padre como la nagscreen, también hay funciones para enumerar ventanas hijas como nuestro botón. El botón que buscamos es una de las ventanas hija de la nagscreen que hemos localizado. La función adecuada es EnumChildWindows que tiene un funcionamiento idéntico a EnumThreadWindows, con la salvedad que en este caso se usa el hadle de la ventana padre que contiene los controles que nos interesan, en lugar del identificador del proceso.

En este caso la búsqueda del botón es algo más compleja, ya que vamos a suponer que el botón cambia de sitio (por lo que no podremos localizarlo por sus coordenadas) y que el botón no contiene texto, sino una imagen (no podremos localizarlo por su caption). La identificación del botón será por el color de uno sus píxeles... y me explico con un ejemplo. Si en la nag hay dos botones, cada uno con la imagen de un texto distinto como 'Aceptar' y 'Salir', buscamos con un editor gráfico en qué pixel se diferencian ambos botones, anotamos las coordenadas relativas a la esquina superior izquierda del botón y el color RGB de ese pixel en el botón que nos interesa... Las coordenadas del pixel "identificativo" y su color serán la tarjeta de identidad de nuestro botón. Y esto se hace así porque tampoco es cuestión de hacerse un OCR para distinguir entre dos o tres botones ;-)

La callback correspondiente a EnumChildWindows, que aparece en las fuentes como BuscaBoton, lo primero que comprueba es que el handle actual corresponde a un botón, ya que en una nag pueden haber muchos más controles aparte de los botones. Esta discriminación entre botón y no botón la realiza usando la clase de la ventana hija...¿ y cuál es la clase de un botón? Esto dependerá de la aplicación y del lenguaje que se haya utilizado para crearla. Por ejemplo, los botones de aplicaciones realizadas en Visual Basic son por defecto de la clase ThunderRT5CommandButton. El nombre de la clase puede determinarse con cualquier espía de Windows, como el Spy++ de Microsoft, que nos muestre información relativa a las ventanas existentes en todo momento y de los controles de las mismas. En el código, la función utilizada para verificar la clase de un determinado control o ventana es GetClassName.

Si el handle que le ha llegado a la función de callback es un botón, debe comprobar si el pixel "identificativo" es del color que debe ser. Antes de capturar color del pixel del botón debe traerlo a primer plano, ya que si no capturaríamos el color del pixel de la ventana que se pudiera encuentrar en primer plano, solapada a nuestra nag. SetForegroundWindow nos servirá para este propósito. El uso de EnableWindow permitirá (en algunos casos) habilitar el botón sin tener que esperar a que lo habilite el temporizador dispuesto por el programador para obligarnos a tragarnos la nagscreen durante varios segundos...

Una vez que nos hemos asegurado que nuestro botón se encuentra en primer plano y habilitado, sendas llamadas a GetDC y GetPixel nos devolverán el color del pixel que queramos, en formato RGB.

Si el botón es el que buscamos, finalizamos la enumeración y lo pulsamos enviándole un mensaje BM_CLICK con la función PostMessge.

QuitaNag

El funcionamiento del QuitaNag es muy sencillo. Lo ilustraremos con un ejemplo como el Cuentapasos... y si alguien piensa que le tengo manía al Cuentapasos, lo uso porque es uno de los pocos ejemplos en los que el autor ha incluído todas las "complicaciones" imaginarias... y además es todo un clásico nacional que hay que promocionar... ;-)

Qué datos necesitamos:

  1. Nombre del ejecutable: 'cpasos32.exe'
  2. Subcadena del título de la nag que usaremos para identificarla: 'Versión de Evaluación'

Nos quedan los datos relativos a la identificación del botón... Arrancamos el Cuentapasos y una vez mostrada la nag, con el Spy++ (o equivalente) visualizamos la información correspondiente al botón etiquetado como 'Aceptar'. Ya tenemos otro de los parámetros:

  1. Clase del botón: 'ThunderRT5CommandButton'

Y para localizar el pixel "identificativo" del botón, capturamos la nag en el portapapeles con 'Alt' + 'Imp Pant.'. Con nuestro editor gráfico preferido visualizamos la captura de la ventana y buscamos un pixel que nos permita distinguir el botón con la imagen 'Aceptar' de los otros dos. Por ejemplo, el pixel de coordenadas (22,15) es de color negro (0 en RGB) solo en el botón 'Aceptar'. Ya tenemos lo que nos falta:

  1. Coordenadas: (22,15)
  2. Color: 0

Para el temporizador colocamos un tiempo holgado, que asegure que no salta error aunque tengamos el Windows muy sobrecargado y tarde mucho el Cuentapasos en mostrar la nag.

El fichero 'quitanag.ini' para el Cuentapasos quedaría así:

  • ; QuitaNag 1.00 por Mr.Blue/[WkT!2000]
  • ;
  • ; Ejemplo Cuentapasos 3.75
  • [Nag]
  • titulo=Versión de Evaluación
  • fichero=cpasos32.exe
  • clase=ThunderRT5CommandButton
  • coordx=22
  • coordy=15
  • colorRGB=0
  • Milisec=15000

Este fichero .INI y el ejecutable del QuitaNag los colocamos en el directorio de instalación del Cuentapasos. Cambiamos los accesos directos para que apunten al ejecutable del QuitaNag y... podemos disfrutar de nuestros 30 días de evaluación olvidándonos de la molesta nag... ;-)

Conclusiones

El QuitaNag, a pesar de sus limitaciones, puede funcionar con la gran mayoría de nag-screens que se pueden encontrar; otras más retorcidas precisarán alguna modificación en el código. Modificando convenientemente las fuentes pueden crearse programitas mucho más complejos. BM_CLICK no es el único mensaje que puede enviarse a un control o ventana...

La técnica explicada no es nueva, ya ha sido ampliamente utilizada. Señal de este uso es que el propio Cuentapasos complica la nagscreen para evitar que esta tarea no sea tan sencilla.

Lo interesante que ofrece esta técnica es la posibilidad de automatizar tareas rutinarias, simulando acciones del usuario ahorrándole al mismo tareas repetitivas, o incluso la posibilidad de utilizar un programa antiguo que no dispone de interfaz DDE o similar, desde otra aplicación diseñada por nosotros... o incluso gastarle una broma a algún amigo abriéndole el bloc de notas y simulando pulsaciones sobre el mismo... XDDD

En fin, infinitas posibilidades que pueden solucionarnos más de un problema sin aparente solución. Para que luego digan por ahí que lo que se aprende crackeando un programa no tiene otras utilidades más variadas....

Agradecimientos especiales a Manuel Tobarra.... gracias a él y a sus desvelos a la hora de proteger su Cuentapasos he aprendido estas "maravillas".... ;-)

Mr.Blue [WkT!]

[ Entrada | Documentos Genéricos | WkT! Web Site ]
[ Todo el ECD | x Tipo de Protección | x Fecha de Publicación | x Orden Alfabético ]
(c) Whiskey Kon Tekila [WkT!] - The Original Spanish Reversers.
Si necesitas contactar con
nosotros , lee esto antes e infórmate de cómo puedes ayudarnos