Powiększ

CRACK PL, czyli zostań crackerem! Cz. 3

Odcinek 3 – Tniemy intro.

Pora by odsłonić kolejny element układanki, na którą składa się własnoręczne crackowanie. Pragnę zapoznać Was z zagadnieniem ‚crackowania’ tzw. gotowych programów do rozpowszechniania (np. już wstępnie ‚obrobionych’ przez crackerów, lub po prostu wersji dystrybucyjnych firm software’owych).

Jako, że najlepiej uczyć się na przykładach – tak przynajmniej się mi wydaje 🙂 Pociągnijcie sobie proszę, grę GHOST’N GOBLINS.zip aby za jej pomocą przećwiczyć wstępnie odcinanie intra i dorabianie nieśmiertelności. Trainer do niej napiszemy już w kolejnym odcinku tj. 4.

Część 1 – Odpakowujemy grę.

Uruchom emulator VICE z podpiętym Action Replay’em, w trybie TRUE DRIVE EMULATION dla stacji dysków. Załaduj do pamięci grę Ghost’n Goblins np. klawiszem F5, i uruchom poprzez F3. Na ekranie zobaczysz migające znaki ASCII w górnej połówce ekranu (naoczny dowód działania packera). Po chwili uruchomi się crackerska notka (stare dobre text-writery), w której to wyczytacie kto wprowadził ten program na scenę. Po chwili też uruchomi się sama gra…

Zagalopowałem się teraz, sorry! Oczywiście gra się nie uruchomi – bo ma skopany depacker, gryzie się on z softem modułu Action Replay w pamięci komody. My jednak skwitujemy to uśmiechem i wdusimy RESET (dla przypomnienia ALT + R) i ponownie załadujemy gierkę do pamięci.

Zrobiliśmy to celowo, aby rozpoznać teren przed naszymi zmaganiami. Przecież podobnie jak przy szukaniu nieśmiertelności, musimy zapoznać się z kolejnymi fazami działania programu. Wyłuskajmy najpierw dane o jego położeniu w pamięci:

Początek $0801
Koniec w $B751

Po komendzie list (wpisujemy LIST i naciskamy ENTER) ujrzymy, pierwsze (dość proste) zabezpieczenie przed crackowaniem w postaci zagmatwanego argumentu komendy SYS (483.284856^2)*sin(13)/asc(„/”) nie będziemy się tu biedzić i wyliczać tego cuda – poszperamy w pamięci klawiszem F2. W czasie listowania począwszy od adresu $0801 szukajmy ciągu zer $00, a zanim normalnego kodu.

Znajdziemy go szybko pod adresem $082c – po przeanalizowaniu, trafimy na prostego relokatora pamięci:

LDY #$00
LDA $0848,y
STA $03FF,y
DEY

…który przepisuje właściwy relokator (ten od adresu $0848) w obszar pamięci ekranu Commodore 64 (od $0400-$07f8) i uruchamia go JMP $0400. Pora na odbezpieczenie tego drugiego relokatora autostartu. Zrobimy to modyfikując instrukcje JSR $A659 na CLI i RTS.

Powiększ . $0882 20 59 A6 JSR $A659
na
.$0882 58 CLI
.$0883 60 RTS

…co da nam zatrzymanie programu. Teraz mała dygresja odnośnie wyłączania autostartu. Przed wyłączeniem musimy ustawić KONIECZNIE komórkę $01 (odpowiedzialną za konfigurację pamięci) na $37 – aktywny KERNAL i interpreter Basic’a, potem włączyć przerwania CLI i dać RTS. Jeżeli relokator nie robi tego sam, musimy go tak zmodyfikować by to zrobił.

Pełen sukces, wywaliło grę do Basic’a – z wcześniejszej analizy kodu reklokatora wyczytaliśmy nowy adres końca i początku programu w pamięci (można to odczytać analizując zawartość komórek $2E i $2F oraz $AE i $AF – obejrzyj uważnie obrazek powyżej), i jest on ustawiony na $B6C9. Zapobiegawczo zgrajmy teraz ten obszar pamięci na dysk:

