N-Gen Trial Crackme - Tutorial
================================================================================
Auteur         : Canterwood <charloweb@hotmail.com>
Outils utiliss: OllyDbg, Hex Workshop
Niveau         : Dbutant+
Fichiers       : - "crackmefinalversion.exe" (crackme original)
                 - "crackmefinalversion.decrypted.exe" (crackme dcrypt)
                 - "dump.bin" (routine de validation)
                 - "keygen" (source)
                 - "ngn.trial.keygen.exe" (keygen)
================================================================================

Introduction
--------------------------------------------------------------------------------
Ce crackme n'est pas excessivement compliqu dans le fond, mais il contient
plusieurs petites protections visant  barrer la route au cracker de base.

Plutt que de proposer une analyse linaire avec des listings  n'en plus finir,
ce tutorial va tre divis en deux parties majeures :
- mise en route : cette section listera les obstacles rencontrs et le moyen
de les viter et/ou les contrer ;
- validation du serial : une fois que l'on aura accs  la routine de
vrification, il s'agira de la dchiffrer, afin de raliser un keygen. Ce sera
l'objet de cette seconde partie.

I. Mise en route
--------------------------------------------------------------------------------
Voici les problmes que l'on peut rencontrer lorsque l'on charge le crackme avec
un debugger...

* Protection anti-debugging
****************************************
Description : juste aprs l'entry point, on peut remarquer un joli INT3 dont le
seul objectif est de nous mettre les btons dans les roues (le programme quitte
lorque l'on passe dessus).

Remde : sous OllyDbg, il suffit de se rendre dans Options > Debugging options
> Exceptions et de cocher la case 'INT3 breaks" en dessous de "Ignore...".
Le crackme se lance maintenant normalement.

* Cryptage des strings
****************************************
Description : le contenu des variables de type chane a t crypt, ce qui rend
les strings totalement illisibles.

Remde : passer sur la procdure de dcryptage qui est situe au dbut du
listing. Sous OllyDbg, les strings sont automatiquement mises  jour, ce qui
arrange bien les choses !

NB : RaX| Love CHiMiX :) => J'ai mon petit bonus maintenant ?

* Code poubelle
****************************************
 ce stade, le crackme a d se lancer, il faut donc renseigner les champs Name
et Serial puis poser un breakpoint sur la fonction API GetWindowTextA.

Description : des instructions inutiles (INT20, DB XX, sauts...) ont t
ajoutes au code.

Remde : aucun ! Je trouve mme cela plutt sympathique, puisque l'on a
l'impression d'aller plus rapidement  cause du dficit d'intructions
intressantes...

* Routine de validation bidon
****************************************
Description : le code est vraiment poubelle  100% puisque la routine de
validation prsente ici est totalement inutile. C'tait trop simple pour tre
vrai : un algo de type checksum est appliqu sur le nom, suivi d'un wsprintf...
On se rend compte de la supercherie lors du test du serial gnr, quand une
bote de message du genre "You make me laugh!" s'affiche au lieu du "Good
serial!" escompt...

Remde : aucun ! Il reste maintenant  trouver o se cache la vraie routine de
validation...

* Routine de validation crypte
****************************************
Description : lorsque l'on descend tout en bas, on tombe sur un "CALL EBX", puis
on se retrouve dans une procdure dont le code originel a t crypt. En fait,
il a t dcrypt en "just in time" comme pour les strings, mais le listing n'a
pas t mis  jour, du moins sous OllyDbg, ce qui fait que le code semble ne pas
avoir t dsassembl.

Remde : le dcryptage s'effectue "secrtement" juste aprs l'instruction POPFW,
situe quelque part dans le code poubelle. La routine se trouve en 40169C.
C'est l que j'ai appliqu une mthode plutt bourrin, mais qui est tout  fait
valable.
Le code crypt ne faisant que 0x90 bytes, j'ai fait un dump de la routine de
validation (une fois dcrypte), puis je l'ai rinjecte "en dur" dans le
crackme. Cela correspond aux fichiers "dump.bin" et
"crackmefinalversion.decrypted.exe". Attention cependant, il faut patcher le
code en 401438 pour que le flag de dcryptage soit initialement mis  1 (afin
que la routine ne rencode pas la procdure, ce qui ferait planter le programme).
Il ne reste plus qu' relancer le crackme, puis de rentrer dans le "CALL EBX".
Maitenant c'est ok, on peut voir comment le serial est vrifi !

II. Serial
--------------------------------------------------------------------------------
La routine de validation est trs simple, donc nous n'allons pas l'tudier en
profondeur. En gros, le nom et le serial sont encods avec un cryptage simple
(multiplication des caractres par une constante pour le nom, ou exclusif et
rotation de bits  gauche pour le serial), puis une comparaison est effectue...

Pour inverser cela, il suffit d'encoder le nom, puis d'effectuer le cryptage
oppos  celui employ pour le serial... (ror + xor). Je ne vais pas dtailler
ceci puisque la source du keygen est faite pour a !

 titre d'information, j'ai eu quelques difficults pour raliser le keygen,
notamment en ce qui concerne les overflows de buffers (pour des noms de 31
caractres). Je me suis rendu compte que le crackme possdait un petit bug car
pour un nom de 31 caractres, il prend un serial de 31 caractres galement
alors que celui-ci en fait 32 en ralit... Cela m'a quand mme laiss coinc
pendant plus d'une demi-heure !
D'autre part, j'ai t un peu du par les serials puisque ceux-ci sont composs
de caractres non alphanumriques, et pour certaines combinaisons il est tout
simplement impossible de copier le tout dans le presse-papier.

Je vais quand mme donner un exemple de serial valide :

Canterwood
\)T[/

Essayez et vous verrez que le crackme passe en mode enregistr !

Conclusion
--------------------------------------------------------------------------------
Ce trial tait intrssant, bien qu'il soit plutt facile et assez rapide 
tudier.  titre de comparaison, j'avais mis une semaine entire pour russir
celui de l'ICI, mais le challenge tait diffrent et il faut dire que je
dbutais. J'avais fait un tut de 13 pages  l'poque...