Pues bien, eso fue mucho antes de que me convirtiese en un friki, así que ahora llegó el momento de crackear finalmente el juego después de tantos años. Para ello tan solo necesitamos un decompilador de Java. Empecemos por ver de donde viene el valor del PIN:
Antes de que os asustéis debo deciros que el código decompilado aparte de no incluir nombres de variables/funciones, las pocas que sí tienen están ofuscadas usando términos del lenguaje Java aleatorias como append, insert, equals, parseInt... que sus nombres no tienen ninguna relación con lo que hacen realmente. Esto esta hecho con la única intención de confundir a los hackers de ingeniería inversa como yo. Buena jugada, ResetGame.
Os hago un resumen, la función D checkea mediante la función AI.I si hay datos guardados del juego (lo cual incluye el PIN) y si no existen porque es la primera vez que se abre el juego, setea el PIN (que está en la dirección de almacenamiento 6) a los últimos 16 bits bits del timestamp en ese momento. Lo cual viene siendo... aleatoriedad total.
Pero... un momento... 16 bits significa que tenemos numeros del 0-65535 pero el PIN tiene 6 digitos. WTF??
Miremos el codigo que imprime el PIN:
El PIN se obtiene con la funcion de "Obtener valor de memoria" this.C para la dirección 6. Pues al resultado que se obtuvo de (timestamp & 0xFFFF) se le va a hacer padding con 0s hasta tener 5 cifras, por ejemplo, si el valor es 999 quedará 00999. Y finalmente el primer dígito será la suma de estos 5 digitos modulo 10. En este caso 0+0+9+9+9=27 por lo que nos quedamos con el 7 y el PIN mostrado sería 700999.
Lo mismo aplica con mi PIN del primer screenshot: 1+7+4+6+6=24, por lo que el primer digito del PIN será... sorpresa.
Pero vayamos a lo importante... ¿Como podemos generar una clave a partir del PIN? Vayamos a la funcion que procesa el valor introducido...
Más tarde apareció... Par 72 Golf, que si me preguntáis la diferencia con el 3 la verdad no lo se ya que el juego es prácticamente idéntico aunque con más niveles. En este caso se puede decir que directamente no existía PIN, ya que siempre mostraba el mismo (RESETgame). Veamos lo que hace en esta ocasión:
Lo primero que hace es borrar el primer dígito que introducimos... Interesante, el primer dígito de la clave no se tiene en cuenta. Después guarda en la posición 8 del almacenamiento el valor del PIN introducido, sea correcto o no.
Pues bien, resulta que hay una función que se llama en varias partes del juego que comprueba si la última clave introducida coincide con el PIN denominada "length" que a su vez aplica una función matemática que han llamado "parseInt" al PIN y este resultado debe coincidir con la clave introducida.
¡Ya esta! Si no os han sangrados los ojos viendo los nombres ofuscados de las funciones, os daréis cuenta de que la clave a introducir debe ser el resultado de (PIN<<5 & 0xFFFF) | (PIN >> 11 & 0x1F) con un digito cualquiera 0-9 delante de ese resultado. Os dejo Un calculador de claves que podeis usar desde el navegador:
Introduzca PIN:
Pues vemos que en esta ocasión el valor que se almacena del timestamp no son los 16 bits menos significativos, sino que es el número de día (1000*60*60*24). Ademas es muy curioso, ya que parece que la clave a introducir sería ese número de día de la instalación con un margen de 15 días a partir de los cuales la clave que te entregan dejaría de ser valida. Aparte de eso, también existe una clave "55205" que siempre funcionaría e imagino que únicamente se entregaría en caso de "emergencia" cuando alguien se quejase de que la clave basada en días que le entregaron no funcionaba. Pero... tenemos un problema. Por alguna razón le dieron fecha de caducidad a las keys basadas en el día actual. Con la operación & 0x3FFF impiden que se puedan introducir fechas posteriores a Noviembre de 2014, así que a día de hoy la unica forma de desbloquear el juego es con la clave "55205".
En fin, si de verdad has llegado hasta aquí, que sepas que eres 1 entre un millón. ¡Enhorabuena!