.S”GHOST – DANE”, 8 , 0801 , B6C9

Część 2 – Odcinamy notkę.

Wejdźmy ponownie do monitora (F2) i pooglądajmy pamięć komendą I*0800. Ujrzymy xyvkę osoby która sklepała te ‚interko’ i poprawny dalszy ciąg kodu od adresu $0820. Wydedukujemy z niego iż notka jest odpalana spod $C000. Wstawmy zatem jeszcze raz RTS w adres $08B1 i uruchomimy przez SYS 2080.

Analizując komórki $2E-$2F dostaniemy koniec gry w pamięci – początek oczywiście w $2B-$2C. Nagrajmy tak odszukaną grę na dysk:

.S”GHOST’N GOBLINS OK.”, 8 , 0801 , B201

Mamy więc obecnie postać wyjściową gry, do dalszych eksperymentów naukowych – zrobimy teraz w niej nieśmiertelność wg schematu z drugiego odcinka kursu. Nim jednak zaczniemy szukać ‚istoty bitu’ wspomnę, że podobny schemat postępowania obowiązuje prawie do każdej gry i programu posiadającego intro. Czasami przyjdzie nam zdepakować grę ręcznie kilka razy zanim dobierzemy się do oryginału – potrzeba nam tylko anielskiej cierpliwości i dużo wolnego czasu…

Część 3 – Nieśmiertelność w GHOST’N GOBLINS.

Powiększ Dla ułatwienia wspomogę Was teraz pełną wersją (już wyrypaną) GHOST’N GOBLINS OK.zip (zassijcie ją jeżeli macie problemy z własnoręcznym wycięciem). Po chwili relaksu, czyli obowiązkowym zagraniu – zauważymy że przydałoby się zablokować licznik czasu i ilość żyć. By tego dokonać posłużymy się już wypróbowanymi metodami…

Policzmy, ile mamy żyć? Na ekranie są cztery, plus to którym gramy – czyli w sumie mamy pięć. Aby się upewnić straćmy jedno, tak zgadza się! Załadujemy więc program ponownie…


PowiększPoszukajmy zatem rozkazu LDA #$05, po wgraniu gry do pamięci – ale przed jej uruchomieniem. Monitor odnalazł 10 prawdopodobnych adresów z taką ilością żyć. Sprawdźmy co one kryją… Tak, pierwszy odnaleziony jest tym właściwym. O czym przekonamy się zmniejszając np. do 3 i odpalając grę.

Czas na zablokowanie tego licznika! Jak pamiętacie, wystarczy zazwyczaj odszukać DEC $359A. Poszukiwania były nad wyraz owocne, w pamięci jest tylko jeden taki DEC pod adresem $0A6E. Teraz by uczynić naszego rycerza nieśmiertelnym, wystarczy aby zamienić go na LDA $359A (o kodzie $AD).

Kolejnym poszukiwanym cheatem był czas. Podczas straty życia, jego licznik jest zerowany – pierwszy punkt zaczepienia. Drugą znaną metodą jest poszukiwanie SBC #$01. Zatrzymajmy się jeszcze na moment przy pierwszej. Na pierwszy rzut oka jest najłatwiejsza do naszych potrzeb – niestety nieraz ilość adresów do przeanalizowania, sięga kilkudziesięciu. Więc jeżeli zawiedzie poszukiwanie SBC to ta metoda jest wówczas najkorzystniejsza. Opiera się ona na mozolnym śledzeniu wszystkich odwołań (podprogramów) występujących po naszym DEC. Bo któryś z nich skrywa nasz licznik czasu. To już pozostawiam Wam. Poszukiwany SBC #$01 kryje się pod adresem $1060. Zablokowanie go polega na zmianie wartości argumentu z $01 na $00 – co jest dziecinnie łatwe.

Dodaj komentarz

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