CrackMe

aus HaBo WiKi, der freien Wissensdatenbank von http://www.hackerboard.de
Wechseln zu: Navigation, Suche

CrackMes (engl. etwa knack mich!) sind Programme, bei denen bestimmte Funktionen besonders geschützt sind, zum Beispiel durch Passwortabfragen oder Ähnliches. Die Aufgabe ist es, an diese geschützten und/oder versteckten Funktionen zu kommen. Es gibt mehrere Vorgehensweisen und der Autor des jeweiligen CrackMes entscheidet in der Regel, welche davon erlaubt sind.

Aufbau

Ein CrackMe besteht für gewöhnlich aus einem Hauptprogramm, welches sich dem Benutzer beim Starten präsentiert und einigen versteckten Funktionen, welche erst bei der Eingabe des richtigen Schlüssels freigeschaltet werden: z. B. durch ein Passwort, eine Zahlenfolge, richtige Prüfsumme oder eine Datei mit einem bestimmtem Inhalt. Dabei kann ein CrackMe eine grafische Oberfläche (GUI) haben oder ein konsolenbasiertes (CUI) Programm sein. Welche versteckten Funktionen eingebaut werden, bleibt der Fantasie des Autors überlassen. Genauso verhält es sich mit der benutzen Programmiersprache — häufig werden CrackMes in Assemblersprache, C, C++, ObjectPascal, Delphi oder VB geschrieben, seltener in Java oder C# (CSharp).

Aufgabenstellung

Die Aufgabenstellungen lassen sich grob unterteilen in:

  • UnpackMe: die ausführbare Datei an sich ist durch nachträglich eingefügte Schutzroutinen gesichert. Diese Routinen sollen das Hauptprogramm vor Modfikationen und (z.B. durch Programmcodeverschlüsselung) vor Analyse-Tools schützen. Hier gilt es, die "Original"-Datei wiederherzustellen (das Crackme zu "entpacken").
  • KeyGenMe: um die Aufgabe zu lösen, muss man ein eigenes Programm schreiben, welches gültige Passwörter (oft z. B zu einem Benutzernamen) generiert.
  • PatchMe: hier kommt man an die Lösung, indem man bestimmte Abschnitte der CrackMe modifiziert und so den Programmablauf ändert oder eigenen Programmcode einfügt.

Oft ist das Ganze auch gemischt, so muss z. B zuerst der Schutz/Verschlüsselung überwunden werden, bevor man den Programmablauf ändern kann.

Die Aufgabenstellung wird vom Autor bestimmt.

Lösen der CrackMes

Um ein CrackMe zu lösen, werden Hilfsprogramme benutzt wie z. B ein Disassembler, ein Debugger oder auch (eher selten) Decompiler.

  • ein Debugger übersetzt das im Maschinencode vorliegendes Programm in Assembly (eine für Menschen lesbare Form der Maschinensprache) zurück und bietet die Möglichkeit, der CPU "bei der Arbeit" zuzuschauen — das heißt, wenn ein Programm ausgeführt wird, sieht man in einem Debugger welche Werte wo und wie berechnet und wohin zurückgeschrieben werden.
  • ein Disassembler bietet diese Interaktivität nicht, sondern übersetzt nur den Maschinencode in Assembly zurück.
  • ein Decompiler kann zuverlässig nur bei CrackMes angewandt werden, die im Zwischencode (IL, Java-Bytecode) vorliegen. Damit ist es möglich, zumindest im Ansatz, wieder den Quelltext zu rekonstruieren.

Diese Programme werden hauptsächlich zur Fehlersuche bei der Entwicklung von Software eingesetzt. Mit deren Hilfe wird also versucht das CrackMe zu analysieren und die Funktionsweise zu rekonstruieren. Im Gegensatz zu der weitverbreiteten Meinung gibt es keinerlei Programme, die automatisch diese Aufgabenstellungen lösen oder Maschinencode zuverlässig in höhere Programmiersprachen wie C/C++/VB/Delphi usw. zurückübersetzen. Viel mehr sind Kreativität, programmiertechnisches Wissen und analytisches Vorgehen gefragt. Das Lösen von CrackMes kann mit einem Denksport verglichen werden.

Zweck

CrackMes sind als Übungsaufgaben im Bereich Reverse Code Engineering (aka Binary Reverse Engineering) gedacht. Da bei einem gewöhnlichen CrackMe nur die ausführbare Datei vorliegt, versucht der CrackMe-Lösender nur anhand von Maschinencode die Funktionsweise des Programms zu verstehen. Nicht selten muss derjenige sich dazu in bestimmte Bereiche einarbeiten oder einlesen und gewinnt somit an Erfahrung. Auf solche "spielerische" Weise verbessert er seine System- und Programmierkenntnisse.

Weblinks