D'habitude les VMs ca me saoule vite mais là j'avais envie de voir ce que donnait 2 VMs imbriquées.

Finalement c'est la même chose :P ca demande juste plus de temps.

Les deux VMs ne sont pas obfusquées et sont écrites de facon très claires, j'ai quasiment tout fait avec ConteXt et la fonction Search And Replace.

La première VM éxécute donc la deuxieme qui elle éxécute un code qui modifie le Serial (de facon extrèmement simple)

Ensuite les 6 premiers chars du Serial modifié sont additionnés (l'addition s'arrète si un char après transformation est nul)

Cette valeure doit être égal à l'addition de tout les chars du nom pour que l'on ai droit au Good Boy.

L'auteur utilise un TLS CallBack pour patcher les APIs Sleep, MessageBoxA et StrCmpA

Sleep sert à initialiser un flag, MessageBoxA affiche le GoodBoy en fonction du flag initialisé par Sleep (et modifié par la routine de verif du serial) et non en fonction des arguments qui lui sont passés et enfin StrCmpA appelle la VM et l'algo de verification.

L'implémentation du TLS CallBack est mauvaise ce qui a pour effet soit de faire crasher le Crackme sur certains PCs (stack overflow) soit de ne tout simplement pas patcher les apis et donc le keygen-me n'appelle pas la VM ....

Vous trouverez l'integralitée de la solution ICI (désolé c'est en anglais, un mauvais anglais qui plus est, c'est la même solution que celle qui est disponible sur crackmes.de)

J'espère que vous retirerez quelque chose de ces sources / papers, la résolution d'une VM est quelque chose de difficile à expliquer, ca se fait avec un papier, un crayon, olly et le Bloc Note (on trace une fois l'exécution d'une instruction type, on se balade dans le code, on prend des notes et ensuite on retrouve rapidement toutes les autres instructions).

Pas une seule fois je n'ai utilisé IDA, certes ca fait plus pro mais ca demande aussi plus de temps pour le même resultat.

J'ai utilisé context et sa fonction de recherche / remplacement pour étudier le code rapidement, il est envisageable de faire un petit script python avec pyggy et pylly pour automatiser encore plus une grande partie de l'analyse voir même pour faire la partie la plus rébarbative du désassembleur (ie : remplir des structures, déclarer les noms des opcodes etc)

La premiere VM n'utilise pas le quart des opcodes qu'elle supporte et c'est dommage, en effet elle supporte des instructions très interressantes : call [reg] / call [const] / jmp [reg] / jmp [Const] qui sont dur à analyser en statique et encore plus dur à Win32iser (vous comprendrez apres ;) )

Enfin pour analyser rapidement la deuxieme VM je l'ai transformée en exe en modifiant le .asm renvoyé par mon desassembleur. J'ai donc pu la debugger directement avec olly, cette VM est très courte et ne nécessite pas vraiment d'analyse poussée, il suffit de placer quelques labels et de tracer.

J'ai contacté l'auteur de ce keygenme par MP et il prépare une VM avec du code auto modifiable :D (ah ba tu vois Genaytyk, les grands esprits se rencontrent, on en parlait hier et il va le faire)

Si c'est bien fait ca pourra être génial !

Bref les VMs c'est chiant mais si elles sont bien faites ça peux devenir marrant.

Merci antofik ;)