Archivo de la etiqueta: descompilar

Ya volvió a terminar (por un tiempo) mi obsesión por descompilar

Todos tenemos alguna obsesión que viene de vez en cuando (a mi me viene cada año mas o menos), no se si cuando consigues ganarla y salir victorioso ya no vuelve y te sientes bien, porque a mi cada vez que me viene me deja en un estado desolación y hundido.

No se cuando volverá la obsesión, se que empezó en tiempos universitarios y me viene de vez en cuando, lo único bueno que saco a esta mierda es que cada vez que salgo de una crisis de obsesión he aprendido algo nuevo de bajo nivel (de la informática de verdad, la baremetal donde te cortas y sangras con afilados trozos de ordenadores) y así voy juntando trocitos de sabiduría después de salir ahostiado cada vez que me obsesiono con esta mierda.

En mi caso, la obsesión viene por liberar viejos juegos de msdos que gracias a DosBox podemos seguir jugando, pero hablando con un amigo aunque suene a bravuconada solo existen dos tipos de juegos:

  • los que puedes liberar completamente, porque los ficheros o como se guarden de datos del juego (imágenes/sprites, músicas, sonidos, niveles/mapas, modelos 3D….) no tienen ningún peso en lo que define juego. Ejemplos de eso es el OpenTTD que es la versión libre del Transport Tycoon y ya tiene como dije hace años todo libre (en OpenTTD es libre desde hace 4 años ) no creo que haya ningún frikazo en la faz de la tierra que se queje de noseque tren de vapor no tiene un pixel de un color o al original o que la generación de mapas no es fiel a la original. Y otro que se libera o reimplementa libre fácilmente es el Tetris por mucho que le joda al cabrón de Alexey Pazhitnov que ya en el 2008 puso a parir al software libre (ni olvido, ni perdón Pajinov) porque quién se va quejar de que una ficha del tetris es de color amarillo en vez blanco como el original o mierdas parecidas.
  • los que no puedes liberar completamente, porque el código del juego no es lo que le da la entidad al juego y lo que lo hace recordado y que la gente dice es que el juego Piticlin es Piticlin porque tiene ese comienzo con ese nivel y ese personaje icónico. Y aunque es elogiable y espectacular la liberación del videojuego de la Nint€ndo (ya están sus jodidos abogados afilando cuchillos) del Mario64 en https://github.com/sm64pc/sm64ex y que ya hable de el en Vídeo de las instrucciones para compilar Super Mario 64 para GNU/Linux y es que si coges ese motor y le pones un pingüino en 3D rechulón y te haces unos niveles a cualquiera que se lo muestres va decir «pues eso no es el mario64» .

Y es que hay muchos juegos viejos de msdos que podrían liberarse y que se podrían sustituir los ficheros de datos del juego por unos libres y la gente seguiría sintiendo que es el mismo juego pero libre.

El problema es que le he añadido mas capas de complejidad a esta mierda de obsesión, y quiero hacerlo usando herramientas libres, nada de IDA Pro piratones.

Bueno vayamos por partes, ya ha pasado esta semana de obsesión y como siempre me acerco un pasito mas.

Descompilar, es la fantasía que antes salía mucho en las películas era como desencriptar al vuelo. Recuerdo en mis tiempos mozos que creía que podía ser posible, pero lo mas cercano a las pelis es si se han dejado muchos datos de depuración en el fichero binario o si es un lenguaje interpretado. Porque cuando me obsesione (en tiempos de win98) por primera vez, descubrí que los compiladores optimizan y cambian los nombres de variables, desenrollan bucles y incluso incrustan funciones y mil cosas mas que dejan el código ideal para la maquina. Entonces la fantasía de un programa que te unos ficheros C a partir de un binario no existe.

Desensamblar, es pasar un binario a un fichero en lenguaje ensamblador. Este es menos fantasía pero también algo porque ya en binarios que de winXX o GNU/Linux tienes librerías dínamicas y no van a caer dentro del fichero. Y luego no se si las mierdas raras que hagas en el código rollo interrupciones o partes ejecutables guardadas en forma de datos (en z80 se que se puede y creo que en 386 también después ya no) es capaz de encontrarlas.

