| ESTUDIO COLECTIVO DE DESPROTECCIONES Última Actualizacion: 25/10/2001 |
Programa | English-Spanish Interpreter 2000 | W95 / W98 / NT
Descripción | Traducción y lectura de textos.
Tipo | Demo totalmente funcional. Número limitado de usos (4)
Tipo de Tutorial | [X]Original, []Adaptación, []Aplicación, []Traducción
Url | http://ssl.pair.com/magicw
Protección | Serial / Malfuncionamiento una vez superado numero de usos
Dificultad | 1) Principiante, 2) Amateur, 3) Aficionado, 4) Profesional, 5) Especialista
Herramientas | SoftIce v3.25 y TechFacts95
Objetivo | Uso ilimitado
Cracker | MrCrimson
Grupo | Whiskey Kon Tekila
Fecha | 25 de Agosto de 1999
INTRODUCCION
La primera vez que ejecutamos este software aparece una splash de tintes futuristas que se desvanece para dar paso a un programa totalmente funcional. La segunda vez ocurre lo mismo. A la tercera ocasión, aparece además una NAG más fea que un pecado que nos recuerda que SÓLO nos quedan 2 usos del programa y nos da a elegir entre teclear un ‘Registration Number’ o proceder en modo ‘Free Demo’. Después de insistir en el penoso recordatorio, y una vez agotados los 4 usos volvemos a ejecutar para encontrar una curiosa amenaza: “El programa NO funcionará correctamente a partir de ahora”.... Ñtchs...! Donde habeis estudiado marketing...? Por correspondencia...? NUNCA se debe degradar el producto que se vende. Ni siquiera para protegerlo. Crea mala imagen. Pero veamos como se lleva a cabo la amenaza. Durante los 4 primeros usos “DEMO”, pedi la traducción al castellano de: “Do you think I am completely stupid?.” A lo que el bicho respondio (con una voz que la daba un susto al miedo): “Piensa usted que soy completamente estúpido?.” Cuando formulé la misma pregunta en modo “EXPIRED” el muy imbécil respondió: “Hace usted lo imposible?.” Despues de probar algunas frases, comprendi que, sin registrar, generaba las traducciones de forma aleatoria....
PRIMER INTENTO: EL ALGORITMO DEL NUMERO DE SERIE
El primer intento, como siempre, es obtener el algoritmo de comprobación del número de serie e invertirlo para generar un keymaker. El algoritmo, en este caso, es un genuino ejemplo de spaghetti-code que activa, durante la comprobación de validez, un elevadísimo número de flags no binarios que son chequeados durante toda la sesión de uso del software... Ok, no es imposible pero puede llevar muchas, muchas horas trazar toda esta porquería. Ok Boyz, esto demuestra que al igual que existen cracks de fuerza bruta también se pueden encontrar protecciones de este estilo, donde la falta de originalidad se suple con miles de líneas de código de chequeo redundante (el exe principal tiene 3,4 Mb!!!). Desde el punto de vista del programador será un éxito... aunque ello implique tener que bajarse 20Mb para 4 usos de evaluación. Es bien sabido que MrCrimson debe atender a diario una infinidad de compromisos amorosos y por ello, la opción más rápida tomó cuerpo definitivamente: Let’s crack!
SEGUNDO INTENTO: TECHFACTS 9x
La pregunta de siempre: ¿Cómo sabe esta bestezuela que hemos agotado el número de usos permitidos?. La información al respecto debe haberse almacenado en: El registro Algún fichero INI En algún fichero de la instalación Alguna combinación esoterica de las anteriores Para saberlo usamos TechFacts95. Que se puede decir de esta joyita que no se haya dicho ya...? Bueno, pues os la recomiendo porque sólo hay una cosa peor que NO tener información y es TENER DEMASIADA. Eso es lo que sucede a menudo con el clasico Regmon, por ejemplo. Trazar TODAS las ocurrencias en el registro durante la ejecución de un programa suele reportar cientos de lecturas/escrituras que dificilmente nos permite ver las cosas con claridad. TechFact, entre otras muchas cosas genera un informe compacto de cambios en el sistema (INIs, ficheros en general, Registro, etc) ocurridos al ejecutar un programa. Al aplicarlo a este caso, NO reportó ningúna modificación relevante... nada en el registro, nada en ficheros, nada en INIs... Era de esperar. Una vez que ha expirado el programa ya no se hace ninguna modificación y por tanto es indetectable el mecanismo de conteo de usos... Así las cosas volvemos al origen para tener de nuevo el programa recien instalado. Ahora SI monitorizamos con TechFacts los cambios en las sucesivas ejecuciones del programa (las 4 primeras modo ‘demo’ y las sucesivas en modo 'Mal-function’: 1ª ejecución: se crean algunas entradas en el registro que tienen por nombres cosas como: Custom Colours, Custom Windows, General Settings y cosas por el estilo... Y algo más...aparece una key llamada: HKEY_LOCAL_MACHINE\Config\0001\Other Flags Esta clave contiene mas de 2000 bytes y lo que la hace singular, aparte de ese nombre tan sospechoso, es que NO ESTA en el registro junto con el resto de claves del programa. Al contrario está en una zona en la que NADIE la relacionaria con ESI...(llamadlo Zen si os place). 2ª,3ª y 4ª ejecuciones: En cada ejecución se producen cambios en algunos valores contenidos en ‘Other Flags’ 5ª ejecución (primera ilegal): Vuelven a modoficarse los valores de ‘Other Flags’ pero esta vez será la definitiva. 6ª y sucesivas ejecuciones: NO se producen más cambios. Sea lo que sea está claro que mantiene una relación con el número de usos...!
PRIMER EXITO
Si mis sospechas son ciertas prodriamos 'resetear' el conteo de usos introduciendo en el registro la clave ‘Other Flags’ tal y como era después de la primera ejecución (momento en que se creó). Para esto exporté al principio la clave ‘virgen’ desde el regedit de manera que pudiera volver a introducirla ejecutando el script *.reg Voilà. Al ejecutar el programa todo parece funcionar EXACTAMENTE igual que la primera vez. Hasta ha desaparecido el ‘Expired version’ de la cabecera de la ventana. Al preguntar al programa por el status nos dice que nos quedan 4 usos...:o) Sucesivas ejecuciones reproducen la secuencia explicada al inicio de este tute, de manera que a la quinta vez estamos de nuevo ‘expired’... En este punto podemos tener tantos usos como queramos, eso si, ‘refrescando’ el registro cada cuatro ejecuciones.... :o( Parece que todo sería perfecto si pudieramos evitar la modificación de los valores en ‘Other Flags’
MANOS ARRIBA
Empieza la acción. Hay que buscar la llamada a la función de la API RegQueryValueEx que es la responsable de cargar en memoria el contenido de una clave del registro. Siguiéndole la pista sabremos donde se modifica y podemos EVITARLO. La sintaxis de esta función es como sigue: `LONG RegQueryValueEx(` `HKEY hKey, // handle of key to query` `LPTSTR lpValueName, // address of name of value to query` `LPDWORD lpReserved, // reserved` `LPDWORD lpType, // address of buffer for value type` `LPBYTE lpData, // address of data buffer` `LPDWORD lpcbData // address of data buffer size` `);` Se suceden muchas llamadas a esta función, aunque después de trazar un poco se hace evidente que las de interés suceden en : `* Reference To: advapi32.RegQueryValueExA, Ord:0000h` `|` `:0045210A E83150FBFF Call 00407140` `:0045210F 85C0 test eax, eax` `:00452111 742E je 00452141` `:00488D8D B1B4 mov cl, B4` `:00488D8F E8B09EF7FF call 00402C44 --> Modificación` `:00488D94 FF45EC inc [ebp-14]` Para poner un breakpoint a la que nos interesa hacemos: `Bpx 0045210A IF *(*(ESP+4))==6568744F` El segundo argumento de la función, ya en la pila, debe apuntar a “Other Flags”, 6568744f son los codigos ascii de los primeros 4 caracteres invertidos (“ehtO”.) El valor de la clave leído por RegQueryValueExa es apuntado a la salida por el 5º argumento y en esa posicion de memoria instalamos un BPM [address] W para detectar escritura... El resultado no es muy sorprendente. El CALL en 488D8F es el responsable de las actualizaciones. Para poder neutralizar este CALL, primero comprobamos que la pila permanece igual despues de la ejecución. A continuación procedemos a escribir un crack que cambie: `:00488D8F E8B09EF7FF call 00402C44` por `:00488D8F 9090909090 nop nop nop nop nop` Hacemos los chequeos de rigor y comprobamos que restaurando el registro al valor original de ‘Other Flags’ y ejecutando esi.exe parcheado como se ha indicado disponemos del programa como si fuera SIEMPRE la primera vez...:o)
AHORA TODO JUNTO
La cosa marcha pero debemos arrastrar los 2Kb de datos de ‘Other flags’ como parte del crack???...no es muy elegante. Forcemos un poco la máquina. La clave se crea en el registro durante la primera ejecución y a partir de ese momento cambia en cada uso. Realmente el estado original no ocurre con la clave virgen sino CON NINGUNA CLAVE en absoluto!. Probamos borrando la ‘Other flags’.... Yeah! En la primera ejecución se crea una nueva clave que permite 4 usos más. Al haber parcheado la rutina actualizadora (descontadora de usos) esta situacion se mantiene para siempre. Nuestro crack ahora es infinitamente más manejable: parchear 5 bytes y borrar una clave del registro.
BORRAR DATOS EN EL REGISTRO
Para eliminar claves del registro no son validos los scripts *.reg que usamos para añadirlas. Además pretendemos que el crack este contenido en un UNICO fichero. Como eliminamos nuestra ‘Other Flags’...? Pues con autoexplicada funcion de la API: `LONG RegDeleteKey(` `HKEY hKey, // handle of open key` `LPCTSTR lpSubKey // address of name of subkey to delete` `);` Con el siguiente trocito de código añadido al parcheador resolvemos el tema: (crackeamos en winasm32, nooo?) `.const` `Clave db "Config\0001",0` `Flags db "Other Flags",0` `.data?` `Hwndr dd ?` `;Abre` `invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE, ;rama` `offset Clave, ;clave` `NULL,` `KEY_SET_VALUE, ;modo apertura` `offset Hwndr ;handle de clave abierta` `;Borra` `invoke RegDeleteValue,Hwndr, ;handle de clave a borrar` `offset Flags ;nombre de valor a borrar` `;Cierra` `invoke RegCloseKey,Hwndr ;cierra clave abierta` Sencillo, ein?
ESTERTORES
Una vez concluidos los arreglos anteriormente comentados pasé algun tiempo haciendo pruebas. Todo parecía funcionar correctamente hasta que un amiguete detectó que cada 100 frases traducidas aparecía una ventana recordando que en la version demo ese era precisamente el límite. Esto NO bloqueaba el programa, sólo esperaba confirmación y continuaba funcionando correctamente. Muy engorroso, el recordatorio, eso sí.. . "Un MessageBox...", pensé y busqué el disparador, la comparación que activaba la llamada... No fue facil. Tenía todo el aspecto de una MessageBox PERO NO LO ERA. Se trataba de una ventana construida a trozos, el icono, el botón, el texto. Todo se añadía paso a paso a lo largo de un proceso muy dificil de detectar en origen. Comparando la secuencia de instrucciones que se ejecutaban cuando se traducía la frase Nº 98 con la correspondiente a la Nº 99 encontramos la bifurcación en: `:0063BE96 FF058C7F6400 inc dword ptr [00647F8C]` `:0063BE9C 833D8C7F640064 cmp dword ptr [00647F8C], 00000064` `:0063BEA3 0F8C34010000 jl 0063BFDD <--- bifurca` La verdad es que me sorprendió encontrar una comparacion directa con el 100 (64h). Ni siquiera había intentado buscar el literal porque no imaginé un conteo tan transparente en este código de protección celulítica... Obviamente, en [647F8C] se mantiene la cuenta de frases traducidas que al llegar a 100 bifurca el código para comenzar a montar su ventana a trozos. Como os podreis imaginar, para acabar con esto eliminamos la instrucción de incremento: `:0063BE96 FF058C7F6400 inc dword ptr [00647F8C]` cambia a: `:0063BE96 909090909090 nop nop nop nop nop nop` Y eso es todo lo que hace falta.
ADDENDUM: El caso Win NT
Por lo general, las protecciones de software no suelen depender de si el software corre bajo Win9x o NT. Este no es el caso. Las instrucciones detalladas anteriormente NO desprotegen ESI bajo NT. Cabe esperar que los programadores de este invento hubieran desarrollado otra protección totalmente diferente bajo NT para desalentar al cracker....? No, no cabe. Demasiado trabajo. Un poco de maquillaje será suficiente :o). El truco es exactamente el mismo. El contador de usos vuelve a estar sutilmente camuflado en el registro, pero esta vez en DOS CLAVES: HKEY_USERS\.DEFAULT\Control Panel\Appearance\Custom Colours HKEY_CURRENT_USER\Software\Word Magic Software\Word Magic \Tools\Preferences\Dictionary Access Los nombres no delatan la finalidad de estos datos que parecen valores de configuración de la aplicación. Pues bien, el proceso se repite. Primero hay que eliminar las DOS claves SIMULTANEAMENTE y luego anular la llamada a la funcion encargada de actualizar el conteo: `:00488EB8 B1B4 mov cl, B4` `:00488EBA E8859DF7FF call 00402C44 <----Noppear` `:00488EBF FF45EC inc [ebp-14]` Ambos procesos han sido ya explicados con lo que el tema queda zanjado. Gracias a todos por el interés mostrado. MrCrimson
FINALE
Hay otros detalles cosméticos que no afectan a la proteccion ni al funcionamiento del programa y que por tanto no voy a detallar. Tampoco he quitado la NAG porque en este caso NO forma parte de la protección (no tiene mayor complicación). El presente software se plantea como una suite que en su version demo contiene además otro programa: WordMagic. El razonamiento para desprotegerlo es exactamente el mismo. La suite completa alberga otros programas NO incluidos en la DEMO y por lo tanto no analizados. Espero que este texto te sirva para ampliar tu repertorio de técnicas. Y huelga decirlo, a estas alturas, pero: Si te gusta el programilla de marras, paga los derechos de uso! el presente tute SOLO pretende poner de manifiesto la inutilidad de este tipo de protecciones densas. Además, perjudican al usuario hinchando los ejecutables e incrementando el tiempo de descarga. Up The Hammer! MrCrimson/[WkT!99]
[ 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