Estaba jugando este juego indie que encontré en itch.io. Le dediqué un par de horas, lo completé y sin embargo vi que me faltaban unas dos entradas del bestiario. Curioso, porque estaba casi seguro de que lo había terminado al 100%.

Soy una especie de adicto a tener este tipo de “compendios” o “wikis” internas de los juegos enteramente desbloqueados. Esto sumado al hecho de que nunca había crackeado algo hecho con RPGMaker me motivó a hacer este análisis.
Índice
Introducción
El juego fue hecho con RPG Maker MV/MZ. Podemos saberlo por el directorio www y www/js/plugins. RPG Maker MV/MZ está basado en Javascript y utiliza un framework llamado PixiJS para los gráficos. Lo mejor de todo es que el código fuente es accesible y editable directamente en el directorio /www. Podemos ejecutar el juego en un navegador abriendo /www/index.html. Debe usarse un servidor local para evitar problemas de CORS.
Herramientas
Es suficiente con un editor de texto y un servidor http para ejecutar el juego en el navegador en caso de que se quiera depurar. En mi caso usé el que trae el intérprete de Python por defecto. Basta con ir al directorio /www, ejecutar python3 -m http.server, abrir el navegador e ir a http://localhost:8000.
Bestiario
Estuve un rato explorando /www/js para entender superficialmente la lógica del juego y lo más relevante que encontré fue esto:
1 | // rpg_managers.js |
Aquí se inicializan variables para un nuevo juego, $gameSystem tiene alguna relación con el manejo de los enemigos pero probando algunas cosas no cambió las entradas del diario. No obstante, siguiendo a createGameObjects vemos que se inicializa una variable $beastBook:
1 | // plugins/STV_BeastBook.js |
El archivo contiene una sección comentada que explica los parámetros. Existen los métodos completeBeasts(), completeItems() y completeKills() que establecen los campos discovered,discoveredItems a true y el campo kill a maxKills respectivamente. Lo modificamos y bum!, tendremos toda la información disponible en una nueva partida:
1 | DataManager.createGameObjects = function() { |

Al final el diario queda así, parece ser un error del plugin o del manejo del mismo por parte del autor. En fin, fue divertido de todas formas.
Mods
Ya que estaba en eso, también me interesé en ver como podría agregar una zona nueva al juego.
1 | // source: rpg_managers.js |
Según estuve leyendo para pasar de un mapa al otro se hace por medio de un evento de la celda actual, el flujo es algo así:
1 | Game_Player.updateNonmoving |
Busqué el evento en la celda en la que nos encontramos para pasar del mapa data/Map003.json a data/Map001.json

jq '.events[]' ../data/Map003.json | grep -C 100 '"x": 0' | grep -C 100 '"y": 15'
1 | "list": [ |

Estos métodos aclaran el funcionamiento del evento:
1 | // source: plugins/SRD_GameOverCore.js |
Al final me dio pereza hacerlo a mano. Un método más sencillo es crear un proyecto nuevo en RPGMakerMV y reemplazar el código del juego del proyecto con el del juego que queremos modear y ya. Todo se hace por botones. La interfaz es intuitiva, es fácil cambiar y agregar cosas nuevas. Hay assets gratis en Internet.
Backdoor
Esto es solo por motivos de aprendizaje y no me hago responsable de su uso inadecuado.
Estos proyectos de RPGMakerMV usan NW.js (básicamente un framework que contiene un navegador Chromium embebido) como motor de javascript. Game.exe y las DLLs en el directorio raíz se encargan de ejecutar. Este programa ejecuta todo código en /www/js. Por ejemplo /www/js/main.js:
1 | //============================================================================= |
Segun este post se puede añadir código para crear una reverse shell remota así de fácil:
1 | var nwGui = require('nw.gui') |
Usé perl porque estaba en Linux, en Windows debería reemplazarse por un script de powershell.
Conclusiones
Sé que es un análisis corto pero quería escribir un artículo sobre algo nuevo que aprendí durante el proceso. Con esto ya he cubierto tanto juegos Flash (véase RE: Kingdom Rush Frontiers) como de RPGMaker MV. Planeo escribir más hasta cubrir una buena cantidad de técnicas conocidas de como revertir juegos creados con diferentes motores.
Eso es todo.
Enlaces
- Violet And The Lost Colors V1.3.1, https://daylieaf.itch.io/violet-and-the-lost-colors
- RPGMaker, https://www.rpgmakerweb.com/products/rpg-maker-mz
- Chromium (web browser), https://en.wikipedia.org/wiki/Chromium_(web_browser)#Use_in_app_frameworks
- Execute command using shelljs in nwjs?, https://stackoverflow.com/questions/33458437/execute-command-using-shelljs-in-nwjs