Y vamos a terminar ahora con la serie dedicada a hackear juegos en el Speccy, lo que se conocía en la época como desprotegerlos. Vamos a buscar vidas infinitas em Abu Simbel Profanation e Ikari Warriors. Y como herramienta, utilizaremos em emulador de Spectrum Zesarux.
En la última entrega de esta serie, vimos a grandes rasgos cómo crear uno de aquellos cargadores que proporcionaban vidas infinitas o bombas infinitas, o cualquier otro cheat, metiendo POKEs justo antes de la ejecución del programa.
Pero en esta entrega vamos a centrarnos en otro tipo de hack: simularemos que tenemos un Multiface. Este aparato permite, conectado a la parte trasera del Speccy, pulsar un botón rojo que genera una NMI (Non Maskable Interruption o interrupción no enmascarable). Al pulsar el botón, al Speccy no le queda más remedio, esté haciendo lo que esté haciendo, que ejecutar el código del vector de interrupción dado, lo que ejecuta su software mientras el software está en memoria. Lo que se podía hacer entonces era guardar el contenido de la memoria (con lo que podías guardar el juego tal cual se estaba ejecutando en ese momento), introducir POKEs, o explorar la memoria.
Vamos a simular, como decía, la forma de utilizar un periférico como Multiface, pero con la comodidad de un emulador de hoy en día. Todo lo que vamos a hacer aquí se puede hacer con dicho aparato enchufado y siguiendo sus instrucciones, pero lógicamente es mucho más tedioso.
Abu Simbel Profanation
Este juego fue creado por Víctor Ruiz para su sello familiar (compartido con sus heramanos), Dinamic. Según las entrevistas que se le han hecho con el tiempo, fue creado en una especie de versión más limitada de BASIC, que era posible compilar a código máquina.
Al arrancar Zesarux, seleccionamos la cinta a cargar en el menú Z >> smart load, que en este caso será el .TAP o .TZX descargado desde la web de World of Spectrum. Este emulador es muy particular, y cargará la cinta él solo, como si hubiéramos tecleado la secuencia de comandos.
Cuando el juego se ejecute, seleccionamos la opción 3. keyboard (o 2. kempston si tenemos un controlador conectado), y el juego nos sitúa dentro de la pirámide con cierta (infame) gota cayendo desde el techo.
En la parte superior del escritorio de Zesarux, a la derecha de la pantalla del Speccy, veremos un icono de una cucaracha: se trata de las opciones que nos permitirán depurar un programa. Vamos a utilizarlo para encontrar pokes. Nos metemos en la opción Debug >> Find >> Find bytes.
| # | Menú | Submenú | Submenú | Submenú |
|---|---|---|---|---|
| 1 | Debug | Find | Find bytes | Find bytes (initial) |
| 2 | Find bytes (next) | |||
| 3 | View results | |||
| 4 | Clear results |
En la tabla anterior vemos las posibilidades del menú. Aunque hay opciones automatizadas para buscar POKEs, lo haremos de forma genérica para permitir buscar cheats sobre municiones, granadas, etc.
Comenzamos. La primera vez seleccionamos (1), Find bytes (initial). Ahora que estamos en el juego podemos buscar el valor 10, que introducimos, pues es el número inicial de vidas. Nos dará varios cientos de resultados, como es de esperar, pero lo importante es que Zesarux va a recordar los resultados. Así, la siguiente vez que entremos en el menú, nos encontraremos con (2) Find bytes (next), en lugar de la opción (1). ¡Pero espera! Aún es pronto.
Mueve a Johnny Jones con las teclas O (izquierda), P (derecha), y Q (salto) hasta... sí, la gota. Ponle debajo y pierde una vida. Confía en mi, merecerá la pena... Es verdad, ahora solo tienes 9 vidas, pero verás lo que pasa.
Volvemos al menú de Find y (2) Find bytes (next), y esta vez introducimos 9. ¡Solo hay una coincidencia! Pulsamos ESC y volvemos al mismo submenú para seleccionar (3) View results. La dirección de memoria con valor 9 es 38818. ¡Ya sabemos en qué posición de memoria guarda el juego las vidas!
Nos vamos de nuevo al menú Debug, y esta vez seleccionamos la opción POKE. Seleccionamos la primera opción, POKE.... Nos pregunta la dirección, introducimos 38818. A continuación, nos pregunta con qué valor queremos modificar la dirección 38818. En cada posición de memoria, solo podemos escribir un valor entre 0 y 255. Sabemos que va a ser el número de vidas disponible, así que... ¡qué caray! ¡Introduzcamos 255! ¡Mejor que zozobre que no que zofalte!
A continuación, nos pregunta cuántos bytes queremos modificar. Lo más normal es, como en esta ocasión, que sea solo uno. Pero es posible que, para valores por encima de 255, un juego utilice dos (el mínimo), o más bytes. En este caso, simplemente introducimos 1.
Tras pulsar ENTER, puede que pensemos que algo ha ido mal. Que no ha cambiado nada. Pero... llevemos a Johnny hasta la gota, para morir de nuevo. Solo una vez más. Si lo hacemos... ¡habrán aparecido 254 vidas restantes! Tiene sentido que el juego solo actualice el marcador de vidas del jugador cuando este número cambia... es decir, cambia según las reglas normales del juego.
Un detalle curioso es que no aparece solo "254", sino "0254". Está claro que Víctor Ruiz quería que los marcadores estuvieran "equilibrados", ya que hay más de 10 pantallas, y en la primera se muestra como "01", no como "1". Está claro que el número de vidas es tan exagerademente alto, que el algoritmo para mostrar vidas se desborda. Literalmente.
Un detalle... creo que es en la segunda o en la tercera pantalla que es posible caer en un pozo vertical que termina en unas mortíferas agujas... Es importante que no caigas ahí, o... tendrás que esperar a morir doscientas y pico veces (o, mejor, hacer un POKE de 38818 con 1).
Si queremos buscar algún otro valor en memoria, tendremos que seleccionar (4) Clear results, para poder volver a empezar, seleccionando de nuevo la opción (1) Find bytes (initial).
Ikari Warriors
El siguiente juego que desprotegeremos es Ikari Warriors. Descárgate el .TAP o el .TZX, y cárgalo en Zesarux, de nuevo mediante la opción de menú Z >> Smart load. El juego pide seleccionar el controlador del primer jugador, y después del segundo jugador. En mi caso, redefeniré las teclas (opción 1), del juego para el Jugador 1, y cualquier otra cosa pra el Jugador 2, pues no pienso usarlo. Finalmente, seleccionamos (1) (Start one player game) para comenzar el juego.
Las vidas están representadas mediante cabezas del héroe, son 6 en total. Así que seleccionamos (1) Find bytes (initial), e introducimos 6 (o las vidas que nos queden en ese momento, el juego no se anda con chiquitas). Nos dirá que hay más de seiscientos resultados. Seguramente ya nos habrán matado una o dos veces, seleccionamos (2) Find bytes (next) e introducimos el número de vidas que nos quede. Ahora ya solo aparecerá un resultado. Con (3) View results, comprobaremos que la dirección de memoria de las vidas es 58478. Ahora seleccionamos Debug >> Poke >> Poke.... Introducimos la dirección de memoria, 58478. A continuación, nos pide un valor, sabemos que como máximo puede estar entre 0 y 255. Pero... ¡cuidado! Recuerda que las vidas se representan con figuras en la pantalla. Si introducimos un valor demasiado alto, las figuras se extenderán corrompiendo la pantalla, e impidiendo que nuestro héroe se mueva por ella. Un valor seguro es 40, ya que son las 10 filas por cuatro figuras que se pueden representar en pantalla sin sobrepasar el espacio destinado para ellas. El juego, como decía, no se anda con chiquitas, así que tendrás que introducir el POKE a 58478 con 40 varias veces. En cambio, es bastante improbable que te quedes sin granadas, pudiendo llegar a acumular varias docenas. Así que, personalmente, no creo que merezca la pena buscar el POKE correspondiente. Aún así, lo hice por experimentar, pero... no salió nada, ni con las granadas ni con los disparos. Probablemente, algún tema de ofuscación, curioso.
En cualquier caso, ya sabes cómo encontrar vidas en un juego. ¡Enhorabuena, eres un hacker!
¿Qué?
¿Cómo?
¿Qué con estas técnicas y ciertos programas buscadores de cheats, también se pueden buscar vidas infinitas en lo juegos de ahora? No tengo ni idea de lo que me estás hablando...











Top comments (0)