En esta ocasión quería centrarme en algún juego para Windows, que es lo que se lleva hoy en día (Aunque modificar ROMs es mas sencillo, este formato ya no se lleva)
Me centraré en lo que viene siendo modificación de código, si quisierais modificar gráficos o música, es tan sencillo como acceder a la carpeta donde esta instalada la aplicación o juego, y buscar el archivo que queréis cambiar. El código por el contrario se suele encontrar en el *.exe
Concretamente en este ejemplo os enseñaré un hack que hice para el juego "Midtown Madness 2",
un juego que tiene ya unos años, no es un juego legendario, pero me basta para haceros un ejemplo de lo que se puede hacer de forma muy sencilla en ensamblador.
Para ello, necesitamos encontrar el codigo que se ejecuta cuando activamos el claxon.
Gracias al programa "Cheat Engine" pude encontrar este codigo con facilidad. (Recordemos que Cheat Engine ademas de ser un conocido programa para modificar variables in-game, tambien tiene un desensamblador muy bueno)
Cuando encendemos el claxon se ejecuta un procedimiento en la dirección 0x000d17dc y cuando se apaga, otro procedimiento en la dirección 0x000d181c.
Si vamos a estas direcciónes encontramos:
...................
000D17DC - mov [esi],00000001
000D17E2 - pop esi
000D17E3 - ret
000D17E4 - nop
000D17E5 - nop
000D17E6 - nop
000D17E7 - nop
000D17E8 - nop
000D17E9 - nop
000D17EA - nop
000D17EB - nop
000D17EC - nop
000D17ED - nop
000D17EE - nop
000D17EF - nop
000D17F0 - push esi
...................
...................
000D181C - mov [esi],00000000
000D1822 - pop esi
000D1823 - ret
000D1824 - nop
000D1825 - nop
000D1826 - nop
000D1827 - nop
000D1828 - nop
000D1829 - nop
000D182A - nop
000D182B - nop
000D182C - nop
000D182D - nop
000D182E - nop
000D182F - nop
000D1830 - push ebp
...................
Como veis, el registro esi en estos dos casos contiene la dirección de memoria de un entero que se pone a 1 cuando el claxon esta encendido y a 0 cuando esta apagado. Esta variable ha sido la que me ha ayudado a encontrar el código. Y ademas vemos una buena noticia, y es que hay muchos bytes sin utilizar hasta el siguiente fragmento de código, lo cual nos ayuda a implementar el mod.
Ahora para hacer que el coche vuele, lo que tendremos que hacer es meter un código en este hueco que ponga el valor de la velocidad vertical del coche a un valor alto.
Este valor es un float que se debe encontrar con un puntero (situado en la dirección 0x005dfd20 al que hay que añadir a su valor 2450 en hexadecimal).
Yo personalmente le he puesto 30.0 de valor al float (41f00000), aunque se le puede dar cualquier otro, mayor o menor. Podemos aprovechar el registro esi que como vemos es reemplazado inmediatamente después cargando desde stack. El código queda así:
000D17DC - mov [esi],00000001
000D17E2 - mov esi,[005DFD20]
000D17E8 - add esi,00002450
000D17EE - jmp 000D1824
000D17F0 - push esi
...................
...................
000D181C - mov [esi],00000000
000D1822 - pop esi
000D1823 - ret
000D1824 - mov [esi],41F00000
000D182A - pop esi
000D182B - ret
000D182C - nop
000D182D - nop
000D182E - nop
000D182F - nop
000D1830 - push ebp
...................
Como veis, he aprovechado parte de los bytes sin utilizar tras el procedimiento de apagar el claxon, ya que con el hueco del procedimiento al encender el claxon me quedaba corto de espacio.
¡Y con esto ya esta implementado!
Si lo vemos con un editor hexadecimal vemos que los bytes que hemos cambiado son muy pocos.
Y sorprendentemente estos pocos bytes nos han permitido hacer un mod de vuelo totalmente funcional.
Ya sabeis, cualquier comentario o sugerencia (con otros juego si queréis) que queráis hacer... No es necesario registrarse para comentar. Aunque creo que ya lo sabeis :')