Haciendo trampas en TriviaDos

No suelo gastar mucho tiempo con juegos en el móvil pero he de reconocer que siempre acabo enganchándome a alguno. En esta ocasión tengo bastante vicio con TriviaDos, un trivial de toda la vida por turnos para jugar en línea contra un contrincante remoto, ya sea conocido o aleatorio. Así que, aparte de jugar, gano algo de culturilla general... ;)

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 que os voy a mostrar en esta entrada es simplemente cómo modificar TriviaDos para ganar unos segundos de tiempo para responder a cada pregunta. Os dará una ligera ventaja pero no será determinante para que superéis a todos los rivales.. o eso espero. No me hago responsable de su uso ni de cualquier otra modificación derivada. Sólo espero que los dos chicos de Pandereta refuercen la seguridad de su aplicación. Vamos a ello...

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 ;) 


31 comentarios :

  1. jaja..! Grande Vicente! Saludos! ^^

    ResponderEliminar
  2. A todo esto, me ha salido en el captcha la palabra "Vice". xD Pero para vicios el "4 Fotos 1 Palabra". Lol!

    https://play.google.com/store/apps/details?id=de.lotum.whatsinthefoto.es

    ResponderEliminar
  3. Ke bueno! Tenía pensado echar un vistazo a este juego, te me has adelantado jejeje. Muy buen post e investigación Vicente.

    ResponderEliminar
  4. Muchas gracias!! esto es sólo una ínfima muestra de lo que se puede hacer con la aplicación y la importancia que tiene tener en cuenta la seguridad, más aún cuando hay un concurso de por medio...

    Saludos

    ResponderEliminar
    Respuestas
    1. Vicente eres un crack , pero triviados ya me aburre aora juego otro parecido que se llama Preguntados de Etermax .. En iphone haber si se te ocurre algo vale saludos

      Eliminar
  5. En securityartwork no dijeron que era triviados, pero ellos ya hablaron de este problema hace algunos días...

    Saludos

    ResponderEliminar
  6. si lo acabo de verla, no sé como se me pasó leerla antes :'(
    yo creo también que es Triviados pero, si contactaron con los desarrolladores de la aplicación, ¿por qué no usaron ProGuard u otra técnica para al menos ofuscar el código?

    ResponderEliminar
  7. no encuentro la primera linea que hay que cambiar ;) la segunda si la he encontrado^. Sera que como lo he actualizado hace poco ha cambiado el archivo? de todas manera gracias por el aporte.
    un saludo

    ResponderEliminar
  8. puedes subir el modificado?
    Gracias

    ResponderEliminar
  9. Siiii que buena idea sube el programa hackeado plis^^
    un saludo

    ResponderEliminar
  10. recientemente modificaron la versión y tengo que sacar un rato para echarle un vistazo :P

    ResponderEliminar
  11. hola otra vez^^

    al final cambie otra linea por probar
    ^^ y me surge otro problema. me da error cuando quiero reempaquetar.

    C:\Documents and Settings\Shabda\Mis documentos\Downloads\TriviaDos>java -Xmx512
    M -jar tools/smali.jar -o output/classes.dex decompiled/classout/
    Error: Unable to access jarfile tools/smali.jar
    que hago mal?

    gracias un saludo



    ResponderEliminar
  12. hola shabda, parece que el problema es que el fichero jar de smali no se encuentra en la ubicación que indicas...

    ResponderEliminar
  13. pues no lo entiendo tg todos los archivos en la ubicacion de hecho he podido desempaquetar el archivo pero empaquetarlo tras su modificacion no me deja.

    un saludo

    ResponderEliminar
  14. Vicente, ¿puedes poner un enlace con el triviados modificado?

    ResponderEliminar
  15. el "triviado modificado" en el post ya corresponde a una versión anterior y no te dejará jugar porque al iniciar la app lo primero que se comprueba es si es la versión actual. Se puede falsear la versión? se puede modificar también el tiempo en la última versión? pues no lo he probado, pero ahí tienes la semilla para hacerlo tú mismo....

    ResponderEliminar
  16. Te agradezco tu rápida respuesta,pero eso que propones se escapa de mis posibilidades, es como si me hablaras en chino,y yo fuera sordo y mudo.
    Tendrías que hacer un tutorial para torpes y aún así no te garantizaría que lo consiguiera.
    Gracias de todas formas.

    ResponderEliminar
  17. pues siento no poder ayudarte. El objetivo de este post es el estudio de la ingeniería inversa de las aplicaciones en Android, no facilitar directamente una aplicación para hacer trampas sin ni siquiera entender lo que hace...

    "Regala un pescado a un hombre y le darás alimento para un día, enseñale a pescar y lo alimentarás para el resto de su vida." ;)

    ResponderEliminar
  18. Que triste ganar a base de trampas.
    Demuestra inteligencia cero.
    Y todavía los que ganan asi, se sentiran orgullosos...

    ResponderEliminar
  19. Creo que la idea era enseñar como hacer una modificación de una aplicación de Android, con un ejemplo. Si la cuestión hubiera sido hacer trampas nada más, hubiera subido la aplicación modificada y Santas Pascuas. (Y además de tramposos no hubiéramos aprendido nada).

    ResponderEliminar
  20. gracias por el capote Juancho. En Internet hay gran cantidad de mods de juegos que ofrecen a quien lo usa hacer trampas sin más. Aquí no, aquí el objetivo es aprender cómo se realizan para ver el funcionamiento y las debilidades de las aplicaciones en Android...

    ResponderEliminar
  21. Hola, yo quisiera hacer trampa con la aplicacion dominoes, lo tengo descompilado, pero no se respecto a las modificaciones necesarias en el smali para despues compilar y firmar. Es decir, quiero modificar la jugada cuando de tantas pone como puntuacion cero... mas detalles en mi correo

    gallito.loquito.2012@gmail.com

    Gracias

    ResponderEliminar
  22. QUE PENA ME DAIS....JUANCHOS Y DEMAS....BUSCANDO LAS MANERAS DE NO SEGUIR EL JUEGO....EXCUSAS PARA EN DEFINITIVA,...no PERDER......QUE ES LO QUE OS JODE....ACOMPLEJADOS , DIRIA YO.....PERDER EN UN JUEGO....QUE DISGUSTO,...YA PODRIAIS PERDER EL TIEMPO BUSCANDO ENFERMOS EN LA RED......

    ResponderEliminar
  23. te equivocas @anonimo. Estamos mostrando una manera de hacer trampas para que los desarrolladores y el resto de jugadores tomen conciencia de la importancia de la seguridad también en juegos. Si quisieramos hacer trampas para ganar simplemente no te explicaría el proceso en un blog...

    ResponderEliminar
  24. Una pena que algunos se fijen en el dedo cuando les señalas a la luna.
    Por otro lado,impresiona que sea tan sencillo hackear la seguridad de las apps.
    Gran trabajo

    ResponderEliminar
  25. gracias @Principe Aaloy, no obstante no tengo iPhone así que seguiré investigando Android :-D

    ResponderEliminar
  26. Nadie te obliga a jugar a este juego. Hay juegos de coches, de disparos. Si no sabes no juegues. Pierdes mas tiempo en hacer trampas q en buscar un juego q se adapte a tus posibilidades. Hay muchas formas de hacer tampas aquí. La tercera forma distinta q oigo, y lo q me da q pensar es q cuando me ganan es pq estan haciendo trampas y se me quitan las ganas

    ResponderEliminar
  27. He aquí un documento que prueba la existencia de las trampas

    http://www.youtube.com/watch?v=eGearF4bvwo

    ResponderEliminar
  28. Alguien lo hizo a lo bestia en el GSICKMINDS, e incluso os mencionaron a vosotros y a los de security-art-work

    ResponderEliminar
  29. Hola!!!, una pregunta. Por qué antes subia el porcentaje en 2 ó 3 decimas por partida ganada y ahora solo 1?.
    Si tengo el 71% y para llegar al 72% tengo que
    ganar 100 partidas y no perder ninguna o me
    quitan 3!.
    Alguien sabe de esto?. Gracias!

    ResponderEliminar