arkos escribió:
Se ha de usar un desensamblador para ello?
Uso el Spectaculator y no sé si éste emulador viene con dicha herramienta incluida.Hay una opción que pone Debugger, pero no sé lo que es exáctamente.
Sé que este emulador tiene multiface donde pones los pokes, o directamente en la opcion "Poke memory".
La verdad es que me gustaría encontrar los pokes por mí mismo.
El Debugger es un depurador, o lo que es lo mismo, un desensamblador en tiempo real que aparte de desensamblar te enseña el estado actual de los registros y permite además ir ejecutando el programa paso a paso para ver que es lo que hace exactamente cada parte. Es por esto que es la herramienta más importante para encontrar pokes, prácticamente imprescindible.
La Biblia del Hacker es una gran fuente de información, pero que yo recuerde se centraba sobre todo en reventar las protecciones de las cargas, no en encontrar los pokes. Hoy dia con los emuladores basta con esperar a que el programa se ejecute para poder examinarlo por dentro, así que no hay necesidad de desproteger nada.
En un principio la búsqueda de pokes se basa en localizar el código, examinarlo y modificarlo para que haga lo que tú quieras. En un principio puede parecer una locura ponerse a examinar todo el código, pero existen algunas técnicas para agilizar la búsqueda.
Por ejemplo, para encontrar un poke de vidas infinitas, graba un estado de la memoria (lo mejor sería en formato .SNA, ya que no está comprimido), cuando te maten una vida grabas otro, y cuando te maten otra vida, grabas otro. Luego compararas los archivos descartando la cabecera del .SNA y la memoria de video (que son 6912 bytes), y búsca posiciones que varían de un snapshot a otro, y dentro de esas posiciones, aquellas donde
aparezca el valor del número de vidas (o este valor menos 1), y en cada estado de la memoria debe haberse decrementado dicho valor en 1. Así conseguiras la dirección de memoria donde se guardan las vidas, y ahora es cuestión de buscar esa dirección de memoria en el código, de forma que si encuentras algo así:
ld hl,direccion_vidas
dec (hl)
o bien esto:
ld a,(direccion_vidas)
dec a
ld (direccion_vidas),a
ya has localizado la parte donde se quitan las vidas, parcheas la dirección del dec con un nop (valor 0), y ahí tienes el POKE.
Aparte del poke de vidas infinitas, es posible que este valor te valga para modificar el número inicial de vidas.
Otros pokes como el de invulnerabilidad (que suelen consistir en poner un RET (valor 201) en la rutina que comprueba la colisión con el enemigo) pueden ser más complicados.