Erwin.Ried.cl / Desarrollos / Cracking /
El juego de las pistas protegidas mediante contraseña

El título puede no ser exacto, pero se trata de la versión Nations del entretenido juego Trackmania. Gracias a sus propiedades de edición de pistas cuenta con miles de pistas disponibles, sin embargo la mayoría de ellas están resguardadas mediante una contraseña lo que dificulta la investigación de los "novatos arquitectos de pistas"... ¿Cuán robusta será esta contraseña? (18/02/2007 12:16 AM)


La serie Trackmania es muy poco conocida en Chile y creo que es principalmente por falta de publicidad, lamentablemente el mismo juego da la esencia de poco atractivo, partiendo con el nombre. Sin embargo luego de jugar un poco en línea con la versión totalmente gratuita (patrocinada por Nvidia, llamada Trackmania Nations) cualquier humano que guste de los juegos de automóviles quedará enviciado con su modo de juego extremadamente rápido.


1. Introducción

Luego de jugar este videojuego en línea, me di cuenta lo entretenido que era hacer retorcidas pistas (y servidores con ellas) para retar a los más ávidos corredores de países tan diferentes como Alemania, China, Francia o Argentina, entre los muchos países disponibles en el juego (lamentablemente exceptuando Chile). Al rato, luego de jugar algunas de las pistas más increíbles (la primera que me impresionó fue una llamada "Sweet Dream") se me presentaron muchas dudas de cual era el secreto dentro de esas excelentes creaciones, consecuentemente descargué cada una de las pistas interesantes mientras las jugaba.

Finalmente decidí revisar aquellas descargas con la finalidad de aprender de aquellos maestros de la creación de pistas, tal fue mi desilusión al descubrir que la mayoría de los circuitos más interesantes estaban protegidos mediante contraseña, que decidí investigar la protección y finalmente crear un pequeño documento con la travesía.


2. Validando una simple pista sin contraseña

La forma más fácil de descubrir la forma en que se almacenaba la contraseña era por supuesto creando una pequeña pista personal y colocarle una contraseña.

Primero desde el editor de pistas del juego, creamos un pequeño circuito sin mayores dificultades (hay que recordar que para que una pista sea válida el juego pide que podamos correrla por lo menos una vez, procedimiento que llama "validar"):



Luego de una simple "validación", guardamos la pista sin utilizar ninguna contraseña esta vez:




3. ¿Qué cambios genera la existencia de una contraseña?

Nuevamente, el paso más simple para responder nuestra interrogante es simplemente asignar una simple contraseña:



Así tenemos una serie de pistas que debemos analizar:



Para ver las diferencias entre los archivos podemos usar métodos que ciertamente comienzan en el masoquismo como lo sería hacer una comparación manual, o por medio de algún comando desde la línea de comandos (me refiero a COMP).

Como el proyecto no pretende ser un análisis de más de un par de horas lo mejor sería usar la utilidad WinDiff o en un mejor caso Hex Workshop que cuenta con una excelente herramienta de comparación de archivos resincronizando la posición de la comparación:



Luego de unos segundos saqué las siguientes conclusiones:

a) Un archivo sin contraseña y otro con contraseña difieren en bastantes bytes más que el largo de la contraseña, esto quiere decir que probablemente será más complejo quitar la contraseña que cambiarla por otra o "adivinarla".

b) Un archivo tiene el nombre otorgado a la pista en el nombre de archivo y adicionalmente dentro del archivo directamente. El juego al iniciar simplemente busca archivos con la extensión correcta, sin importar su nombre externo. Esto tiene una pequeña consecuencia que se debe tener en cuenta la cual es que si queremos comparar dos pistas cambiando sólo la contraseña sin alterar mas bytes debemos mantener el nombre interno de la pista. Esto se logra fácilmente creando un directorio en donde iremos guardando las pistas mientras las guardamos y sobreescribimos el archivo guardado simplemente cambiando la contraseña desde el juego.

c) Dos contraseña de diferente largo generan diversos cambios más en distintas partes del archivo como se aprecia en la siguiente imagen:




