[PORADNIK] Kurs Romhackingu - NES by grimm

Awatar użytkownika
ikskoks
Nadzieja polskiego romhackingu
Posty: 797
Rejestracja: 19 wrz 2011, o 11:10
Grupa: LocMakers
Kontakt:

[PORADNIK] Kurs Romhackingu - NES by grimm

Postautor: ikskoks » 11 sty 2013, o 21:06

Kurs Romhackingu - NES

Autor: grimm
Korekta: bemberg

Narzędzie:
- Fceu XD 1.07 SD

Bardzo mało artykułów na temat romhackingu jest napisanych w naszym rodowitym języku, a ze to temat dość ciekawy i interesuje się nim sporo osób, postanowiłem przygotować mały tutorial.

Do dłubania w romach bardzo dobrze nadaje sie emulator Fceuxd (wersja SP 1.07 której używam do ściągnięcia tu: LINK). Zawiera wszystkie potrzebne narzędzia: podgląd pamięci, debugger i wiele innych:). Przyjrzyjmy się im. Odpalcie w Fceu jakąkolwiek grę i w zakładce 'tools' (tam znajdują się wszystkie „hakerskie” narzędzia) wybierzcie Hex editor. To co widzimy to pamięć nesa. Dla osób które wcześniej nie miały do czynienia z hexami:
- kolumna po lewej to adres,
- najszersza po środku to wartości,
- po prawej te same wartości jako znaki ASCII (przydaje się do wyszukiwania tekstów). Wszystkie liczby zapisane w systemie szesnastkowym, do konwersji z dziesiętnego na szesnastkowy i odwrotnie polecam windowsowy kalkulator z widokiem rozszerzonym;p.

Teraz z których fragmentów pamięci nes korzysta w jakim celu: od adresu 0x0000 do 0x07FF jest RAM, czyli pamięć zarówno do odczytu jak i zapisu. Kończy się w tym miejscu, jeśli ktoś się nie może połapać w adresach:
1.JPG
Pośród tych cyferek zapisane są wszystkie rzeczy, które ulegają modyfikacji w grze: liczba żyć, numer planszy, wybrana bron, itd. Jak te wartości szybko wynajdywać w tym bajzlu, o tym później. Od adresu 0x0800 mamy pamięć ram powtórzona kilka razy (czyli to samo tylko pod innymi adresami, to tylko jako ciekawostka, nie będziemy z tego korzystać), potem parę innych rzeczy (dostęp do S-RAM, itd.), które też nas póki co nie interesują.
Następny ważny segment zaczyna się dopiero od 0x8000 i zajmuje miejsce do samego końca, czyli 0xFFFF (32 kilobajty), nes trzyma tam cały kod gry. 32 kilobajty to trochę mało jak na cały kod, są gry które zajmują nawet 1mb, jak nes ma je wtedy adresować? Do tego służą mappery, które pozwalają na podmianę pamięci (ten sam adres może wskazywać coś innego).
Grafikę nes przechowuje w zupełnie innym obszarze pamięci, możemy się tam dostać zmieniając w zakładce View podgląd pamięci na PPU Memory. Co się tam znajduje i jak działa, o tym innym razem.

Teorii na razie wystarczy, teraz możemy spróbować znaleźć w tym gąszczu cyfr jakaś konkretna wartość i ja zmienić. Jako przykład wybrałem Contre, poszukamy miejsca w ramie przechowującego liczbę żyć :).
Więc odpalcie grę, niech wczyta się plansza (gra musi sobie poustawiać wszystkie wartości) i zapauzujcie emulacje F2. Teraz czas na kolejne hakerskie narzedzie, Tools -> RAM Filter. Pozwala ono bardzo szybko wyszukiwać pożądane wartości. Działa w ten sposób, ze dostajemy przefiltrowane dane według podanych reguł (mniejsza od, większe od, równe, itd.). Najlepiej pokazać na przykładzie. Jako pierwsza regułę (1 rule) ustawiamy All (czyli wszystkie wartości) i dajemy Apply Rule. W okienku poniżej pokaże nam się lista wszystkich wartości w ramie (od 0x0000 do 0x07FF).
Teraz wracamy do gry (okna z Ram Filter nie zamykamy!). Odpauzujmy F2 i straćmy jedno życie :) (po straceniu trzeba poczekać aż odejmie nam ten niebieski medal u góry). Znowu pauza i wracamy do Ram Filter. Jako następna regule ustawiamy 'less than last value', co ze wszystkich wcześniejszych wartości z listy wybierze tylko te, które zmniejszyły swoja wartość (gdzieś wśród nich będzie liczba zyc :)).
Dajemy Apply Rule. Jak widać lista znacznie się zmniejszyła, ale nadal jest tego pełno ;p. Więc jeszcze raz: wracamy do gry, F2, tracimy życie, F2. Znowu ram filter, jako trzecia reguła znowu 'less than last value' i Apply. Tym razem na liście powinno zostać już bardzo mało danych, u mnie już widać który adres odpowiada za życia :). Ram Filter ma także inne reguły, możemy teraz znowu odpauzowac, tym razem przejść kawałek bez straty życia i jako regule ustawić 'equal to last value', czyli zostaną tylko te wartości które nie zmieniły się od ostatniego razu.
Jeśli u kogoś lista adresów nadal jest bardzo duża, można poeksperymentować, np. zacząć grę od nowa (nie wyłączając Ram Filter) i ostawić regule 'greater than last value', czyli wartości większe od ostatniego razu (po restarcie znowu mamy komplet żyć). U mnie na dotychczasowym etapie pozostało 5 adresów:
2.JPG
Jak widać adres 0x0032 idealnie pasuje jako ten przechowujący życia. Najpierw mielismy ich 02, straciliśmy jedno, ustawiliśmy regule na 'mniejsze od', zostało 01, straciliśmy jedno, zostało 00, potem zmieniliśmy regule na 'takie samo jak ostatnio', nadal 00. Pozostałe wartości mimo, ze spełniają nasze reguły do liczby żyć nijak nie pasują.
Teraz mozemy znowu odpalić hex editor i przejść do znalezionego adresu. Klikamy na wartości PPM, wybieramy z menu Freeze/Unfreeze Address, a potem Freeze. Co się stanie można się domyślić, wartość w ramie zostanie zamrożona, czyli jeśli wszystko poszło dobrze nie będziemy tracić żyć.

Powodzenia w przechodzeniu Contry z nieśmiertelnością:).
3.JPG
Niedługo o tym, jak zapisać nasze zmiany w pliku z romem. Jak coś niejasne, to pytać.

grimm
Kontakt: rxd555[at]gmail[kropka]com

Wróć do „Poradniki”



Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość