Ich habe erst mal nach der Stelle gesucht, an der der Key eingelesen wurde, indem ich in Olly immer wieder [Strg]+[F8] gedrückt habe, und an der Stelle an der er mit der Ausführung angehalten hat einen Breakpoint gesetzt habe. Dann habe ich das Programm zurückgesetzt, bin mit F9 zum Breakpoint "gesprungen", habe diesen entfernt und bin mit F7 in den Call gegangen usw.
Dann habe ich irgendwann rechts am Rand gesehen, wie der String "pw: " auf den Stack gepusht wurde (= Ausgabe) und habe dann weiter unten den String "done!" gesehen (=Erfolgsmeldung).
Diese Meldung ist von einem Conditional Jump umschlossen, der über die Erfolgsmeldung springt, wenn AL=0 ist. Mir war also klar, dass im Call darüber entschieden wird, ob AL=0 ist, also ob die Serial richtig ist. Ich habe mir also diese Funktion angeguckt:
Code:
00401326 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] ; eax = *key
00401329 8D56 01 LEA EDX,DWORD PTR DS:[ESI+1]
0040132C 8D4E 02 LEA ECX,DWORD PTR DS:[ESI+2]
0040132F 0FBE0407 MOVSX EAX,BYTE PTR DS:[EDI+EAX] ; eax = key[i]
00401333 47 INC EDI ; ++i
00401334 8945 EC MOV DWORD PTR SS:[EBP-14],EAX ; save char
00401337 89D0 MOV EAX,EDX ; irgendeine komplizierte Berechnung
00401339 0FAFC2 IMUL EAX,EDX
0040133C 0FAFC2 IMUL EAX,EDX
0040133F 89CA MOV EDX,ECX
00401341 0FAFD1 IMUL EDX,ECX
00401344 6BC0 03 IMUL EAX,EAX,3
00401347 6BD2 05 IMUL EDX,EDX,5
0040134A 01D0 ADD EAX,EDX
0040134C 6BD1 0B IMUL EDX,ECX,0B
0040134F 29D0 SUB EAX,EDX
00401351 83C0 1F ADD EAX,1F
00401354 99 CDQ
00401355 31D0 XOR EAX,EDX
00401357 29D0 SUB EAX,EDX
00401359 D3E0 SHL EAX,CL
0040135B BA 1A000000 MOV EDX,1A
00401360 89D1 MOV ECX,EDX
00401362 99 CDQ
00401363 F7F9 IDIV ECX
00401365 83C2 61 ADD EDX,61
00401368 8D46 06 LEA EAX,DWORD PTR DS:[ESI+6]
0040136B 3955 EC CMP DWORD PTR SS:[EBP-14],EDX ; prüfe Char mit entschlüsseltem Buchstaben (hier kann man den richtigen Buchstaben in EDX auslesen)
0040136E A3 10504400 MOV DWORD PTR DS:[445010],EAX
00401373 75 10 JNZ SHORT crackme_.00401385 ; wenn keine Übereinstimmung: setze AL=0 und brich ab
Wenn du in C programmieren kannst, solltest du kein Problem haben, meine Kommentare zu verstehen.
Wenn jemand von den erfahreneren Reversern hier nen Tipp für mich hat, wie man das Crackme schneller/einfacher hätte lösen können, immer her damit!
