Hacks & CrackmesTests, Fragen oder Hilfestellungen. Crackmes und Hackits werden hier diskutiert.
[SOLVED]Erstes SerialMe
Diskussion: [SOLVED]Erstes SerialMe im Forum Hacks & Crackmes, in der Kategorie Software Home; Anzeige
Hallo,
ist mein erstes SerialMe. Den Schwierigkeitsgrad sollte im bereich "Fortgeschrittene Anfänger" liegen, denke bzw. hoffe das Anfänger etwas ...
Anzeige Hallo,
ist mein erstes SerialMe. Den Schwierigkeitsgrad sollte im bereich "Fortgeschrittene Anfänger" liegen, denke bzw. hoffe das Anfänger etwas dabei lernen können.
SOLVED ist es wenn Serial zum Nick gefunden und eine Lösung geschrieben wurde - KeyGen ist zusatz.
Patchen ist nicht erwünscht.
Viel Spass
Oi!Alex
P.S. Für einen Usernamen gibt es viele richtige Serials (einfachhalber)
Dieses Stück Code berechnet jeweils aus einem Namens- und Serialbuchstaben einen Wert und schreibt ihn in ein Array. Diese Schleife stellt dann fest, ob die Serial gültig ist:
Hier passiert eigentlich nicht viel, außer dass ein Buchstabe aus Name und Serial addiert werden und ein paar Berechnungen durchgeführt werden. Der Wert der am Ende in ecx steht setzt sich folgendermaßen zusammen:
n[i] + s[i] + 3*i = x
n := Name und s := Serial, wobei der Name sooft aneinandergehangen wird, bis er 10 Zeichen lang ist.
Weiter geht es hiermit:
Dies ist eine Compiler-Optimierung, die man vielleicht nicht auf den ersten Blick versteht: Im Grunde handelt es sich hierbei um Rechnung mit Festkommazahlen, um sich die Nutzung eines Div zu ersparen. Statt zu teilen wird einfach mit dem Kehrwert multipliziert. Dabei sind die unteren 32-Bit der gebrochene Teil und die oberen der ganzzahlige(edx:eax im Endergebnis). Es wird also zuerst mit 0:0xCCCCCCCD multipliziert. Dezimal ergibt das 0xCCCCCCCD/0x100000000 = 0.8 also 4/5. Darauf wird das Ergebnis um 3 Bits nach rechts verschoben, was einem Teilen durch 8 entspricht. Dadurch kommen auf eine Multiplikation mit 4/40, gekürzt 1/10. Dieser Code-Abschnitt teilt also x(s.o.) durch 10 und speichert das Resultat im Array und dies ohne die rechenintensive div/idiv-Anweisung zu nutzen.
Nun weiter:
Dies verschiebt zuerst x um 2 Bits nach links(also *4). Darauf hin wird wieder x addiert und das Resultat verdoppelt. Zusammengefasst: 2(4x + x) = 10x. Es wird also das Ergebnis der Ganzzahldivision mal 10 gerechnet und von x subtrahiert.
Diese Differenz muss 9 betragen. Dabei handelt es sich nur um eine verschleierte Berechnung des Rest wenn man x durch 10 teilt. Zusammengefasst also:
Code:
(n[i] + s[i] + 3*i + 65) mod 10 = 9
Dies vereinfacht man zu:
(n[i] + s[i] + 3*i) mod 10 = 4
Für s[i] mod 10 muss daher folgendes gelten:
y = (n[i] + 3*i) mod 10
s[i] mod 10 = 14 - y für y > 4
und
s[i] mod 10 = 4 - y für y <= 4
Nun muss man dieses Ergebnis nurnoch zu einem Buchstaben für dessen Ascii-Wert a mod 10 = 0 gilt, addieren(z.B. 'd').
Wirklich ein gutes CrackMe, bei dem man auch ein wenig nachdenken muss(wenn man die Serial nicht einfach per BF berechnen lassen will)
Das es schnell geht dachte ich mir aber so schnell. (Habe nathürlich nichts anderes erwartet )
Danke für die Blumen und für die ausführliche Lösung Lesco!
Hoffe es besteht interesse auf weitere CrackMe',s mir schwirrt da noch ne idee rum...