Kwietnia 19, 2024, 16:31:44 *
Witamy, Gość. Zaloguj się lub zarejestruj.

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Aktualności:
Nowa strona główna  : http://www.emunes.pl
Zapraszamy do testowania !

Chat: http://chat.emunes.pl
Galeria cartów: http://carts.emunes.pl
 
   Strona główna   Pomoc Zaloguj się Rejestracja  

Reklama
Strony: [1]
  Drukuj  
Autor Wątek: Romhacking - tutorial  (Przeczytany 2023 razy)
0 użytkowników i 1 Gość przegląda ten wątek.
grimm
Missing Bytes
Szeregowy
*
Offline Offline

Wiadomości: 22


« : Stycznia 12, 2009, 22:50:50 »

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.
Zapisane
Berion
Major
*****
Offline Offline

Wiadomości: 625



WWW
« Odpowiedz #1 : Marca 07, 2009, 21:33:14 »

Nie zdawałem sobie sprawy jakie to proste huh.

To teraz pytanie moje: jak adres do RAM przełożyć na adres w pliku?
Zapisane

FAQi:
| PSX | PS2 | PS3 | Xbox |
kyuSea
Szeregowy
*
Offline Offline

Wiadomości: 26


WWW
« Odpowiedz #2 : Marca 12, 2009, 00:03:07 »

Tia, FCEU, to calkiem wystarczajace narzedzie do romhacking'u.
Ja tam nie uzywalem ram filtera, ciekawiej jest sobie nawet utrudnic i niczym poszukiwacz skarbu, poprostu spojrzec na strone zerowa ($0000-$00FF tylko 256 wartosci) w ram edytorze, warto tez je freezowac i przygladac sie jaki to ma skutek. To obszar zmiennych, które najczesciej sie zmieniaja z racji szybszego do nich dostepu, wiec sa tez i najistotniejsze. (ilosc zyc, poziom, wspolrzedne sprite'ow, itd.)

Mozna latwo dotrzec z ram-edytora do miejsca w pliku, (prawy klawisz -> go in rom). Ale wiadomo że to działa tylko w obszarze dla wykonywania kodu ($8000-$FFFF), w przypadku $0000 - $7FFF sie nie da, poniewaz sa to rejestry dla zmiennych i ulegaja zmianom tylko w czasie wykonywania programu. Zeby znalesc jakie instrukcje w kodzie odpowiadaja za zmiane danego rejestru w obszarze zmiennych mozna jedynie posluzyc sie debuggerem. W tym celu ustawia sie breakpointy odczytu albo zapisu, w zaleznosci co nas interesuje. (Prawy klawisz add breakpoint read/write) Po takim ustawieniu, program powinien zatrzymac sie w czasie okreslonej operacji na tym rejestrze. Np. jesli bedzie to breakpoint read $0088 to zatrzyma sie debuuger na LDA/LDX/LDY $0088, a jesli write to np. STA $0088. Dajmy na to ze debugger odnalazl rozkaz w miejscu $BB00, wtedy to szukamy kodu w ram edytorze i przechodzimy do odpowiednika w romie(prawy ->go in rom).

I dalej zaczynaja sie schody. Bo niby mamy piekny debugger, to jednak nie ma mozliwosci edycji, i przydaje sie niestety znajomosc "jeszcze nizszego poziomu" niz assembler, czyli kodu maszynowego. Chodzi o to, ze jedna instrukcja w asmie, moze miec kilka nazw w kodzie maszynowym, ze wzgledu na wiele roznych trybow adresowania (np. rozkaz LDA ma ich 8 i jest opisany w maszynowym jako $A9 - bezposrednie, $A5- bzpsr. na stronie zerowej, itd., wiec potrzebna jest gdzies na boku lista rozkazów 6502 z kodami maszynowymi, (ja dopomagam "C64-Bohdan Frelek", ale byc moze znajdzie sie cos podobnego na necie.) ). Po co nam to, a po to ze mozemy sobie swobodnie kodowac na zywo bezposrednio w rom-edytorze zmieniajac w nim wartosci oraz zeby latwo zlokalizowac dana instrukcje z debuggera w romie, takze na taki wredny debugger tez sposob jest. Na poczatku moze sie to wydawac zawile ale potem wystarczy spojrzec na sam hexedytor zeby zauwazyc ze same szenstastkowe wartosci tez maja sens Wink. W ten sposob latwo zmienic wszystkie rzeczy w romie na stale. Np. ostatnio zrobilem hacka w Milk&Nuts, ze gram od ostatniej planszy w dol, trzeba bylo zastapic kilka instrukcji, argumentow i hula, polecam jako cwiczenie.
« Ostatnia zmiana: Marca 12, 2009, 00:14:50 wysłane przez kyuSea » Zapisane
Berion
Major
*****
Offline Offline

Wiadomości: 625



WWW
« Odpowiedz #3 : Marca 14, 2009, 23:21:07 »

THX za odpowiedź. Czyli ja odpadam z miejsca. ASM wanted :/
Zapisane

FAQi:
| PSX | PS2 | PS3 | Xbox |
kyuSea
Szeregowy
*
Offline Offline

Wiadomości: 26


WWW
« Odpowiedz #4 : Marca 15, 2009, 00:25:36 »

Bez przesady, tzn zalezy co sie chce zhackowac ale robienie np. takich hacków jak niesmiertelnosc, nie wymaga super wiedzy o asmie, tylko znalezienia pojedynczych instrukcji w okolicach breakpoint'a. Dajmy na to ilosc zyc zostala pomniejszona, wiec rozkazy pomniejszajace takie jak DEC/DEX i ich argumenty mozna zastapic NOP(no operation).
« Ostatnia zmiana: Marca 15, 2009, 00:28:36 wysłane przez kyuSea » Zapisane
Strony: [1]
  Drukuj  
 
Skocz do:  

Działa na MySQL Działa na PHP Powered by SMF 1.1.11 | SMF © 2006-2008, Simple Machines LLC Prawidłowy XHTML 1.0! Prawidłowy CSS!
Strona wygenerowana w 0.036 sekund z 18 zapytaniami.