52aaaAAI8
Folgendes muss für die Serial gelten:
-ASCII-Wert des ersten Zeichens prim
-Zweites Zeichen durch 2 teilbar(=gerade Zahl)
-Summe aller Zeichen muss 0x230 sein.
-10 Zeichen lang(inkl. <Enter> nach Serialeingabe
Wer will kann dies nun in einen Keygen packen.
kurze Beschreibung des Lösungswegs:
Beim Durchgehen gelangt man früher oder später zu diesem Code:
Code:
00401150 /> \55 PUSH EBP
00401151 |. 8BEC MOV EBP, ESP
00401153 |. 83EC 48 SUB ESP, 48
00401156 |. 53 PUSH EBX
00401157 |. 56 PUSH ESI
00401158 |. 57 PUSH EDI
00401159 |. 8D7D B8 LEA EDI, [LOCAL.18]
0040115C |. B9 12000000 MOV ECX, 12
00401161 |. B8 CCCCCCCC MOV EAX, CCCCCCCC
00401166 |. F3:AB REP STOS DWORD PTR ES:[EDI]
00401168 |. C745 F8 00000000 MOV [LOCAL.2], 0
0040116F |. EB 09 JMP SHORT SerialMe.0040117A
00401171 |> 8B45 F8 /MOV EAX, [LOCAL.2]
00401174 |. 83C0 01 |ADD EAX, 1
00401177 |. 8945 F8 |MOV [LOCAL.2], EAX
0040117A |> 8B4D 08 MOV ECX, [ARG.1]
0040117D |. 51 |PUSH ECX
0040117E |. E8 AD090000 |CALL <SerialMe.strlen>
00401183 |. 83C4 04 |ADD ESP, 4
00401186 |. 3945 F8 |CMP [LOCAL.2], EAX
00401189 |. 73 2F |JNB SHORT SerialMe.004011BA
0040118B |. 8B55 08 |MOV EDX, [ARG.1]
0040118E |. 0355 F8 |ADD EDX, [LOCAL.2]
00401191 |. 0FBE02 |MOVSX EAX, BYTE PTR DS:[EDX]
00401194 |. 3305 B48B4200 |XOR EAX, DWORD PTR DS:[428BB4]
0040119A |. 50 |PUSH EAX ; /Arg3
0040119B |. 68 1C604200 |PUSH SerialMe.0042601C ; |Arg2 = 0042601C ASCII "%c"
004011A0 |. 8D4D FC |LEA ECX, [LOCAL.1] ; |
004011A3 |. 51 |PUSH ECX ; |Arg1
004011A4 |. E8 470D0000 |CALL SerialMe.00401EF0 ; \SerialMe.00401EF0
004011A9 |. 83C4 0C |ADD ESP, 0C
004011AC |. 8D55 FC |LEA EDX, [LOCAL.1]
004011AF |. 52 |PUSH EDX ; /Arg1
004011B0 |. E8 BB0C0000 |CALL SerialMe.00401E70 ; \SerialMe.00401E70
004011B5 |. 83C4 04 |ADD ESP, 4
004011B8 |.^ EB B7 \JMP SHORT SerialMe.00401171
Der Code ist für das "Entschlüsseln" von Statusmeldungen verantwortlich und tut dies in dem jedes Zeichen mit 0x34 gexort wird.
Die Meldungen beginnen bei Adresse 428A30, also kann man mit folgendem Code die Meldungen entschlüsseln:
Code:
MOV EDI, 00428A30
XOR ECX, ECX
MOV AL, BYTE PTR DS:[ECX+EDI]
XOR AL, 34
MOV BYTE PTR DS:[ECX+EDI], AL
INC ECX
CMP ECX, 1A0
JB SHORT SerialMe.004011D8 // <- anpassen
Oder hier in assemblierter Form für "binary paste" in OllyDbg(einfach an einer freien Stelle im Code einfügen und dann "new origin here" wählen:
Code:
BF 30 8A 42 00 33 C9 8A 04 39 34 34 88 04 39 41 81 F9 A0 01 00 00 72 EF
Dann schaut man im Speicher nach, wo die "Richtig"-Meldung beginnt(bei 428A40). Man klickt auf das erste Byte und wählt "Find references", wodurch man zu der Funktion an Addresse 4014F0 gelangt. Dann geht man zu dem Sprung der zu dieser Addresse führt und wählt wieder "Find references to->Selected command", dies wiederholt man bis man am Anfang der Prüfung ankommt. So findet man heraus, welche Sprünge der Serialprüfung(beginnt bei 4010E1 (IDA-Signatur anwenden und nach Aufrufen von _fgets suchen)) springen müssen und welche nicht. Nun muss man nurnoch die versch. Bedingungen analysieren(kein komplizierter Code).