devilz KeyGen-me N5 - Notes
================================================================================
Author        : Canter <canterwood@altern.org>
Protection    : modified CRC-32, maths (FPU)
Level         : Intermediate
Tools         : OllyDbg, IDA & MASM32 (keymaker)
Attached files: crackme + keymaker + sources
================================================================================
05.04.2004

Introduction
--------------------------------------------------------------------------------
  Nous allons, dans ce bref rcapitulatif, non pas fournir un tutorial sur la
manire de rsoudre ce challenge, mais nous efforcer de dcrire la faon dont
est construit un serial valide.
L'analyse du code tant longue - quoique sans accroc majeur -, nous avons
prfr opter pour cette solution conomique, tant pour le lecteur que le
rdacteur...

Structure d'un serial
--------------------------------------------------------------------------------

Voici  quoi ressemble un serial valide :


                      devilz-A122-4CCE-DDF3B1CA-112B42BC
                        (1)   (2)  (3)    (4)      (5)


On peut dnombrer 5 parties distinctes, qui font chacune l'objet d'un traitement
particulier dans le code.
Nous vous proposons ci-dessous un petit rsum concernant chaque fragment,
n'hsitez pas  vous rfrer au source du keymaker pour plus de prcisions.

(1)

Il s'agit simplement du nom de l'auteur "devilz", invariable.

(2)

Ce code est fixe pour chaque ordinateur, il est calcul  partir du numro de
srie de disque via une opration trs simple :

((hiword(s) + loword(s)) & 0FFFF, o s est le numro de volume, rcupr grce
 la fonction Windows API GetVolumeInformation.

(3)

L'octet de poids fort (4C dans l'exemple) correspond  un traitement effectu
sur le CRC-32 modifi du nom (pour info, la modification concerne seulement
l'initialisation du hash).
L'octet restant est  premire vue "au choix", mais il faut en fait l'adapter
pour que le calcul logarithmique en fin de procdure de vrification (avec la
FPU) soit gal  0. Une fois dcrypt, ce byte doit tre tel que ln x = 0, soit
x = 1.

(4)

Ce double-mot est le complment du CRC-32 modifi du nom. Dans notre cas, le CRC
tait donc : NOT(DDF3B1CA) = 220C4E35.

(5)

C'est la partie la plus complique ; sans entrer dans les dtails, elle
reprsente la forme crypte de la racine positive du polynme de degr deux :

ax^2 + bx + c = 0

Ce nombre est un flottant (il n'est pas ncessairement entier), que l'on peut
calculer avec le coprocesseur arithmtique. En fait, la tolrance sur
l'exactitude de ce dernier nombre est de 0,5, ce qui fait qu'un mme nom peut
possder plusieurs serials diffrents.
Par exemple, ceci fonctionne :

devilz-A122-4CCE-DDF3B1CA-112B42BD (la denire lettre a t change).

Conclusion
--------------------------------------------------------------------------------
  Ce document est trs imcomplet et n'offre qu'une vision rduite de ce que l'on
peut trouver dans le keygenme, tout est en ralit construit pour ralentir la
progression du cracker...

Pour information, j'ai mis la bagatelle de 4h 30 (quand mme !) seulement pour
trouver un serial valide, puis 3h 00 pour raliser le keymaker. En comptant le
temps de rdaction de ce rsum, nous dpassons allgrement la barre des 8h.
Je ne doute pas qu'il est possible de faire mieux...

Quoi qu'il en soit, devilz nous a gratifi d'une preuve plutt intressante,
qui permet de faire un point sur ses connaissances en keygenning standard.

Canter