Stardew Valley es el simulador de granjas más popular que existe hasta la fecha. Durante un tiempo jugué la versión móvil, tenía un viejo APK guardado así que se me ocurrió intentar abrirlo y ver algunas cosas.
Índice
- Introducción
- Herramientas
- Decompilación
- Modificación de assets
- Modificación de código
- Cheats
- Depuración de juegos en Android sin root
- Conclusiones
Introducción
En este artículo cubriré el proceso de ingeniería inversa de un juego de Unity para Android. La versión utilizada fue la 1.4.5. Se puede descargar aquí.
Herramientas utilizadas
- apktool: Una herramienta para revertir apks. Sirve para obtener código Smali, un AndroidManifest.xml legible, etc.
- adb: Herramienta para comunicarse con un dispositivo Android para depuración. Instalable por medio de un packet manager como apt.
- Xamarin_XALZ_decompress.py: Script de Python para descomprimir archivos XALZ.
- dnSpy: Desensamblador, decompilador y depurador de .NET para Windows.
- IlSpy: Desemsamblador y decompilador .NET para Linux.
- xnb-js: Herramienta para empacar o desempacar archivos con formato XNB.
- keytool: Una utilidad para manejo de certificados y claves. Es parte del JDK. Instalable por medio de un packet manager como apt.
- jarsigner: Firma y verifica archivos JAR (ZIP, APK, etc..). Es parte del JDK. Instalable por medio de un packet manager como apt.
- makeDebuggable.py: Script de python para marcar una APK como depurable.
- medit
Decompilación
Normalmente los juegos de Unity dependen de Mono para correr ejecutables .NET. Contienen una dll con todo el código del juego, llamada Assembly-CSharp.dll, la cual podemos decompilar y modificar directamente. Pero esto al parecer usa algo llamado ‘xamarin’:
1 | $ ls lib/x86_64 |
Leyendo este artículo sobre Pentesting en apps Xamarin encontré que en unknown/assemblies están las DLL .NET con el código del juego:
1 | $ file unknown/assemblies/Stardew* |
Xamarin es una plataforma de código abierto diseñada para que los desarrolladores creen aplicaciones para iOS, Android y Windows utilizando los frameworks .NET y C#.
XALZ es un formato para almacena programas comprimidos usado por Xamarin. Se puede extraer usando esta herramienta.
1 | $ ./Xamarin_XALZ_decompress.py stardew_valley/unknown/assemblies/StardewValley.dll StardewValley.dll |
Ya con el binario .NET lo abrimos con un decompilador como dnSpy y podemos empezar a modificar el código:

Modificación de assets
Los assets están en formato XNB, se puede usar esta herramienta para desempacarlos, modificarlos y volverlos a empacar.

Por ejemplo, vamos a modificar los diálogos del minijuego del abuelo que se muestran al iniciar la partida. La ruta es assets/Content/Strings/StringsFromCSFiles.es-ES.xnb. Usando la herramienta web obtenemos StringsFromCSFiles.es-ES.json, donde se encuentran estos mensajes:
1 | "GrandpaStory.cs.12026": "...Y para mi querido nieto:", |
Voy a cambiar el contenido de GrandpaStory.cs.12029 y empaquetarlo con la misma herramienta.
Para modificar el apk no utilicé apktool, no estoy claro por qué me falló. En su lugar usé este script:
1 |
|

