Przejdź do zawartości

CrackMe

Z Wikipedii, wolnej encyklopedii
To jest stara wersja tej strony, edytowana przez PHmasterhero (dyskusja | edycje) o 01:29, 24 lut 2008. Może się ona znacząco różnić od aktualnej wersji.

CrackMe (dosłownie "złam mnie") to mały program stworzony tylko i wyłączne w celu złamania jego zabezpieczenia (lub zabezpieczeń), czy odgadnięcie klucza, odpowiednie spreparowanie kodu wykonywalnego, itp. Zazwyczaj używany jest do testowania umiejętności reverse engineering programisty.

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 oczywiście należy do crackera. To, jakie jest rozwiązanie, zależy od natury samego crackme, jednak da się wydzielić kilka głównych typów rozwiązań, które polegają na:

  • odnalezieniu numeru seryjnego - co jest demonstracją zabezpieczenia "serial fishing",
  • napisaniu keygena do crackme - ten typ nazywany jest określeniem "Keygenme",
  • stworzeniu cracka - czyli patch zmieniający kod binarny crackme,
  • dopisaniu nowej funkcjonalności programu - typ nazywany jest mianem "Reverseme",
  • etc.

Część programów crackme zawiera też kod wykrywający różne narzędzia, którymi często posługują się crackerzy (np. OllyDbg, SoftICE). Kod ten jest stosowany aby utrudnić analizę kodu crackme, czasami też należy zneutralizować taki kod, aby poprawnie rozwiązać dane crackme.

Przykładowy prosty CrackMe napisany z myślą o systemie Linux:

#include <iostream>
#include <stdlib.h>

using namespace std;

int main()
{

  int serial=123;
  int liczba;
  int i;

  cout <<"Podaj serial" << endl;
  for ( int i = 0; i < 32; i++)
  {
    cin >> liczba;

    if (liczba==serial)
    {
      cout << "Dobry numer." << endl;
      cout << " " << endl;
      cout << "Koniec programu" << endl;
      return 0;
    }
    else
    {
      cout <<"Zły numer" << endl;
    }
  }
}


Po skompilowaniu i zanalizowaniu programu narzędziem IDA Pro 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 orginalnym (w tym wypadku 123) ponieważ nieskrakowany program skacze do funkcji wyświetlającej komunikat o dobrym numerze seryjnym, jeżeli wpisany numer jest identyczny z tym zapisanym w programie, skrakowany działa odwrotnie. Załączam plik wygenerowany programem IDA pro, ten plik pokazuje różnicę między wersją z zabezpieczeniem i zmodyfikowaną wersją bez zabezpieczeń. Dzięki niemu wiadomo, że jeżeli chcemy zrobić tzw. cracka, czyli orginalną wersję programu ze zdjętym zabezpieczeniem wystarczy w skompilowanym pliku dowolnym hexedytorem znaleźć adres 00000797 i zmienić wartość z 75 na 74.

This difference file is created by The Interactive Disassembler
crackme
00000797: 75 74

Oczywiście to najprostsze możliwe zabezpieczenie, w wypadku tego programu można po prostu odczytać poprawny numer seryjny, bardziej zaawansowane crackme generują fałszywe seriale, są skompresowane i zaszyfrowane i wymagają dużo więcej pracy. Szablon:Oprogramowanie stub

Linki zewnętrzne