4. Why?! Why do you persist, Mr. Anderson?

Generé algunas contraseñas más para analizar, siento que el secreto tras la codificación no es tan oscuro como pensé:



Y ciertamente el cambio que ocurre en dos archivos que se diferencian sólo por un caracter en la contraseña es extremadamente sutil:



(El cambio reflejado en la imagen anterior se repite 2 veces cada vez en el archivo, aunque el cambio es exactamente igual por lo que sólo mostré uno de los cambios)


5. Un pequeño coffee break

Antes de continuar debo resumir los resultados (algunos de ellos sin base empírica aún):

a) Es mucho más simple decodificar la contraseña para descubrir cual es la que se utilizó en la pista

b) Es mucho más complejo remover una contraseña directamente del archivo que lo expuesto en el punto a)

c) Es mucho más complejo cambiar la contraseña por otra de diferente longitud que lo expuesto en el punto a)

d) Sin embargo hay algo mucho más simple que lo expuesto en el punto a) pero menos lógico que es reemplazar la contraseña original del archivo de largo conocido, por otra del mismo largo

e) Finalmente, el juego revisa la integridad de los archivos al iniciar, si hay alguna incongruencia simplemente aborta totalmente el inicio

Dado este pequeño diagnóstico, creo que el punto para seguir el artículo es el a) y esto nos lleva a realizar un análisis de la codificación.


6. Una simple pero astuta forma de encriptar

Al utilizar contraseñas totalmente repetitivas como "aaaaa" en las pistas del juego encontré que extrañamente (o predeciblemente) ninguna de las formas de codificadas de cada letra se repetía en su correspondiente "hermano" codificado (recordemos que la longitud afectaba completamente al archivo, pero misteriosamente cada letra añadía sólo un nuevo caracter codificado en la sección que detecté en donde se almacenaba esta contraseña codificada), gráficamente, la codificación de "aaaaa" da un resultado así:



Ese pequeño diagrama no produce asombro, de hecho se puede pensar que la codificación es "bastante buena". Lo extraño es lo que sucede para una clave algo más larga, digamos "aaaaaaa":



Claramente se nota una codificación cíclica, más específicamente, cada cinco posiciones se repite el patrón.

En este punto tenía dos opciones, analizar miles de posibilidades e intentar revertir la codificación (casi como debería hacerlo un cracker con el fin de generar un keygen) y es más, este modo hubiera sido increíblemente elegante, u otro método menos elegante. Opté por crear una tabla de conversiones (el método menos elegante) pero mucho más mecánica de elaborar.


7. El trabajo mecánico de crear una tabla

La idea es generar una tabla de equivalencias por posición, es decir, si cada cinco caracteres la codificación de un caracter se repite, simplemente debemos confeccionar una tabla con cinco posibilidades por caracter.

El procedimiento puede ser muy trabajoso, de hecho a eso me refiero con "trabajo mecánico". Sin embargo, ¿cómo podría documentar esto sin algo de automatización computina de por medio?

Primero, si colocando "aaaaa" como contraseña a una pista puedo tener las cinco traducciones de la letra "a" en cualquiera de las cinco posiciones posibles (me refiero al módulo de cinco, de la posición que queremos decodificar) entonces ¿cómo podré obtener TODO el abecedario, los números y símbolos?

GroundControl es una excelente herramienta que nos permite automatizar con sencillos comandos el funcionamiento de Windows, entonces:

a) Tomar todo el abecedario en minúsculas, duplicarlo y colocarlo en mayúsculas
b) Adjuntar los dos abecedarios
c) Repetir cinco veces cada caracter, obteniendo finalmente una cadena (que será la contraseña de la pista) de cinco veces el largo de los dos abecedarios juntos
d) Generar la pista con esta contraseña, extraer los caracteres codificados y hacer la tabla de traducción de caracteres de entrada versus caracteres de salida
e) Finalmente repetir el punto c) para los números y luego para los símbolos (o al menos los más comunes)

