VM-Crackme/Keygenme/Serialme

CDW

0
Mitarbeiter
So etwas wurde breits vor kurzem auf dem Buhaboard vorgestellt - ein Crackme welches eine interne VM nutzt. Allerdings hatte ich schon länger vor, das selber umzusetzen ;)

Gepackt: nein
Schwierigkeitsgrad: schwer abschätzbar, aber auf jedenfall nicht anfängerfreundlich
Regeln: naja, keine eigene Erfolgsmeldung einpatchen ;)
Ansonsten - Patch, Serial, Keygen - für jeden ist etwas dabei.
Die VM ist im Crackme integriert (es ist also ein ganz normales Programm -nur werden einige Berechnungen von der VM durchgeführt).


Zur VM: ist eine Stackmachine, als Vorbild diente die MIC-1 Architektur (z.B http://www.cs.auc.dk/~mixxel/NA-F03/slides/NA-L3-F03-v2-gray.pdf), wobei ich nicht so ganz runter gegangen bin wie ich wollte (also keine Gatter Nachbildungen usw, war doch etwas zu aufwändig :rolleyes: )). Soweit ich weiß, ist die JVM (Java VM) auch Stackbasiert - ist also keine "Exotik".

Kurz: eine Stackmachine bietet nach "außen" hin keine Register, sondern erledigt alle Operationen über den Stack. Sie hat einen bestimmten Befehlssatz (Add,mov etc), intern wird (wie auch in x86) jeder Befehl duch Microprogramme realisiert in welchen die "elementaren" Befehle genutzt werden (diese sind direkt in der Hardware implementiert) .
Diese Methode erlaubt "nach außen hin" die lustigsten Befehle anzubieten (Fakultätberechnung,GGT,Primzahlcheck usw direkt als Assemblyanweisung ;)) ohne solche Funktionen alle in der Hardware zu realisieren.

Der Checkalgo ist einfach gehalten, es gibt auch keine wesentlichen "Gemeinheiten", keine nervende Musik etc (ich konnte es mir nicht verkneifen, eine Kleinigkeit gegen ältere IDA Versionen einzubauen ;) ).

Die Entwicklungszeit betrug übrigens nur einige Stunden, trotzdem lässt es sich damit schon recht bequem programmieren (es leben die EQU Ausdrücke in MASM)
Codeausschnitt
Code:
code1_ db bipush_,10
            db bipush_,20
            db iadd_
            db istore_,X
x:=10+20;
Ist also gar nicht so weit hergeholt oder gar zu kompliziert, damit wichtige Passagen zu "virtualisieren".
EDIT: habe den IDA-"Schutz" mal rausgenommen
http://cdw.de.vu/vm.zip
oder (wer trotzdem die Auswirktugen sehen möchte - im Anhang ist die "geschützte" Version)
 
Win98 : "Für diesen Vorgang ist nicht genügend Arbeitsspeicher vorhanden"

WinXP : "Die Auslagerungsdatei ist zu klein"

Was braucht denn die vm.exe als Mindestvoraussetzung zum laufen ? (in GB) :-)
 
Was braucht denn die vm.exe als Mindestvoraussetzung zum laufen ? (in GB) :-)
ca 100KB ;)

scheint der Anti-IDA Trick zu sein (dabei habe ich den doch selber vom PrivateExeProtector abgekupfert und nur leicht modifiziert - bei mir kommt nämlich die Meldung erst, wenn ich versuche das Crackme mehrmals in Olly zu laden. IDA 4.3 friert beim ladeversuch komplett ein :).
Meine Auslagerungsdatei ist aber eher knappt über 2GB groß. Wenn man sich die VSize einer Section im Crackme anschaut, sieht man auch, warum soviel virtuellen Speicher braucht)

Hier die "leichte" Version, ohne irgendwelche PE-Manipulationen:
Edit: habe jetzt im ersten Post auf die "ungeschützte" Version verlinkt. Werde mal demnächst mit den Parametern rumspielen, paar Gemeinheiten einbauen und ein eigenständiges Crackme dazu machen.
 
Nice! Wirklich gutes CrackMe.
Ok, hier schonmal eine Serial:
_Lesco
6907041801

Bist du sicher, dass es für jeden Namen eine Serial gibt? Wegen des verwendeten "div"s kann es bei der Serialberechnung nämlich zu einem Überlauf kommen, wenn der Namenshash >= (0x8000000-5) ist, da beim Dividieren eines DWORDs durch 2 das Ergebnis nie größer als 0x7FFFFFFF sein kann. Oder habe ich etwas übersehen?
 
Dividieren eines DWORDs durch 2 das Ergebnis nie größer als 0x7FFFFFFF sein kann. Oder habe ich etwas übersehen?
die Division war in erster Linie dafür gedacht, dass man die Zahlen nicht auf Anhieb als Eingabe erkennt. Aber du hast recht - die Division ist ungünstig platziert. Ich könnte es editieren und z.B durch Subtraktion ersetzen, wenn ich zu hause bin. Dann müsstest du aber den Keygen anpassen ;). Wenn du willst, schicke ich dir dann die Änderung zu .

