Bardzo malo artykulow na temat romhackingu jest napisanych w naszym rodowitym jezyku, a ze to temat dosc ciekawy i interesuje się nim sporo osob, postanowilem przygotowac maly tutorial.
Do dlubania w romach bardzo dobrze nadaje sie emulator Fceuxd (wersja SP 1.07 której uzywam do sciagniecia tu:
http://www.voila.pl/391/iyxnn/ ). Zawiera wszystkie potrzebne narzedzia: podglad pamieci, debugger i wiele innych:). Przyjrzyjmy się im. Odpalcie w Fceu jakakolwiek gre i w zakladce 'tools' (tam znajduja się wszystkie „hakerskie” narzedzia) wybierzcie hex editor. To co widzimy to pamiec nesa. Dla osob które wczesniej nie mialy do czynienia z hexami: kolumna po lewej to adres, najszersza po srodku to wartosci, po lewej te same wartosci jako znaki ascii (przydaje się do wyszukiwania tekstow). Wszystkie liczby zapisane w systemie szesnatkowym, do konwersji z dziesietnego na szesnastkowy i odwrotnie polecam windowsowy kalkulator z widokiem rozszerzonym;p.
Teraz z których fragmentow pamieci nes korzysta w jakim celu: od adresu 0x0000 do 0x07FF jest RAM, czyli pamiec zarowno do odczytu jak i zapisu. Konczy sie w tym miejscu, jesli ktos sie nie moze polapac w adresach:
Pośród tych cyferek zapisane są wszystkie rzeczy, które ulegaja modyfikacji w grze: liczba zyc, numer planszy, wybrana bron, itd. Jak te wartosci szybko wynajdywac w tym bajzlu, o tym pozniej. Od adresu 0x0800 mamy pamiec ram powtorzona kilka razy (czyli to samo tylko pod innymi adresami, to tylko jako ciekawostka, nie bedziemy z tego korzystac), potem parę innych rzeczy (dostęp do S-RAM, itd.), które tez nas poki co nie interesuja. Następny wazny segment zaczyna się dopiero od 0x8000 i zajmuje miejsce do samego konca, czyli 0xFFFF (32 kilobajty), nes trzyma tam caly kod gry. 32 kilobajty to troche malo jak na caly kod, są gry które zajmuja nawet 1mb, jak nes ma je wtedy adresowac? Do tego sluza mappery, które pozwalaja na podmiane pamieci (ten sam adres moze wskazywac cos innego).
Grafike nes przechowuje w zupelnie innym obszarze pamieci, mozemy się tam dostac zmieniajac w zakladce view podglad pamieci na ppu memory. Co się tam znajduje i jak dziala, o tym innym razem.
Teorii na razie wystarczy, teraz mozemy sprobowac znalezc w tym gaszczu cyfr jakas konkretna wartosc i ja zmienic. Jako przykład wybralem Contre, poszukamy miejsca w ramie przechowujacego liczbe zyc:). Więc odpalcie gre, niech wczyta się plansza (gra musi sobie poustawiac wszystkie wartosci) i zapauzujcie emulacje F2. Teraz czas na kolejne hakerskie narzedzie, tools->ram filter. Pozwala ono bardzo szybko wyszukiwac porzadane wartosci. Dziala w ten sposob, ze dostajemy przefiltrowane dane wg podanych regul (mniejsza od, większe od, rowne, itd.). Najlepiej pokazac na przykladzie. Jako pierwsza regule (1 rule) ustawiamy all (czyli wszystkie wartosci) i dajemy apply rule. W okienku ponizej pokaze nam się lista wszystkich wartosci w ramie (od 0x0000 do 0x07FF). Teraz wracamy do gry (okna z ram filter nie zamykamy!). Odpauzujmy F2 i stracmy jedno życie:) (po straceniu trzeba poczekac az odejmie nam ten niebieski medal u gory). Znowu pauza i wracamy do ram filter. Jako następna regule ustawiamy 'less than last value', co ze wszystkich wczesniejszych wartosci z listy wybierze tylko te, które zmniejszyly swoja wartosc (gdzies wsrod nich będzie liczba zyc:)). Dajemy apply rule. Jak widac lista znacznie się zmniejszyla, ale nadal jest tego pelno;p. Więc jeszcze raz: wracamy do gry, F2, tracimy życie, F2. Znowu ram filter, jako trzecia regula znowu 'less than last value' i apply. Tym razem na liscie powinno zostac już bardzo malo danych, u mnie już widac który adres odpowiada za zycia:). Ram filter ma także inne reguly, mozemy teraz znowu odpauzowac, tym razem przejsc kawalek bez straty zycia i jako regule ustawic 'equal to last value', czyli zostana tylko te wartosci które nie zmienily się od ostatniego razu. Jeśli u kogoś lista adresow nadal jest bardzo duza, można poeksperymentowac, np. zaczac gre od nowa (nie wylaczajac ram filter) i ustawic regule 'greater than last value', czyli wartosci większe od ostatniego razu (po restarcie znowu mamy komplet zyc). U mnie na dotychczasowym etapie pozostalo 5 adresów:
Jak widac adres 0x0032 idealnie pasuje jako ten przechowujacy zycia. Najpierw mielismy ich 02, stracilismy jedno, ustawilismy regule na 'mniejsze od', zostalo 01, stracilismy jedno, zostalo 00, potem zmienilismy regule na 'takie samo jak ostatnio', nadal 00. Pozostale wartosci mimo, ze spelniaja nasze reguly do liczby zyc nijak nie pasuja.
Teraz mozemy znowu odpalic hex editor i przejsc do znalezionego adresu. Klikamy na wartosci PPM, wybieramy z menu Freeze/Unfreeze Address, a potem Freeze. Co się stanie można się domyslic, wartosc w ramie zostanie zamrozona, czyli jeśli wszystko poszlo dobrze nie bedziemy tracic zyc. Powodzenia w przechodzeniu Contry z niesmiertelnoscia:).
Niedlugo o tym, jak zapisac nasze zmiany w pliku z romem. Jak cos niejasne, to pytac.