Por desgracia mi obsesión cogió mas fuerza por culpa del OpenRCT2 que viví (uff hará años mas) en el viejo y desparecido git su liberación con una descompilación, y solo  han quedado los siguientes consejos Decompiling Tips IDA .

Pues hace un año me dio y probe con la mierda de IDA, nada.

Yo lo que buscaba esta vez es si existe una herramienta que te dado un exe viejote autocontenido de msdos te devuelva un puñado de ficheros .c/.h con nombre autogenerado, funciones con nombres autogenerados y variables con nombres autogenerados pero con un int main (int argc, char argv**) de mierda que pudiera compilar todo otra vez y te generada un exe que aunque tuviera distinto tamaño y CRC hiciera lo mismo que el original.

Esta vez incluso he disparado una pregunta infructuosa al stackoverflow de reverse engineering is there a tool to decompile old exe to C? lo peor es que me ha venido el autor del engendro llamado Reko (manda cojones porque no lo haces en un lenguaje de verdad en vez del puto mono/.net ) diciendo que podría valer su mierda, pues primero arregla tu mierda para que use la última versión estandar de mono  y después hablamos, porque lo único que he aprendido de ti es ha trabajar con distintas versiones de paquetes deb con apt en linea de comando.

Hace 2 años cuando me obsesione (junto con otra obsesión con tener un fichero plano para Goxel un editor libre 3D de voxels)  aprendi a usar y me molo mucho la herramienta Kaitai Struct que te permite definir como yml un formato de fichero binario y crear parseadores en lenguajes tan variados como Python y tiene inventos como un editor web para ir haciendo el famoso fichero para definir el tipo de fichero binario. Una delicia.

En mis pruebas he tirado un holamundo en C compilado con Turbo C dentro de un DosBox y el juego de Alley Cat.

Esta última vez me aventure a usar (dentro de una maquina virtual porque son los malos no de la peli si no del planeta Ghidra de la NSA supongo que incluso metido dentro de una maquina virtual ya me han visto hasta la talla de cazoncillos, pues no es tan bueno.

Y probé que tiene muy buena pinta Radare2, ese si que es el futuro.

Y gracias a Ru (Ruben Santos) y su repo de Ru me volvio abrir los ojos a otra forma de descompilar pasandome el link del subreddit https://www.reddit.com/r/REGames/ y ahí encontre un post/meneo sobre la descompilación de un ruso del juego de Tube de Bullfrog este te lleva a un github que tiene un link a un foro ruso en ruso sobre como ha ido haciendo la descompilación (benditos traductores).

No esta al detalle todo, pero habla de algo que yo también pensé un poquito, y es envolver en un C tuyo el juego para ir poquito a poquito quitando el ensamblador y que sea C puro.

Entonces como notas para el Miguel del futuro, tienes que volver al ASM que es otra de mis obsesiones, aprenderlo bien bien. Y darle vueltas a ver como puedo envolver un binario viejo en un C.

Creo que voy a volver a mi obsesión de picar un juego en Spectrum…la crisis de los 40 en el mundo friki…

«El paciente» a descompilar es un exe de msdos en formato MZ

Posts in this series
  1. Compilar C en m$dos en nuestros tiempos
  2. "El paciente" a descompilar es un exe de msdos en formato MZ

Aunque voy despacio, voy a ir poniendo mis avances, que supongo que es poquito, pero bueno por seguir la Método de depuración del patito de goma o el refrán oriental que dice «El que enseña aprende dos veces.» .

La verdad es que en los primeros palos de ciego y análisis creí que «el paciente» era un ejecutable de tipo COM o algo así, pero ahora volviendo a analizarlo he encontrado el famoso:

MZ

0x4D 0x5A

Eso ayuda un montón porque si queridos mios, los ejecutables también tienen formato y no es estándar, hay muchos muchos estándares (en m$-dos hablamos…en otros sistemas operativos…pues habrá los suyos).

Como dice en el foro de ubuntu: Learning how to disassemble dos binaries

If actual DOS executables disassembly is the thing you are searching for, then search for disassemblers, that can handle the MZ magic [$4D 5A] (the default DOS 16bit header) or elf, coff, xcoff, ecoff, mach and such …

Bueno pues ahora entender la estructura de fichero de el formato DOS MZ .

Si alguno tiene alguna pista, estaré agradecido.