Modificación de código
Para modificar el código podemos usar un desensamblador / decompilador .NET como dnSpy. Dado que los assemblies están empaquetados con XALZ, primero los descomprimimos:
1 |
|
Para editar tuve que pasar a Windows por un momento. Cargamos todas las librerías en dnSpy y modificamos un método cualquiera para probar, por ejemplo, ShopMenu.ChargePlayer:
- Hacemos click en la lupa y buscamos “Charge Player”.
- Hacemos doble click en el resultado abajo.
- Posicionamos el cursor sobre “ChargePlayer” en el decompilado y hacemos click derecho -> “Editar método (C#) …”
- Eliminamos todo el cuerpo del método y le damos al botón de “Compilar” en la esquina inferior derecha. Con este cambio en cualquier compra no se nos descontará nada de la moneda usada.
- Vamos a Archivo -> “Guardar Module…”


Modifiqué el script anterior para ahora copiar la dll modificada. No es necesario comprimirla a XALZ antes.
1 |
|
Esto en la mayoría de los juegos de Unity sería suficiente. Pero en este caso provoca un crash. Viendo el resultado con adb logcat | grep stardew:

Protecciones contra modificación
El juego tiene alguna clase de protección anti-tampering, una forma de protegerse ante cambios no autorizados. En los logs se puede observar la lista de llamadas:
El error ocurre en la llamada a CheckUsingServerManagedPolicy en OnCreatePartTwo.
No revisé a fondo su funcionamiento pero se puede asumir que hace algún tipo de verificación de integridad contra los assemblies. Si eliminamos esta llamada nuestros cambios se aplicarán sin problemas al juego. En esta ocasión utilicé “Editar instrucciones IL…” en lugar de “Editar método (C#) …”, este método es más preciso si tienes dominio de CIL. Solo reemplacé ldarg.0 y call por instrucciones nop(No OPeration):



Depuración de juegos en Android sin root
En Windows y Linux tenemos CheatEngine, posiblemente el mejor escáner de memoria / depurador para modificar juegos jamás creado. En Android los equivalentes a CheatEngine están limitados por la ausencia de permisos de root en estos dispositivos. Una alternativa que encontré es medit, una herramienta de terminal que nos permite hacer cambios sencillos que en la mayoría de los casos suelen bastar.
La herramienta se ejecuta bajo los mismos privilegios que el proceso objetivo. Se debe ejecutar run-as <package> para obtener los UID/GID de la aplicación especificada y así medit tenga acceso a lectura/escritura a los archivos privados de la app. El comando run-as necesita que la aplicación tenga el atributo android:debuggable="true" en su AndroidManifest.xml. Esto se puede hacer con apkutil pero ya que estamos encontré este script que hace eso mismo.
Probemos su funcionamiento cambiando la cantidad de dinero del jugador. Agregamos primero la línea para hacerlo depurable al script y comentamos la que agrega el parche anterior:
1 | # Reemplazar codigo |
Luego seguimos las instrucciones del repositorio y vemos los cambios.
Cheats
Tuve curiosidad por los exploits que tiene el juego, como el Item Duplication Cheat. Cada objeto del juego tiene un código numérico único, y al usar hasta tres de estos códigos entre corchetes como nombre de tu personaje, harás que esos objetos aparezcan en tu inventario cada vez que se mencione tu nombre en el juego. Una lista completa de los códigos puede encontrarse tanto aquí como en el artículo anterior.
Los diálogos vulnerables más explotados son los de Gus, en base/assets/Content/Characters/Dialogue/Gus.es-ES.xnb:
1 | { |
Es evidente que “@” es reemplazado con el nombre del jugador. La función que hace el parsing en este caso parece ser Dialoge.getCurrentDialoge():
1 | public string getCurrentDialogue() |
Conclusiones
La comunidad de Stardew Valley es enorme y hay información redundante sobre las mecánicas del juego y su modificación ¡Incluso tienen un framework para facilitar el hacer mods!
Esta tarea me vino bien porque me enfrenté a una protección de software, analicé un exploit y aprendí mucho del ecosistema Android, tema en el que sigo siendo bastante ignorante. En algún próximo artículo me gustaría cubrir el parcheo de código por medio de scripts, de tal forma que se puedan aplicar y retirar en tiempo real.
Eso es todo.
Enlaces
Stardew Valley 1.4.5, https://www.apksum.com/download/com.chucklefish.stardewvalley_1.4.5.139_free
apktool, https://github.com/ibotpeaches/apktool
Xamarin_XALZ_Decompress.py, https://github.com/x41sec/tools/blob/master/Mobile/Xamarin/Xamarin_XALZ_decompress.py
dnSpy, https://github.com/dnSpy/dnSpy/
ILSpy, https://github.com/icsharpcode/AvaloniaILSpy/releases
xnb-js, https://github.com/lybell-art/xnb-js
makeDebuggable.py, https://github.com/julKali/makeDebuggable/blob/master/makeDebuggable.py
medit, https://github.com/sterrasec/apk-medit
Xamarin Apps | Hacktricks, https://angelica.gitbook.io/hacktricks/mobile-pentesting/xamarin-apps
Mono (software), https://en.wikipedia.org/wiki/Mono_(software)
Tamper Check, https://support.preemptive.com/hc/en-us/articles/31819918306577-Tamper-Check
Common Intermediate Language (CIL), https://en.wikipedia.org/wiki/Common_Intermediate_Language
¿Alguien me puede sugerir algún equivalente de Cheat Engine para Android?, https://www.reddit.com/r/AndroidGaming/comments/1ajpbuc/can_somebody_suggest_me_any_cheat_engine/
Stardew Valley cheats | GameRadar+, https://www.gamesradar.com/stardew-valley-cheats/
Modding:Objects/Object sprites, https://stardewvalleywiki.com/Modding:Objects/Object_sprites