Hace poco en youtube me encontré este video de 0xd4y donde enseña a crackear juegos flash usando JPEX Free Flash Decompiler (ffdec) poniendo de ejemplo a Swords and Sandals 2. Así que se me ocurrió hacer lo mismo pero con un título que me gusta bastante: Kingdom Rush. Esta es mi primera incursión en el game hacking, y honestamente me pareció una experiencia satisfactoria.
Índice
Herramientas utilizadas
Pues obviamente como decompilador empleé ffdec. También funciona como un debugger usando un emulador pero me limité a hacer solo análisis estático.
Como emulador usé ruffle , porque fue el primero que encontré y cuenta con la comodidad de estar disponible tambien como extensión para el navegador.
Enlace de descarga del juego: https://archive.org/details/kingdom-rush-frontie-15717
Hackeando el juego
En varias secciones cubrí como alterar el código para maximizar o desbloquear todo para un aspecto específico del juego.
Obtener todas las estrellas
Empecé buscando en scripts con nombres que dieran la impresion de usar las estrellas del juego como GameUpgrades y MenuUpgrades.
No encontré nada en GameUpgrades pero en MenuUpgrades vi que se usa una variable game.stars para realizar cálculos cuando se elige una mejora, se deshace la última, o se reinicia el arbol de mejoras:

Luego de cambiar los valores iniciales de game.stars y game.starsWon podemos comentar o borrar la linea de this.game.stars -= param1.stars; para mantener el numero de estrellas inmutable.

Busqué la cadena “stars” con “/Tools/Text Search”:

Encontré que son definidas en el script §_-BQ§:

El máximo de estrellas que se pueden obtener son, al parecer, 77:

Cambiamos los valores de stars y starsWon (recordar que se usa en el reset de MenuUpgrades y tal vez en otras validaciones, por lo que es conveniente cambiarla también) al máximo de estrellas.

Antes de revisar los cambios actualicé en el script MenuUpgrades las lineas this.game.stars += §true const do§(this.§_-b5§.getChildAt(_loc2_[_loc3_])).stars; y this.game.stars -= param1.stars; por this.game.stars = this.game.stars; para mantener el numero de estrellas inmutable.
Noté que §_-BQ§ era como un script para inicializar valores al crear un nuevo slot local y resultó ser el punto de partida de casi todas mis modificaciones. Veamos ahora:

Desbloquear todos los niveles
Aunque tengamos todas las estrellas solo nos permite jugar el primer nivel. Estuve un rato saltando de un lado a otro, revisando, y al final encontre que en §_-BQ§ hay un array data.levels que se inicializa con algunas constantes “LEVEL_…”:

Toma valores de una clase §true final§, que se encuentra en un script del mismo nombre con un constructor que inicializa los niveles como deshabilitados:

También vi las declaraciones de las variables locales y estas fueron las líneas que cambié en §true final§:
1 | 40: public var stars:int; ===> public var stars:int = 3; |

Para que se mantenga al recargar el slot cambié esta inicializacion de los niveles en §_-BQ§:

Para evitar que el numero de estrellas pase de 77 tambien modifiqué algunas lineas en una serie de scripts.
§override const static§:

MenuVictoryHeroic:

MenuVictoryIron:

ComicEnd:

Prefiero introducir una línea que no hace nada a dejarlo en blanco porque me ayuda a recordar cual era la lógica que existía en ese fragmento de código.
Desbloquear todas las mejoras
Fui a las declaraciones de variables en el script Game Upgrades y actualicé al nivel maximo (5) las 6 mejoras. Además de los niveles de mejora cambié los booleanos que parecían ser nombres de mejoras (algunos estaban ofuscados), al final deben lucir así:
1 | public var archersUpLevel:int = 5; |

Bola de fuego y Refuerzos instantáneos
Filtrando por la palabra “fireball” eventualmente encontré que el script §_-Mm§ contiene las características de muchos elementos del juego, incluyendo las habilidades fireball y reinforcement (esta con valores para varios niveles de la habilidad).
Podemos cambiar el tiempo de espera de los meteoritos aquí:

Elegí 10 frames porque hay dos mejoras que reducen el coolDown en 5 segundos como se puede ver aquí:

Para cambiar el tiempo de espera de los refuerzos al máximo nivel hacemos esto:


Desbloquear a todos los héroes
Para desbloquear a Mirage y a Cronan cambié las variables showedUnlockedMirage:Boolean y showedUnlockedCronan:Boolean a true en §_-BQ§.

Para desbloquear al resto supuestamente debía usar un slot online pero buscando por nombres de uno de estos héroes me encontré que en el scriptif const function§, en su función checkPremiumContent hay un switch que devuelve false para Alric (el héroe disponible al principio):

Entonces cambié todas esas validaciones que se hacen contra “purchasedhéroes” por false, rezando porque me devolviera todos los héroes desbloqueados.
1 | switch(param1) |

Mejorar los héroes al máximo
En el script §_-2i§ se observa que los héroes tienen un arreglo de habilidades, por ejemplo, Nivus:
1 | var _loc22_:* = new Object(); |
Su nivel inicial es 4 y sus habilidades comienzan en el nivel 0. Solo debemos cambiar su nivel, el nivel de todas sus habilidades al máximo(3) y sus puntos de habilidad a 0 (porque los hemos usado todos y con un reset los podemos recuperar). Haremos esto para cada héroe.

Intenté subir al capitán a un nivel muy alto y se convirtió en Mister Not-A-Number:

En la imagen dice nivel 10 pero en realidad usé un número más alto, parece que este es el límite.
Desbloquear la enciclopedia completa
Ir al script §null throw§ e inicializar todas las variables públicas “notificationTower…” y “notificationEnemy…” a true.

Conclusiones
Como habrás observado crackear juegos flash es bastante sencillo, solo requiere un poco de tiempo y algo de intuición que se gana programando (eso y que el desarrollador no sea mediocre estructurando su codigo o nombrando sus variables, en cuyo caso la pasarás mal).
No cubrí en este artículo como alterar el oro ni las capacidades de las torres y enemigos. Eso es algo que seguramente puedes averiguar por tu cuenta realizando un análisis similar (puedes usar CheatEngine si lo que quieres es algo rápido).
Eso es todo.