{"id":256,"date":"2015-02-24T23:44:33","date_gmt":"2015-02-24T21:44:33","guid":{"rendered":"http:\/\/www.joanillo.org\/?p=256"},"modified":"2020-09-15T23:45:57","modified_gmt":"2020-09-15T21:45:57","slug":"hackejar-una-rom-de-gameboy","status":"publish","type":"post","link":"https:\/\/www.joanillo.org\/?p=256","title":{"rendered":"Hackejar 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 tingut bastants problemes per emular els jocs de <strong>Gameboy<\/strong> a la Raspberry Pi. Finalment l&#8217;emulador <em>Fednafen<\/em> \u00e9s el que funciona, tal i com es fa a Pimame. El m\u00f3n dels emuladors \u00e9s bastant complicat. Per entendre com funciona una ROM per dins i com es programa un emulador que treballi amb aquestes ROMs s&#8217;ha d&#8217;estudiar l&#8217;arquitectura del Z80, con\u00e8ixer l&#8217;ensamblador, i t\u00e8cniques avan\u00e7ades de depuraci\u00f3 amb llenguatge C. Per\u00f2 aqu\u00ed anem a fer una cosa relativament senzilla.<\/p>\n<p>Es tracta de fer un petit hack d&#8217;una rom de Gameboy. Es tracta de ficar un llibre a dins de la ROM, concretament ficar diferents articles i textos del gran fil\u00f2sof catal\u00e0 <a href=\"http:\/\/ca.wikipedia.org\/wiki\/Francesc_Pujols_i_Morgades\" title=\"Francesc Pujols\"><strong>Francesc Pujols<\/strong><\/a>, aquell que va dir que que <em>Els catalans anir\u00edem pel m\u00f3n i ho tindr\u00edem tot pagat<\/em>.<\/p>\n<p>Parteixo d&#8217;una rom que ja \u00e9s un llibre, un llibre en polon\u00e8s: <em>Ziarno_Prawdy_-_Book_by_Andrzej_Sapkowski_polish.gbc<\/em>. Encara que no tinc ni punyetera idea de polon\u00e8s, arrenco la rom amb l&#8217;emulador i la idea est\u00e0 clara: amb els botons pots navegar pels diferents cap\u00edtols, pots anar a l&#8217;inici, i tens dos modes de lectura: l\u00ednia a l\u00ednia, o p\u00e0gina a p\u00e0gina. La idea \u00e9s localitzar les posicions de mem\u00f2ria on est\u00e0 la informaci\u00f3 rellevant, i substituir-ho per la informaci\u00f3 (els bytes) que interessa.<\/p>\n<p>Dic que aquest projecte \u00e9s bastant senzill perqu\u00e8 tenim 5 cap\u00edtols amb un tamany concret i m&#8217;he de limitar a aquestes posicions i blocs d&#8217;informaci\u00f3. All\u00f2 xulo seria poder ficar m\u00e9s cap\u00edols, de longitud variable, i poder navegar per tots els cap\u00edtols. Per\u00f2 per fer-ho s&#8217;hauria de desensamblar el codi i entendre com funcionen els jumps als diferents cap\u00edtols, i aix\u00f2 s\u00ed que seria interessant i m\u00e9s dif\u00edcil.<\/p>\n<p>B\u00e9, mans a l&#8217;obra. Faig servir la utilitat <strong>xxd<\/strong> com a lector de fitxers binaris, que d\u00f3na una sortida hexadecimal i a la part dreta es pot localitzar la informaci\u00f3 textual rellevant.<\/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 aquest bloc hem localitzar el t\u00edtol i l&#8217;autor. El llibre es diu <em>Ziarno Prawdy<\/em> i l&#8217;autor \u00e9s <em>Adrzej Sapkowski<\/em> (un nom ben polon\u00e8s). La posici\u00f3 de l&#8217;autor comen\u00e7a a 405b (hex), que \u00e9s 16475 bytes en decimal. I on acaba <em>Prawdy<\/em> \u00e9s la posici\u00f3 4091 hex = 16529. Per tant, s\u00f3n 16529-16475=54 bytes, que jo substituir\u00e9 per &#8220;<em>EL PENSAMENT I LA FILOSOFIA DE FRANCESC PUJOLS<\/em>&#8220;. Amb aquesta t\u00e8cnica hem de substituir el t\u00edtol i autor, el men\u00fa, i els diferents cap\u00edtols (hi ha 5 cap\u00edtols).<\/p>\n<p>Mostro un exemple de codi amb llenguatge C per substituir en un fitxer binari uns bytes per uns altres en una posici\u00f3 determinada. Un exemple senzill seria:<\/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>Partint d&#8217;aquest exemple que funciona ja podem fer tota la substituci\u00f3 de les cadenes.<\/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 funcionat com pots veure (i llegir a la foto). En qualsevol cas, la Gameboy no \u00e9s la millor consola per llegir llibres, i d&#8217;altra banda com era d&#8217;esperar els accents no funcionen. Pots descarregar el codi sencer a 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 a la wiki de joanillo.org<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>He tingut bastants problemes per emular els jocs de Gameboy a la Raspberry Pi. Finalment l&#8217;emulador Fednafen \u00e9s el que funciona, tal i com es fa a Pimame. El m\u00f3n dels emuladors \u00e9s bastant complicat. Per entendre com funciona una ROM per dins i com es programa un emulador que treballi amb aquestes ROMs s&#8217;ha [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[7,18,16,12,10],"tags":[270],"_links":{"self":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/256"}],"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=256"}],"version-history":[{"count":1,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/256\/revisions"}],"predecessor-version":[{"id":257,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/256\/revisions\/257"}],"wp:attachment":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=256"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=256"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=256"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}