Powiększ

CRACK PL, czyli zostań crackerem! Cz. 4

Odcinek 4 – Nasz pierwszy trainer.

Aby móc napisać trainer do jakiejś gry, musimy posiadać (poza stosowną wiedzą) jeszcze zestaw adresów z danej gry do poprawki. Sama zaś budowa kodu trainera jest prosta jak budowa cepa – tzn. trudniejsza niż się z pozoru wydaje.

Na początek, o czym bardzo wielu zapomina! Musimy wygospodarować kilkaset wolnych bajtów na kod trainera. Istnieje wiele metod umieszczania tego wielce pomocnego programiku:

1. Przed grą (potem grę relokujemy)
2. Za kodem gry (często problematyczne)
3. W samej grze – bardzo trudne, ale możliwe!

Za pierwszym razem proponuje metodę numer 1, co pozwoli mi pokazać jak możemy sobie zrelokować grę i podawać adresy względne tzw. offsety w kodzie trainera.

Część 1 – Piszemy trainer.

PowiększZastanówmy się przez chwilę, co chcielibyśmy umieścić w treści naszego trainera, po jego uruchomieniu – na ekranie? Wielu zapewne swoją xyvkę do tego tytuł gry (z dodatkami np. +2H – co oznacza 2 trainery i HighScore saver) i zestaw kilku pytań odnośnie naniesienia poprawek do gry, które uczynią ją łatwiejszą.

Jako, że żyjemy już w XXI wieku, nie będziemy wyważać otwartych drzwi. Do celów edukacyjnych zaprezentuje Wam, nie za duży ale funkcjonalny trainer mojego autorstwa. Zassijcie Trainer.zip i uruchomcie TurboAsembler.

 

Powiększ

Trainer jest już leciwy, lecz nic nie stracił ze swej funkcjonalności. Teraz musicie nanieść w nim konieczne poprawki tzn. swoją xyvkę, nazwę gry itp. Oraz adresy odpowiedzialne w grze za nieśmiertelność. Przyjrzyjcie się obrazkowi poniżej.

Wprowadziliśmy oba wyszukane i zmodyfikowane bajty odpowiedzialne za ilość żyć i czasu oraz JMP-a do samej gry.

 


Teraz garść wyjaśnień co Powiększby rozwiać niejasności. Po wprowadzeniu poprawek do treści trainer a, zauważyliście zapewne iż jest adresowany pod $0A00 – to było konieczne do samej kompilacji i testów. Na nasz użytek musimy zmienić adres kompilacji  na np. wolny obszar ekranu lub ram powyżej interpretera Basic’a $c000-$d000. Ponownie staniemy przed wyborem miejsca dolinkowania kodu trainera. Ze względu na długość gotowego cracka, preferuje się upychać trainer przed grą. Czyli mamy powiedzmy od $0801-$0A00 trainera, $0A00-$B400 grę i teraz zaczynają się schody.

 

1. Jako pierwszy uruchamia się trainer i przepisuje się w obszar ekranu i/lub stosu.
2. Następnie można od razu relokować grę we właściwe miejsce lub wstawić do trainera adresy jako offset (tzn. np. jeżeli oryginalnie mamy $1000 a gra leży teraz w pamięci od $0A00 to nasz adres to $1000+($0A00-$0801) da $11FF – zrozumiałe?).
3. Trainer modyfikuje treść gry i ją uruchamia.

W praktyce (na potrzeby tego kursu i gry Ghost’n Goblins) zrobimy to tak:

– skompilujemy kod trainera na $0810 (ze względu na jego długość) zajmie nam miejsce do $0B00
– grę wladujemy za trainerem od $0B01, zajmie nam do $B501
– offset dla adresów wynosi teraz $0300

Przed uruchomieniem gry skopiujemy nasz relokator gry na stos i tam go uruchomimy – przepisze on kod gry na właściwe miejsce, zainicjuje wektory dla Basic’a, VIC-a i Kernala po czym uruchomi samą grę. Uff… ale namotałem 🙂

Część 2 – Piszemy relokator.

W porównaniu z trainerem, będzie to bułka z masłem. Kompilując trainera robiliśmy to od adresu $0810 (2064 dziesiętnie), już śpieszę z wyjaśnieniem. W wolne miejsce od $0801-$0810 wstawimy jedyna linię w Basic’u: 10 SYS2064 w postaci szesnastkowej (tak najłatwiej – zobaczcie sami), aby interpreter odpalił nam cracka po RUN. Jeżeli będziemy chcieli od razu spakować cracka, wówczas ta linia jest zbędna.

Przestudiujcie jeszcze raz poprzedni odcinek (3) kursu i zobaczcie jak pisze się relokatory. Poniżej przedstawię prosty przykład aby zobrazować inicjowanie Basic’a i jego zmiennych.

SEI
LDA #$34 ;włącz tylko pamięć ram
STA $01

LDX #$10 ;ilość bloków do przepisania (1 blok = 256 bajtów)
LDA #$01 ;początek $0801
STA $FB
LDA #$08
STA $FC
LDA #$01 ;dane od $0C01
STA $FD
LDA #$0C
STA $FE

LDY #$00 ;przepisz blok
LDA ($FD),Y ;tu wracają BNE (-5 i -12)
STA ($FB),Y
INY
BNE *-5
INC $FC ;czy wszystkie dane
INC $FE
DEX
BNE *-12

LDA #$37 ;włącz ROM (Basic itd.)
STA $01
JSR $E518 ;pełen init Basic'a
JSR $FDA3
JSR $FD15
JSR $E3BF
CLI
JMP $0810 ;do gry

To jest prosty relokator – zbudowany jako relokowalny, tzn. nie występuje w nim żadna instrukcja odwołująca się do konkretnej lokalizacji w pamięci. Dzięki czemu można go umieścić w dowolnym miejscu i zawsze będzie działał poprawnie. Aby zakończyć już ten temat, przypomnę tylko, że należy umieścić taki relokator w miejscu gdzie będzie „bezpieczny”, tzn. nie zostanie zamazany przez przepisywany przez siebie program.

Powyższy relokator przepisuje dane w DÓŁ, czyli dokładnie tak jak obecnie potrzebujemy je przenieść. Zaproponowany w nim INIT jest, a raczej powinien być stosowany tylko wówczas gdy odpalona gra nie działa poprawnie. Gdyż prawie żadne programy w asemblerze nie wymagają do szczęścia poprawnie skonfigurowanej pamięci i zmiennych – gdyż robią to samodzielnie.

Podsumowując moje wywody, otrzymamy naszego pierwszego prawdziwego cracka z trainerem. Żeby jednak nie było Wam za słodko, nie opublikuje gotowego rozwiązania. Po przebrnięciu przez wszystkie odcinki kursu, dokonacie tego sami.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *