martes, 20 de enero de 2015

Ejemplo de game-hack en ensamblador (x86)

Bueno chicos, como no recibo ninguna sugerencia, os enseño un ejemplo de las modificaciones o hacks que se pueden hacer fácilmente en ensamblador/hexadecimal.
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.


Concretamente, en este juego de coches, el hack consiste en que al activar el claxon del coche, el coche se eleva por los aires, permitiendo acceder a escenarios que no se puede acceder normalmente en el juego y pasar encima de los edificios.

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 :')

No hay comentarios:

Publicar un comentario