{"id":258,"date":"2015-02-24T23:46:00","date_gmt":"2015-02-24T21:46:00","guid":{"rendered":"http:\/\/www.joanillo.org\/?p=258"},"modified":"2020-09-16T12:27:08","modified_gmt":"2020-09-16T10:27:08","slug":"hackear-una-rom-de-gameboy","status":"publish","type":"post","link":"https:\/\/www.joanillo.org\/?p=258&lang=es","title":{"rendered":"Hackear una ROM de Gameboy"},"content":{"rendered":"<p><a href=\"http:\/\/www.joanillo.org\/wp-content\/uploads\/2015\/02\/pujols_300.jpg\"><img loading=\"lazy\" src=\"http:\/\/www.joanillo.org\/wp-content\/uploads\/2015\/02\/pujols_300.jpg\" alt=\"\" title=\"pujols_300\" width=\"300\" height=\"169\" class=\"alignright size-full wp-image-992\"><\/a>He tenido bastantes problemas para emular los juegos de <strong>Gameboy<\/strong> en la Raspberry Pi. Finalmente el emulador <em>Fednafen<\/em> es el que funciona, tal y como se hace en Pimame. El mundo de los emuladores es bastante complicado. Para entender c\u00f3mo funciona una ROM por dentro y c\u00f3mo se programa un emulador que trabaje con estas ROMs se tiene que estudiar la arquitectura del Z80, conocer el ensamblador, y t\u00e9cnicas avanzadas de depuraci\u00f3n en lenguaje C. Pero aqu\u00ed vamos a hacer una cosa relativamente sencilla.<\/p>\n<p>Se trata de hacer un peque\u00f1o hack de una rom de Gameboy. Se trata de poner un libro dentro de la ROM, concretamente meter diferentes art\u00edculos y textos del gran fil\u00f3sofo catal\u00e1n <a href=\"http:\/\/ca.wikipedia.org\/wiki\/Francesc_Pujols_i_Morgades\" title=\"Francesc Pujols\"><strong>Francesc Pujols<\/strong><\/a>, aqu\u00e9l que dijo que un d\u00eda <em>Los catalanes ir\u00edamos por el mundo y lo tendr\u00edamos todo pagado<\/em>.<\/p>\n<p>Parto de una rom que ya es un libro, un libro en polaco: <em>Ziarno_Prawdy_-_Book_by_Andrzej_Sapkowski_polish.gbc<\/em>. Aunque no tengo ni pu\u00f1etera idea de polaco, arranco la rom con el emulador y la idea est\u00e1 clara: con los botones puedes navegar por los diferentes cap\u00edtulos, puedes ir al principio, y tienes dos modos de lectura: l\u00ednea a l\u00ednea, o p\u00e1gina a p\u00e1gina. La idea es localizar las posiciones de memoria donde est\u00e1 la informaci\u00f3n relevante, y substituirlo por la informaci\u00f3n (los bytes) que interesa.<\/p>\n<p>Digo que este proyecto es bastante sencillo porque tenemos 5 cap\u00edtulos con un tama\u00f1o concreto y me tengo que limitar a estas posiciones y bloques de informaci\u00f3n. Lo chulo ser\u00eda poder meter m\u00e1s cap\u00edtulos, de longitud variable, y poder navegar por todos los cap\u00edtulos. Pero para hacerlo se tendr\u00eda que desensamblar el c\u00f3digo y entender c\u00f3mo funcionan los <em>jumps<\/em> a los diferentes cap\u00edtulos, y esto s\u00ed que ser\u00eda interesante y m\u00e1s dif\u00edcil.<\/p>\n<p>Bien, manos a la obra. Uso la utilidad <strong>xxd<\/strong> como lector de ficheros binarios, que a una salida hexadecimal y en la parte derecha se puede localizar la informaci\u00f3n textual relevante.<\/p>\n<blockquote><p>0004040: 0000 0000 0000 0000 0000 0000 0000 0000  &#8230;&#8230;&#8230;&#8230;&#8230;.<br \/>\n0004050: 2020 2020 2020 2020 2020 2041 6e64 727a             Andrz<br \/>\n0004060: 656a 2053 6170 6b6f 7773 6b69 2020 2020  ej Sapkowski<br \/>\n0004070: 2020 2020 2020 2020 2020 2020 2020 2020<br \/>\n0004080: 2020 2020 205a 6961 726e 6f20 5072 6177       Ziarno Praw<br \/>\n0004090: 6479 2020 2020 2020 2020 2020 2020 2020  dy<\/p><\/blockquote>\n<p>En este bloque hemos localizado el t\u00edtulo y el autor. El llibro se llama <em>Ziarno Prawdy<\/em> y el autor es <em>Adrzej Sapkowski<\/em> (un nombre muy polaco). La posici\u00f3n del autor empieza en 405b (hex), que es 16475 bytes en decimal. Y donde acaba <em>Prawdy<\/em> es la posici\u00f3n 4091 hex = 16529. Por tanto, son 16529-16475=54 bytes, que yo substituir\u00e9 por &#8220;<em>EL PENSAMENT I LA FILOSOFIA DE FRANCESC PUJOLS<\/em>&#8220;. Con esta t\u00e9cnica hemos de substituir el t\u00edtulo y el autor, el men\u00fa, y los diferentes cap\u00edtulos (hay 5 cap\u00edtulos).<\/p>\n<p>Muestro un ejemplo de c\u00f3digo en lenguaje C para substituir en un fichero binario unos bytes por otros en una posici\u00f3n determinada. Un ejemplo sencillo ser\u00eda:<\/p>\n<blockquote><p>#include <stdio.h><br \/>\n#include <string.h><br \/>\n#include <stdlib.h><\/stdlib.h><\/string.h><\/stdio.h><\/p>\n<p>int main()<br \/>\n{<br \/>\nint posicio = 10;<br \/>\nint tamany;<\/p>\n<p>char *str = &#8220;En un lugar de la Mancha&#8221;;<br \/>\nprintf(&#8220;%d\\&#8221;, strlen(str));<br \/>\ntamany = strlen(str);<\/p>\n<p>int counter;<br \/>\nFILE *ptr_myfile;<\/p>\n<p>ptr_myfile=fopen(&#8220;b.gbc&#8221;,&#8221;r+b&#8221;);<br \/>\nif (!ptr_myfile)<br \/>\n{<br \/>\nprintf(&#8220;Unable to open file!&#8221;);<br \/>\nreturn 1;<\/p>\n<p>}<\/p>\n<p>fseek(ptr_myfile,sizeof(char)*posicio,SEEK_SET);<br \/>\nfwrite(str, 1, sizeof(char)*tamany, ptr_myfile);<\/p>\n<p>fclose(ptr_myfile);<br \/>\nreturn 0;<br \/>\n}<\/p><\/blockquote>\n<p>Partiendo de este ejemplo que funciona ya podemos hacer toda la substituci\u00f3n de las cadenas.<\/p>\n<blockquote><p>0004040: 0000 0000 0000 0000 0000 0000 0000 0000  &#8230;&#8230;&#8230;&#8230;&#8230;.<br \/>\n0004050: 2020 2020 2020 2020 2020 2045 4c20 5045             EL PE<br \/>\n0004060: 4e53 414d 454e 5420 4920 4c41 2046 494c  NSAMENT I LA FIL<br \/>\n0004070: 4f53 4f46 4941 2044 4520 4652 414e 4345  OSOFIA DE FRANCE<br \/>\n0004080: 5343 2050 554a 4f4c 5320 2020 2020 2020  SC PUJOLS<br \/>\n0004090: 2000 2020 2020 2020 2020 2020 2020 2020   .<br \/>\n00040a0: 492e 2042 494f 4752 4146 4941 0a0a 4c27  I. BIOGRAFIA..L&#8217;<br \/>\n00040b0: 6573 6372 6970 746f 722c 2070 6f65 7461  escriptor, poeta<br \/>\n00040c0: 2069 2066 696c c3b2 736f 6620 6361 7461   i fil..sof cata<br \/>\n00040d0: 6cc3 a02c 2046 7261 6e63 6573 6320 5075  l.., Francesc Pu<\/p><\/blockquote>\n<p>I el hack ha funcionado como se puede ver (y leer) en la foto. En cualquier caso, la Gameboy no es la mejor consola para leer libros, y por otra parte como era de esperar los acentos no funcionan. Puedes descargar el c\u00f3digo entero en la wiki.<\/p>\n<ul>\n<li><a href=\"http:\/\/wiki.joanillo.org\/index.php\/Emulaci%C3%B3._Teoria#Hackejar_una_ROM_de_Gameboy_.28llibre_de_Francesc_Pujols.29\" title=\"Info a la wiki de joanillo.org\">+Info en la wiki de joanillo.org<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>He tenido bastantes problemas para emular los juegos de Gameboy en la Raspberry Pi. Finalmente el emulador Fednafen es el que funciona, tal y como se hace en Pimame. El mundo de los emuladores es bastante complicado. Para entender c\u00f3mo funciona una ROM por dentro y c\u00f3mo se programa un emulador que trabaje con estas [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[290,310,324,320,348],"tags":[270],"_links":{"self":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/258"}],"collection":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=258"}],"version-history":[{"count":1,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/258\/revisions"}],"predecessor-version":[{"id":259,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/258\/revisions\/259"}],"wp:attachment":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=258"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=258"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=258"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}