Hallo!
Ich habe hier mal ein schönes Crackme für Anfänger (Win32). Ich bin seit etwas mehr als einem Tag dabei und konnte es gut lösen. Darum wollte ich den Anderen dashier nicht vorenthalten.
Ziel ist es, einfach das Passwort herauszufinden, wobei egal ist, wie. Die Datei befindet sich im Anhang.
Hier mal meine Lösung. Hab alles schön kommentiert und wollte mal wissen, ob das Codeverständnis richtig ist:
MfG
Extinction
Ich habe hier mal ein schönes Crackme für Anfänger (Win32). Ich bin seit etwas mehr als einem Tag dabei und konnte es gut lösen. Darum wollte ich den Anderen dashier nicht vorenthalten.
Ziel ist es, einfach das Passwort herauszufinden, wobei egal ist, wie. Die Datei befindet sich im Anhang.
In der user32.dll einen Breakpoint auf MessageBoxExA setzen und den Stack im Auge behalten.
In "Maybe crackme#.0040102B" mal runterscollen und sich überlegen, was in den ganzen Wiederholungen das CMP macht. Auf Datentypen achten.
Hier mal meine Lösung. Hab alles schön kommentiert und wollte mal wissen, ob das Codeverständnis richtig ist:
(leider sind die Einrückungen weg, kann ich leider nix machen... :.( )
004010D5 |. 8BD0 MOV EDX,EAX
004010D7 |. 33C0 XOR EAX,EAX
004010D9 |. 33C9 XOR ECX,ECX
004010DB |. B9 00000000 MOV ECX,0 ; ECX ist wohl der char-array Index
004010E0 |. 8A0439 MOV AL,BYTE PTR DS:[ECX+EDI] ; Nullten Char in den Speicher schreiben
004010E3 |. 83F8 63 CMP EAX,63 ; Erstes Zeichen vergleichen
004010E6 |. 0F85 86000000 JNZ crackme#.00401172 ; Destruktor fals EAX != Wert
004010EC |. 33C0 XOR EAX,EAX ; Wenn EAX == Wert geht's hier weiter
004010EE |. 41 INC ECX ; ECX += 1
004010EF |. 8A0439 MOV AL,BYTE PTR DS:[ECX+EDI] ; "Ersten" char in den Speicher. (also zweites Zeichen)
004010F2 |. 83F8 72 CMP EAX,72 ; Zweites Zeichen vergleichen....
004010F5 |. 75 7B JNZ SHORT crackme#.00401172 ; Destruktor fals EAX != Wert
.........
0040114F |. 41 INC ECX ; Das Spiel geht immer so weiter
00401150 |. 8A0439 MOV AL,BYTE PTR DS:[ECX+EDI] ; Bis wir den letzten in den Speicher schreiben
00401153 |. 83F8 6B CMP EAX,6B ; und das Letzte Zeichen prüfen.
00401156 |. 75 1A JNZ SHORT crackme#.00401172 ; Destruktor fals EAX != Wert.
00401158 |. 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL <- Rufft Fenster auf
0040115A |. 68 B9304000 PUSH crackme#.004030B9 ; |Title = " SUCCESS! !" <- ab hier ist's wohl klar ^^
0040115F |. 68 8C304000 PUSH crackme#.0040308C ; |Text = " good reverser!! but u are still a newbie..."
00401164 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
00401167 |. E8 3E000000 CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
Umrechnung für den CMP Befehl:
Hex=Dez=Char
63=99=c
72=114=r
61=97=a
63=99=c
6B=107=k
2D=45=-
62=98=b
72=114=r
65=101=e
61=97=a
6B=107=k
C++ Hilfsprogramm für die Umrechnung:
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
for (int i=0;i<256;i++)
printf("%x = %c = %i\n",i,i,i);
system("PAUSE");
return EXIT_SUCCESS;
}
Das Passwort lautet:crack-break
004010D5 |. 8BD0 MOV EDX,EAX
004010D7 |. 33C0 XOR EAX,EAX
004010D9 |. 33C9 XOR ECX,ECX
004010DB |. B9 00000000 MOV ECX,0 ; ECX ist wohl der char-array Index
004010E0 |. 8A0439 MOV AL,BYTE PTR DS:[ECX+EDI] ; Nullten Char in den Speicher schreiben
004010E3 |. 83F8 63 CMP EAX,63 ; Erstes Zeichen vergleichen
004010E6 |. 0F85 86000000 JNZ crackme#.00401172 ; Destruktor fals EAX != Wert
004010EC |. 33C0 XOR EAX,EAX ; Wenn EAX == Wert geht's hier weiter
004010EE |. 41 INC ECX ; ECX += 1
004010EF |. 8A0439 MOV AL,BYTE PTR DS:[ECX+EDI] ; "Ersten" char in den Speicher. (also zweites Zeichen)
004010F2 |. 83F8 72 CMP EAX,72 ; Zweites Zeichen vergleichen....
004010F5 |. 75 7B JNZ SHORT crackme#.00401172 ; Destruktor fals EAX != Wert
.........
0040114F |. 41 INC ECX ; Das Spiel geht immer so weiter
00401150 |. 8A0439 MOV AL,BYTE PTR DS:[ECX+EDI] ; Bis wir den letzten in den Speicher schreiben
00401153 |. 83F8 6B CMP EAX,6B ; und das Letzte Zeichen prüfen.

00401156 |. 75 1A JNZ SHORT crackme#.00401172 ; Destruktor fals EAX != Wert.
00401158 |. 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL <- Rufft Fenster auf
0040115A |. 68 B9304000 PUSH crackme#.004030B9 ; |Title = " SUCCESS! !" <- ab hier ist's wohl klar ^^
0040115F |. 68 8C304000 PUSH crackme#.0040308C ; |Text = " good reverser!! but u are still a newbie..."
00401164 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
00401167 |. E8 3E000000 CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
Umrechnung für den CMP Befehl:
Hex=Dez=Char
63=99=c
72=114=r
61=97=a
63=99=c
6B=107=k
2D=45=-
62=98=b
72=114=r
65=101=e
61=97=a
6B=107=k
C++ Hilfsprogramm für die Umrechnung:
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
for (int i=0;i<256;i++)
printf("%x = %c = %i\n",i,i,i);
system("PAUSE");
return EXIT_SUCCESS;
}
Das Passwort lautet:crack-break
MfG
Extinction