De hecho todo el procedimiento servirá para analizar la codificación posteriormente. Ahora la titánica tarea de escribir la contraseña de doscientas letras en el juego sin ningún error es un procedimiento totalmente trivial para el siguiente script de GroundControl:

Código:
// Variables e inicialización
   SetSendKeysDelay(1)
   PutVar(%pos,"0")
   PutVar(%abc,"abcdefghijklmnopqrstuvwxyz")
   
// Adjuntar el abecedario en mayúsculas
   UpperCase(%abc,%mayus_abc)
   AddString(%abc,%mayus_abc)
   GetStringLength(%abc,%length_abc)

// Activar la ventana del juego
   SendKeysToWindow("TmNationsESWC","{delete}")

// Rutina
:inicio
   Increment(%pos)
   GetCharacterAt(%abc,%pos,%temp)
   PutVar(%letra_temp,%temp)
   AddString(%letra_temp,%temp)
   AddString(%letra_temp,%temp)
   AddString(%letra_temp,%temp)
   AddString(%letra_temp,%temp)
   // Enviar letras
      SendKeysToWindow("TmNationsESWC",%letra_temp)
   // Siguiente
      If(LessThan(%pos,%length_abc),GoTo(":inicio"))


Como pueden imaginarse, para los símbolos y números es prácticamente lo mismo. Esto reduce el trabajo a muy pocos minutos y luego con un editor hex hago extracción de nuestra cadena codificada:



Si miran fíjamente, incluso en la columna de "diferencias" (la que corresponde a la diferencia entre el caracter normal ASCII con el codificado, en base 10) se puede apreciar el concepto que dije anteriormente sobre la periodicidad de la codificación.

Para entender mejor todo el proceso, mirar el siguiente video:



8. Entonces, ¿y el programa?

Aquí está:



Trackmania Tracks Password Revealer es el nombre de la aplicación resultante de esta pequeña investigación, su tarea es simplemente recibir una pista de Trackmania (al parecer no importa si es Trackmania Sunrise, Trackmania Nations o Trackmania United, en general cualquiera con extensión ".Challenge.Gbx") y entregar la contraseña de la misma. Esta desarrollada con Visual Studio 2005 (C#) por lo que se necesita el .NET Framework 2.0 o superior para utilizarlo:

Descarga del ejecutable:
files/articles/tm_password_revealer_01/TM_password_revealer_v0.1_bin.rar

Algunas pistas que usé en este artículo:
files/articles/tm_password_revealer_01/Ejemplos_pistas.rar

Descarga del código fuente:
files/articles/tm_password_revealer_01/TM_password_revealer_v0.1_source.rar


9. Un reto para el lector de este artículo

Propongo que si tienes facilidad con estos temas de codificación, descargues la tabla de equivalencias:

files/articles/tm_password_revealer_01/abecedario_tabla_excel_97-2003.rar
files/articles/tm_password_revealer_01/abecedario_tabla_excel_2007.rar

y trates de encontrar una función (o en el peor de los casos, cinco funciones) tales que:

Código:
f('letra_codificada',posicion)='letra';

Nótese que el valor "posicion" es "posicion%5" y aquí hace
referencia a la posición de la letra codificada


Creo que para el abecedarios, mayúsculas y minúsculas es casi evidente, aunque parece que para los símbolos no basta ASCII como representación. Una simple función para el abecedario quitaría varios bytes de la aplicación.


10. Conclusiones

Cuando escribo este último párrafo de conclusiones estoy gratamente complacido con el trabajo, por pequeños que sean los problemas siempre necesitan algo de ingenio y eso es lo entretenido.

Sin embargo, en este caso creo que se pudo haber hecho algo muchas veces más elegante, es por eso que en el punto anterior dejo abierta la invitación y espero recibir alguna sugerencia.

Espero que el documento esté lo suficientemente entendible y bien explicado, generalmente me toma más tiempo documentar una pequeña investigación que hacerla, aunque parezca que no es así.

Haga clic sobre una de las estrellas para calificar este artículo.

Opiniones y comentarios (Escribir un nuevo comentario)
Pues es curioso al menos, cuando al usar esa misma contraseña (drg-de!bla0815) en una pista común, el programita dice que NO detecta ninguna contraseña... Mmmmmm... Ni modo. Creo que deberé seguir rabiando como no me ayudes. Jajaja. :P Con mucho gusto te enviaría la pista si quieres. Ups! ^^ Muchas gracias por tu rápida atención, un gusto saludarte. :) Besos.
Escrito por Coral (17/02/2010 12:39 PM)
Puede suceder que el archivo que generes tenga otra codificación, como te digo es algo que hace mucho tiempo no investigo. La verdad es que este artículo pretende ayudar y fomentar la investigación personal, probablemente ayudarte sea equivalente al trabajo de escribir otro artículo y esa no es la idea. Si investigas siguiendo pasos similares (incluso los que se muestran en el video) y llegas a problemas, en ese caso podría ofrecerte mi ayuda
Escrito por Erwin Ried (18/02/2010 11:26 AM)
Hola, Erwin Ried. Esta herramienta me resulta fascinante. También me encanta visualizar internamente las pistas de TM y aprender de las brillantes mentes. Tengo una pista por la que "rabio" entrar. Al parece no puedo por que el pass tiene 2 caracteres que no reconoce: un guión y un cierre de exclamación: "drg-de!bla0815". No sé si estarías en disposición de ayudarme, pero de todos modos te doy las gracias, tienes un gran talento para la informática. Guardo tu página en "Favoritos" para aprender. Muchos besos. :)
Escrito por Coral (17/02/2010 12:02 PM)
La verdad es que hace mucho tiempo que no veo nada respecto a este tema, puede que la contraseña esté incorrectamente extraída pues nunca investigué el efecto de algunos caracteres especiales. Te sugiero que pruebes asignando algunas contraseñas con caracteres especiales a tus pistas, puede que descubras algo interesante
Escrito por Erwin Ried (17/02/2010 12:13 PM)
Queria saber si te llego la solucion que te envie sobre la funcion requerida, ademas de un mail con otro caso parecido... Saludos
Escrito por Ricky (19/09/2008 08:20 AM)
Ahhh, por cierto, mi teoria sobre los caracteres "no soportados" es que en realidad se debe estar utilizando unicode en lugar de ascii. Ya que en internet es muy comun hacerlo... abe comentar tambien que a veces es muy util convertir a binario cada caracter original y codificado y observar los patrones. Visualmente se puede sacar conclusiones rapidamente.
Escrito por Ricky (17/09/2008 12:16 PM)
Hola, encontre la solución (al menos parcial al problema) Funciona con casi la mayoria de los caracteres. Habria que ajustarla un poco o quizas los caracteres que no decodifica no son soportados por el programa. Basicamente hay que hacer un XOR de cada caracter de acuerdo con la posicion. 1ro. xor 94, 2do. xor 36, 3ro. xor 240, 4to. xor 15, 5to. xor 90. Una rutina simple para decodificar en VB: Public Function Decode(s As String) As String Dim i As Integer Dim x As Integer For i = 1 To Len(s) Select Case i Mod 5 Case Is = 1 x = 94 Case Is = 2 x = 36 Case Is = 3 x = 240 Case Is = 4 x = 15 Case Else x = 90 End Select Decode = Decode & Chr(Asc(Mid(s, i, 1)) Xor x) Next End Function SALUDOS!!!!
Escrito por Ricky (17/09/2008 12:11 PM)
Perdon pero no funciona el programa password revealer me aparece esta ventana: La aplicación no se ha podido inicializar correctamente (0xc0000135). Haga clic en Aceptar para terminar la aplicación. Me puedes ayudar. Gracias de antemano.(:
Escrito por FRAnnn: (30/12/2007 10:20 PM)
Debes instalar el Framework .Net 2.0 (o desde Windows Update)
Escrito por Erwin Ried (01/01/2008 07:03 PM)
hola erwin, perdona si te pregunto algo nada q ver con tu articulo. Sabes he instalado el juego Need for Speed Most Wanted y lo he podido jugar, me dice que introduzca el dvd correcto. Me podrias ayudar en forma detallada por favor. Gracias
Escrito por urgente (27/03/2007 11:53 PM)
Lo más seguro es que tu juego no sea original, en este caso no puedo ayudarte
Escrito por Erwin Ried (28/03/2007 10:02 AM)
yo siempre te lo digo y te lo dirè eres un genio!!
Escrito por #AC#MAF (12/01/2007 02:34 AM)
Gracias por tu apreciación tan positiva, sin embargo tan simple que resulto hacer la tabla para "decodificar" las contraseñas que era para dudar, en efecto, hace unos días me percaté que para algunos símbolos y caracteres funciona incorrectamente pues internamente se realiza una codificación por medio de dos bytes, es decir mi hipótesis estaba sólo un cincuenta por ciento correcta. En un tiempo futuro me daré el trabajo de investigar un poco más la codificación de estos caracteres "extendidos"
Escrito por Erwin Ried (12/01/2007 03:47 AM)
Y por cierto, ya estás oficialmente baneado de TMX, espero no hayas pasado mucho tiempo haciendo ese programita.
Escrito por Crusard (03/01/2007 02:08 PM)
This password utility is going to cause more annoyance than good, put your programming abilities to better use. Por ejemplo, vos viste cómo está hecha mi pista Sweet Dream (no sé si conocés alguna otra), y no me parece que hayas hecho algo interesante después de robar mi password o sí? Obviamente no conocés mucho de este juego, y por más orgulloso que estés de tus abilidades en la programación muchos n00bs van a mirar la pista y decir, "ah, mirá que complicado esto", y no les va a salir nada. Si querés ayudar, creá tutoriales de hacer pistas como los que hay en mi sitio, pero no tenés que revelar todas las contraseñas pensando que haces bien a nadie.
Escrito por Crusard (03/01/2007 02:00 PM)
No comprendo tu molestia sinceramente, no veo el problema en que alguien pueda investigar dentro de unas pistas (tus pistas son realmente buenas), disculpa los problemas que pueda causar mi pequeña investigación pero no retiraré mi artículo ni el programa de mi sitio
Escrito por Erwin Ried (04/01/2007 02:38 AM)
mmm... te entiendo, yo estoi recien empezando con la programacion, e hice un tutorial y me demore mas tiempo en redactarlo que en hacer el tutorial.... tengo una pregunta...¿como sabes en que parte del archivo estan los bytes que necesitas? he visto varios de tus articulos e indicas los bytes que necesitas y bla bla, como lo haces?
Escrito por Cuack (29/12/2006 03:53 PM)
Generalmente es por intuición, fíjate en el segunda imagen del punto cuatro en este mismo artículo, si modifiqué la contraseña "1" por "2" y el cambio ocurrió dentro del recuadro resaltado es lógico que dentro de esas cadenas de caracteres se encierra la contraseña misma, por lo que el programa busca la secuencia antes y después de la contraseña y por consiguiente tiene los bytes de la misma. Cuando los cambios son de "comportamientos" o más conocidos como cracking es necesario conocer algo de ensamblador, así puedes darte cuenta que es lo que debes modificar. No te asustes, no es necesario saber programar en ensamblador ni nada parecido, es simplemente que con la práctica memorizas ciertos "bytes" como le dices tu y puedes reconocer fácilmente estructuras ejecutables, librerías, archivos gráficos como videos o fotos (un claro ejemplo de este "reconocimiento" está en el cuarto punto del siguiente documento).
Escrito por Erwin Ried (30/12/2006 02:02 AM)
Excelente articulo, bajaré el trackmania pa ver q tal
Escrito por Tux (29/12/2006 02:08 AM)
El verano es largo, puede ser q me ponga a web**** un rato en 'El reto Ried 2007' jajaja Saludos wn y descansa!!
Escrito por Alejandro (29/12/2006 02:03 AM)

Copyright © 2013 por Erwin Ried.