Hace unos días me llamó la atención el anuncio del primer torneo de TriviaDos que ofrece premios a los ganadores, ¡los dos primeros valorados en 1000€!.
Por un momento pensé en apuntarme pero, vistas las estadísticas de los jugadores top durante los primeros días, sus porcentajes de acierto en cada categoría y el número de partidas de cada uno, simplemente se me quitaron las ganas...
Sabía que un ser humano con un coeficiente intelectual normal y el tiempo limitado no podría si quiera soñar con clasificarse entre los 100 primeros. Pero, ¿alguien que tuviera conocimientos de seguridad informática podría "hacer trampas" y ganar el concurso?. Después de un vistazo a la aplicación de Android parece que sí...
...Un Quesito para atraerlos a todos y atarlos en las tinieblas. |
Lo primero que haremos será descargar el APK de la aplicación desde el Google Play, por ejemplo con Real APK Leecher:
Para los no iniciados, decir que el Formato APK es una variante del formato JAR de Java y se usa para distribuir e instalar componentes empaquetados para la plataforma Android. Básicamente es un comprimido ZIP que puede ser abierto con herramientas como 7-Zip, Winzip, WinRAR o Ark. En nuestro caso abrimos el fichero TriviaDos.apk con 7-zip y extraemos el fichero classes.dex:
En Android, el código fuente de Java también se compila en archivos .class, pero después mediante la herramienta “dx“ son convertidos a un único archivo dex (Dalvik Executable) que se ejecuta en la máquina virtual Dalvik. Este fichero se puede descompilar por ejemplo con las utilidades del proyecto smali:
java -jar tools/baksmali.jar -o decompiled/classout/ input/classes.dex
Ahora toca revisar la estructura de directorios y ficheros .smali con los opcodes de Dalvik. Si lo prefieres puedes transformar el fichero ejecutable de Dalvik a un Jar y descompilar los .class a .java para ver un poco a más alto nivel. Para nuestro objetivo bastará con buscar constantes relacionadas con funciones como CountDownTimer y variables bautizadas con la palabra "tiempo" o similar. Si nos centramos en el diálogo de las preguntas daremos con ello. Simplemente, en los ficheros TrivialPreguntnasDialog*.smali sustituiremos:
.local v6, tiempoFinal:D
const-wide/high16 v0, 0x4034
por
.local v6, tiempoFinal:D
const-wide/high16 v0, 0x7530
Y
.line 29
const/16 v0, 0x3a98
iput v0, p0, Laul/irm/triviados/dialogos/TrivialPreguntasDialog;->tiempoPregunta:I
por
.line 29
const/16 v0, 0x7FFF
iput v0, p0, Laul/irm/triviados/dialogos/TrivialPreguntasDialog;->tiempoPregunta:I
Es decir, sin ni siquiera modificar el tipo hemos cambiado el valor de tiempoPregunta al doble y el valor de tiempoPregunta por el máximo posible para 16 bits. Por tanto hemos pasado 15 a 30 segundos para responder cada pregunta.
Una vez modificado el valor de las variables tendremos que recompilar todo el código con smali y generar un nuevo fichero classes.dex:
java -Xmx512M -jar tools/smali.jar -o output/classes.dex decompiled/classout/
Después con 7-zip volveremos a añadir o sustituir el fichero dentro del paquete TriviaDos.apk:
No obstante, para instalar el apk con el nuevo classes.dex, tendremos que firmarlo pues recordemos que los archivos (apk, zip) tanto actualizaciones como aplicaciones y firmwares solo pueden instalarse en los móviles Android si han sido previa y debidamente firmados. Es una medida de seguridad que otorga validez al archivo aunque en la práctica es más un requisito que una garantía.
Eso sí, necesitaremos antes generar un par de claves pública/privada mediante OpenSSL. En Windows simplemente descargamos el paquete y lo descomprimimos, por ejemplo en c:\openssl. Dentro del directorio ejecutaremos:
openssl genrsa -out key.pem 1024
openssl req -new -key key.pem -config c:\openssl\openssl.cf -out request.pem
openssl x509 -req -days 9999 -in request.pem -signkey key.pem -out certificate.pem
openssl pkcs8 -topk8 -outform DER -in key.pem -inform PEM -out key.pk8 -nocrypt
Ahora para firmarlo usaremos la herramienta SignApk.jar incluida en el Android platform source bundle, y ejecutaremos:
java -jar signapk.jar certificate.pem key.pk8 TriviaDos.apk TriviaDos_modificado.apk
Por último desinstalamos el apk original e instalamos el nuestro. Y comprobamos el tiempo observando la barra de progreso ;)