Ich überlege mir noch, wie die VM zusätzlich eingesetzt werden könnte...
 
Also bei mir(XP sp2) funktioniert auch die geschützte Version ohne Probleme und mit ein paar Modifikationen klappts auch mit IDA und OllyDbg.

Hier ist schonmal der Keygen für die jetzige Version des CrackMes, eine Lösung folgt noch.(dann zu dem aktualisierten CrackMe)

[OT]Mit der Zeit des ersten Postings hast du 0day ziemlich erschwert ;)[/OT]

Edit: Keygen auf neue Version angepasst.
 
Ich will schon garnicht mehr wissen, was "schüler" heutzutage in der Schule alles lernen. Wir damals blubber, belehre, ... , und überhaupt ! :-)

Es gibt in der vm_.exe eine Adresse im RAM wo man anhand der Eingaben auf den Algorithmus schliessen kann. Sowas lässt sich doch vermeiden, oder geht das bei einer VM nicht ?
 
Sowas lässt sich doch vermeiden, oder geht das bei einer VM nicht ?
Ich denke Du meinst einige Variablen, die mehrfach verwendet werden. Letzendlich ist es schon eine bewusste Lösungsoption - der schmale Grat zwischen Komplexität und "die Leute nicht verschrecken" ;).

Man könnte es ja noch weiter "verschleiern", indem jedesmal ein neuer Speicherbereich an die VM übergeben wird (beim Starten einer Code-Sequenz wird ein Zeiger auf den Speicherbereich übergeben, der dann als Variablen"pool" dient). Aber irgendwo müssen die Werte ja zwischen den Aufrufen aufbewahrt werden - und so ein "Positionswechsel" wäre imho einfach nur störend, aber nicht hinderlich - stattdessen könnte man ja gleich einen besseren Algo nehmen ;) . Beides wäre aber imho zuviel des guten (letzendlich könnte man sich eine VM in einer "fetten" Hochsprache basteln mit zig Libs und Junkcode, so ein Crackme wird sich dann keiner anschauen, weil es zu aufwendig ist ;)).

Wie dem auch sei, ich habe es aktualisiert und das DIV X durch einen SUB Y ersetzt.

Also bei mir(XP sp2) funktioniert auch die geschützte Version ohne Probleme
Wie erwähnt nutzt PrivateExeProtector das auch. Nur ist die VSize geschickter gewählt. Es gibt da eine leere (physische Größe==0), riesige Section und noch eine/zwei "normale" hintendran. Die VSize Spielerei führt dann dazu, dass IDA 4.3 abschmiert sowie OllyDbg je nach System einfach nur "blockt" (ich hatte dank Hyperthreading nicht soo große Probleme damit, es ging zwar langsam und mit "denkpausen", war aber noch im Toleranzbreich) - allerdings wird damit Tracing sehr zeitaufwendig, das debuggen recht langwirieg und einfach die Section entfernen oder editieren ist nicht drin - da noch zusätzliche "funktionelle" Sectionen nach der großen Section kommen. Da muss man beim Entfernen schon tricksen. Vor allem wenn man sich erstmal wundert, warum Olly so lahm ist :D. Ist der Trick aber einmal bekannt, stellt er kein großes Hindernis dar.
 
Original von CDW

Also bei mir(XP sp2) funktioniert auch die geschützte Version ohne Probleme
Wie erwähnt nutzt PrivateExeProtector das auch. Nur ist die VSize geschickter gewählt. Es gibt da eine leere (physische Größe==0), riesige Section und noch eine/zwei "normale" hintendran. Die VSize Spielerei führt dann dazu, dass IDA 4.3 abschmiert sowie OllyDbg je nach System einfach nur "blockt" (ich hatte dank Hyperthreading nicht soo große Probleme damit, es ging zwar langsam und mit "denkpausen", war aber noch im Toleranzbreich) - allerdings wird damit Tracing sehr zeitaufwendig, das debuggen recht langwirieg und einfach die Section entfernen oder editieren ist nicht drin - da noch zusätzliche "funktionelle" Sectionen nach der großen Section kommen. Da muss man beim Entfernen schon tricksen. Vor allem wenn man sich erstmal wundert, warum Olly so lahm ist :D. Ist der Trick aber einmal bekannt, stellt er kein großes Hindernis dar.

Keygen im oberen Post ist jetzt angepasst, ich werde demnächst die Lösung schreiben.
Zu diesem Thema fällt mir folgender Artikel ein, in dem viele solcher Tricks beschrieben werden, daher hatte ich auch sowas vermutet, als OllyDbg so viel Speicher verlangt hatte:
http://www.honeynet.org/scans/scan33/nico/


EDIT: Hier ist nun die Lösung, Feedback/Kritik erwünscht. Wenn ich an einigen Stellen zu ungenau erklärt habe, fragt einfach nach.
 
Zurück
Oben