Eigenes Crackme

Hi,
ich habe auch ein Crackme geschrieben, ist allerdings total einfach, da ich von dem Thema noch keine Plan habe. Programmiersprache: C

Viel Spaß :)

Edit: Forum vertan, bitte verschieben :D
 
00401067 |. 68 4C214000 PUSH Crackme.0040214C ; /format = "%i"
0040106C |. FF15 A4204000 CALL DWORD PTR DS:[<&MSVCR80.scanf>] ; \scanf
00401072 |. 6A 0A PUSH 0A
00401074 |. FFD6 CALL ESI
00401076 |. 83C4 0C ADD ESP,0C
00401079 |. 813D 7C334000 >CMP DWORD PTR DS:[40337C],145859
00401083 |. 75 1F JNZ SHORT Crackme.004010A4
00401085 |. 803D 80334000 >CMP BYTE PTR DS:[403380],0
0040108C |. 75 16 JNZ SHORT Crackme.004010A4
0040108E |. 53 PUSH EBX
0040108F |. BB 00214000 MOV EBX,Crackme.00402100 ; ASCII "
!githciR"

Bei 00401079 wird verglichen ob der eingegebene Wert Hex[145859] DEZ[1333337] ist.

Von daher ist das Passwort "1333337".
 
Sehr gut :) Kannst du mir mehr zum Vorgehen erklären? Dieser Themenbereich ist übrigens völlig neu für mich. Scheint aber dennoch sinnvoll zu sein :) Es sieht so aus als ob das Passwort ganz offen im Speicher liegt ?(
 
1. Crackme Analysieren
Bevor man ein Crackme in Olly lädt, ist es wichtig zu wissen ob ein Packer verwendet wurde und mit welche Programmiersprache das Crackme geschrieben wurde. Das kann man mit Peid oder dem RDG Packer Detector prüfen. In deinem fall wurde kein Packer verwendet und die Programmiersprache die du verwendet hast, ist ?C?.

2. Crackme in Olly laden
Nachdem wir das Crackme analysiert haben, können wir den Code studieren. Da dein Crackme in ?C? geschrieben wurde, können wir nach ?scanf (Eingabe des Benutzers wird dadurch eingelesen)? über ?all intermodular calls? suchen. Das finden wir dann bei der Adresse ?0040106C?

Code:
0040106C  |. FF15 A4204000  CALL DWORD PTR DS:[<&MSVCR80.scanf>]     ; \scanf

Hier wird der Wert der Eingabe nach DS geschoben. Kurz danach befindet sich auch schon ein ?Compare two operands? Befehl, der den eingegebenen Wert mit dem hardgecodeten Wert vergleicht.

Code:
00401079  |. 813D 7C334000 >CMP DWORD PTR DS:[40337C],145859

Die Eingabe die ja zuvor ins DS Register geschoben wurde, wird nun mit HEX[145859] verglichen. Die Zahlenwerte sind in Assembler immer in Hexwerten angegeben aber die von Assembler erwartete Eingabe ist eine Dezimalzahl. Also HEX145859] = DEZ[1333337].

Code:
00401083  |. 75 1F          JNZ SHORT Crackme.004010A4

Sind diese beiden Werte gleich, wird nicht nach 004010A4 gesprungen und die Goodboy message wird ausgegeben.

Code:
0040108F  |. BB 00214000    MOV EBX,Crackme.00402100                 ;  ASCII "
!githciR"

Stimmen die Werte nicht überein, so springt das Programm zu 004010A4 und gibt die Badboy message aus.

Code:
004010A4  |> BF 07000000    MOV EDI,7
004010A9  |. 8DA424 0000000>LEA ESP,DWORD PTR SS:[ESP]
004010B0  |> 0FBE8F F420400>MOVSX ECX,BYTE PTR DS:[EDI+4020F4]
004010B7  |. 51             PUSH ECX
004010B8  |. FFD6           CALL ESI
004010BA  |. 83C4 04        ADD ESP,4
004010BD  |. 83EF 01        SUB EDI,1
004010C0  |.^79 EE          JNS SHORT Crackme.004010B0
004010C2  |. 6A 0A          PUSH 0A
004010C4  |. FFD6           CALL ESI
004010C6  |. 83C4 04        ADD ESP,4
004010C9  |. 5F             POP EDI
004010CA  |. 5E             POP ESI
004010CB  \. C3             RETN
 
Die ganzen zahlen die das stehen haben doch nichts mit "c" zu tun ?

-Sry bin ein totaler anfänger und hab sowas noch nie gesehen ^^


können wir nach ?scanf (Eingabe des Benutzers wird dadurch eingelesen)? über ?all intermodular calls? suchen
???
 
Die Anwendung wurde in C geschrieben, was man jedoch im Debugger sieht ist der Maschinencode, den der Compiler erzeugt hat.
>???
Vielleicht solltest du dich erstmal mit den Grundlagen, inkl. Bedienung des benutzten Debuggers vertraut machen:
Crackme-FAQ
 
Ok , das versteh ich ^^

Aber wie soll man diesen Maschinencode verstehen ?
Ich werd die Crackme-FAQ mal genau studieren

----

Müsste ich für zb. dieses CrackMe "C" können ? Oder hätte es gereicht sich
mit programmiersprachen etwas auszukennen?
 
Ok, du hast dich noch nicht damit auseinander gesetzt.^^

Mal ganz kurz und simpel:

Egal welche Programmiersprache genutzt wurde, am Ende ist es Maschienen Code der erzeutg wird. Dieser kann 1:1 in Assembler übersezt werden.
Der Maschienencode wird dann ins Ram geladen und kann dort von der CPU ausgeführt werden. - Deshalb auch diese "Zahlen". Also die erste Zahlenspalte (die fortlaufend nummerierte) sind die Adressen im Ram. Die zweite Zahlenspalte ist der Maschienencode. (im Hex Format). Danach folg die Übersetzung in "Assembler" und die letzte Spalte kann Kommentare enthalten, welche von Olly manchmal hinzugefügt werden.

Gruss
IsNull
 
Wie übersetzt man den Maschienen Code in Assembler ?

Bei mir gibt es 4 fenster ? Welches beinhaltet die übersetzung in "Assembler" ?

2ez1ndh.jpg
 
Das Fenster mit den netten Farb-Markierungen.
Falls du mehr über assembly language erfahren möchtest empfehle ich dir google, oder auch die Board-Suche (ich glaube in dem 'Tutorial-Thread' waren ein paar interessante Links zu assembly tutorials).
 
Zurück
Oben