CrackMe
![Wikipedia:Weryfikowalność](http://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Question_book-4.svg/50px-Question_book-4.svg.png)
Część lub nawet wszystkie informacje w artykule mogą być nieprawdziwe. Jako pozbawione źródeł mogą zostać zakwestionowane i usunięte.
Sprawdź w źródłach: Encyklopedia PWN • Google Books • Google Scholar • Federacja Bibliotek Cyfrowych • BazHum • BazTech • RCIN • Internet Archive (texts / inlibrary)
Po wyeliminowaniu niedoskonałości należy usunąć szablon {{Dopracować}} z tego artykułu.
CrackMe – mały program stworzony wyłącznie w celu złamania jego zabezpieczenia (lub zabezpieczeń), czyli odgadnięcie klucza, odpowiednie spreparowanie kodu wykonywalnego itp. Pisany najczęściej przez jednego crackera dla innych crackerów w celu sprawdzenia umiejętności inżynierii odwrotnej.
Programy Crackme mają podobne zabezpieczenia do tych stosowanych w aplikacjach komercyjnych. Poprawne rozwiązanie danego crackme zwykle określa autor i dołącza tę informację w postaci pliku „readme” lub informacji w samym programie. Czasami pojawiają się zakazy co do używania konkretnego narzędzia, jednak respektowanie tych zasad zależy od crackera. Typ rozwiązania uzależniony jest od natury samego crackme przy czym można dokonać następującego podziału programów crackme ze względu na cel jaki postawił autor:
- odnalezienie numeru seryjnego – co jest demonstracją zabezpieczenia „serial fishing”,
- napisanie keygena do crackme – ten typ crackme nazywany jest również mianem „KeygenMe”,
- stworzeniu cracka – czyli patcha zmieniający kod binarny crackme,
- dopisaniu nowej funkcjonalności programu – typ nazywany jest także mianem „ReverseMe”,
Część programów crackme zawiera kod wykrywający różne narzędzia, którymi często posługują się crackerzy (np. OllyDbg, SoftICE). Kod ten stosowany jest aby utrudnić analizę kodu crackme. Czasami należy zneutralizować taki kod, aby poprawnie rozwiązać dane crackme.
Przykładowo prosty program CrackMe może wyglądać następująco:
#include <iostream> using namespace std; int main() { int serial = 123; int liczba; cout << "Podaj serial:" << endl; while(true) { cin >> liczba; if (liczba == serial) { cout << "Gratuluję, podany numer jest prawidłowy!" << endl; cout << "Koniec programu." << endl; return 0; } else { cout << "Numer nieprawidłowy." << endl; } } }
Po skompilowaniu i przeanalizowaniu programu np. narzędziem IDA widać, że aby obejść zabezpieczenie wystarczy zmienić instrukcję jnz (skocz jeżeli nie zero) na jz (skocz jeżeli zero) i program zaakceptuje każdy numer seryjny poza oryginalnym (w tym wypadku 123). Nieskrakowany program skacze do funkcji wyświetlającej komunikat o dobrym numerze seryjnym, jeżeli wpisany numer jest identyczny z tym zapisanym w programie, natomiast program skrakowany w podany sposób działa odwrotnie.
Plik wygenerowany programem IDA Pro pokazujący różnicę między wersją z zabezpieczeniem i zmodyfikowaną wersją bez zabezpieczeń może wyglądać w tym przypadku następująco:
This difference file is created by The Interactive Disassembler crackme 00000797: 75 74
Dzięki temu wiadomo, że aby złamać to crackme, wystarczy w skompilowanym pliku przejść pod adres 797h i zmienić wartość bajtu z 75h na 74h.
To przykładowe crackme przedstawia najprostsze możliwe zabezpieczenie. W przypadku tego programu można również w prosty sposób odczytać poprawny numer seryjny. Bardziej zaawansowane crackme generują fałszywe seriale, są skompresowane, zaszyfrowane lub wykorzystują skomplikowane algorytmy sprawdzające poprawność podanych danych, w związku z czym rozwiązanie ich wymaga dużo większego nakładu pracy.