Wybierz stronę z tutorialem:
- Podstawy — Informacje o języku C
- Narzędzia
- Rejestry
- Proste instrukcje
- Przykład 1 — SC CDKey Initial Verification
- Przykład 2 -.- SC CDKey Shuffle
- Przykład 2b — SC CDKey Final Decode
- The Stack
- Przykład stosu
- Funkcje
- Przykład 3 — Storm.dll SStrChr
- Podsumowanie zespołu
- Kod maszynowy
- Przykład 4 — Rozbijanie stosu
- Cracking a Game
- Przykład 5 — Cracking a game
- Przykład 6 — Pisanie keygena
- .dll Injection and Patching
- Przeszukiwanie pamięci
- Przykład 7 — Napisanie cheata do Starcrafta (1.05)
- Przykład 7 Krok 1 — Wyświetlanie komunikatów
- Przykład 7 Krok 1b — Powyżej, w/ func ptrs
- Przykład 7 Końcowy
- Przykład 8 — Zdobycie IX86.dll
- 16-bit Assembly
- Przykład 9 — Keygen dla 16-bitowej gry
- Przykład 10 — Pisanie loadera
W tym rozdziale omówię kilka technik używanych przez crackerów do rejestracji gier/oprogramowania. Nie wspominam o cd-crackach, ponieważ nie wiem jak je zrobić; wspominam raczej o atakach, które są generalnie oparte na kluczu lub kodzie rejestracyjnym.
Common Protections
Najczęstszą ochroną, i tą omawianą tutaj, jest gdy program wymaga klucza rejestracyjnego do odblokowania. Zazwyczaj, the klucz opierać się albo na losowy rejestracja kod zapewniać the program, lub opierać się the użytkownik imię użytkownika ty wprowadzać.
Wymienię tutaj kilka definicji. Zauważ, że te definicje są moje, i niekoniecznie będą odpowiadać definicjom używanym przez innych. Są one po prostu po to, aby ułatwić zrozumienie tej i następnych sekcji:
- Kod rejestracyjny jest kodem generowanym przez program, z którego pochodzi klucz rejestracyjny lub jest sprawdzany względem niego.
- Nazwa użytkownika rejestracji lub po prostu nazwa użytkownika jest nazwą użytkownika, którą wprowadza użytkownik. Klucz rejestracyjny jest oparty na tej nazwie użytkownika.
- Klucz rejestracyjny jest kluczem używanym do odblokowania programu. Może on być oparty na kodzie rejestracyjnym, na nazwie użytkownika lub na niczym innym.
Finding the Spot
Pierwszy przykład dotyczy algorytmu weryfikacji CDKey Starcrafta, ale ja podałem algorytm. Starcraft’s jest najprostszym rodzajem weryfikacji, klucz weryfikuje się bez nazwy użytkownika lub kodu. Pytanie brzmi, jak znaleźć algorytm?
Niefortunna odpowiedź brzmi, że jest on różny i generalnie nie jest łatwy.
Pierwszym krokiem jest oczywiście dezasemblacja programu. Po tym, jako cracker, musisz spróbować znaleźć słaby punkt w programie. Oto kilka technik:
- Poszukaj tekstu z prośbą o klucz
- Poszukaj kodu rejestracyjnego w pamięci i dowiedz się, gdzie jest on dostępny
- Wprowadź kod, niech się nie powiedzie, a następnie poszukaj w pamięci tego nieudanego kodu
- Poszukaj wszystkiego, co jest unikalne w rejestracji (kolory, tekst, okna dialogowe, itp.).
- Poszukaj klucza rejestru, który przechowuje klucz
- Poszukaj pliku, który przechowuje informacje o rejestracji
- Poszukaj komunikatu o błędzie, gdy podany jest zły klucz
Ostatnia technika jest najbardziej użyteczna, jaką znalazłem. Jednakże, wypróbowanie ich wszystkich i spróbowanie czegokolwiek innego, co wydaje się pasować do gry, działa najlepiej. W przykładzie w następnej sekcji, odkryłem, że szukanie tekstu informującego użytkownika, że oprogramowanie jest niezarejestrowane działało dobrze dla gry, jak zobaczysz później. Być może zrobię drugi przykład, w którym będę szukał pliku przechowującego klucz i gdzie został on utworzony.
Aby znaleźć weryfikator CDKey Starcrafta, zacząłem od ruchu sieciowego, od funkcji Winsock (send() i recv()). Stamtąd cofnąłem się, aby znaleźć gdzie wysyłany jest pakiet, który weryfikuje klucz Starcrafta z Battle.netem. To było dużo pracy, ale w tym czasie uczyłem się o aktywności sieciowej Starcrafta, więc był to głównie efekt uboczny tego, co już robiłem. Jeśli będę kontynuował pisanie tych poradników, może w końcu dojdę do takich szczegółów, ale na razie nie mam takich planów.
Cracking the Game
Po znalezieniu odpowiedniego miejsca, złamanie gry jest często bardzo proste. Zazwyczaj program będzie miał następujący kod:
if(keyIsValid) unlock() else displayError()
Złożenie dla tego będzie wyglądało tak:
85 xx test keyIsValid, keyIsValid74 06 jz errore8 xx xx xx xx call unlockeb 06 jmp done error:e8 xx xx xx xx call displayError done:
Jak omówiono w sekcji o kodzie maszynowym, bajty po lewej stronie mogą być bajtami kodu maszynowego (zrobiłem je szybko z arkusza referencyjnego, więc mogą lub nie mogą być dokładnie poprawne. Ten program może być zmodyfikowany przez zmianę kilku bajtów, które mogą zmusić kod do skakania zawsze lub nigdy.
Aby zmusić kod do skakania (co w tym przypadku sprawi, że klucz będzie zawsze ważny), jz jest zastąpione jmp (przez zmianę 74 na eb):
85 xx test keyIsValid, keyIsValideb 06 jmp errore8 xx xx xx xx call unlockeb 06 jmp done error:e8 xx xx xx xx call displayError done:
Aby uniemożliwić kodowi skakanie (co w tym przypadku sprawi, że klucz będzie zawsze ważny), jz jest zastąpione parą instrukcji nop:
85 xx test keyIsValid, keyIsValid90 nop90 nope8 xx xx xx xx call unlockeb 06 jmp done error:e8 xx xx xx xx call displayError done:
Zrób odpowiednią zmianę, uruchom grę i wpisz dowolny kod. Powinien pojawić się oczekiwany rezultat!
Następny przykład pokaże to na rzeczywistej grze (na grze, której nazwy tu nie podam, z oczywistych powodów).
Pisanie Keygena
Nawet lepszym rozwiązaniem niż złamanie gry jest napisanie dla niej keygena. Użytkownik wpisuje swoją nazwę użytkownika lub kod rejestracyjny, a keygen wypisuje prawidłowy klucz.
Generalnie, to wymaga, że algorytm jest w pełni reverse engineeringu i zrozumieć. Następnie tworzona jest jego kopia w C (lub innym języku), która daje takie same rezultaty. Zauważ, że pierwsze trzy przykłady w tym tutorialu właśnie to robią: zamieniają kod asemblera z powrotem w C. Więc każdy, kto je wykonał, powinien być w dobrej pozycji do napisania keygena, co nastąpi w późniejszym tutorialu.
Pytania
Możesz edytować ten dział i umieszczać w nim pytania, postaram się na nie odpowiedzieć. Ale być może będziesz musiał się ze mną skontaktować, aby dać mi znać, że pytanie istnieje.