RIF CRACKME nUMBA 4 - Tutorial [fr]
================================================================================
Author        : Canterwood <canterwood@altern.org>
Protection    : anti-patching trick
Level         : Beginner+
Tools         : OllyDbg, MASM32
Attached files: crackme + keygen + source
================================================================================
01.01.2004

Introduction
--------------------------------------------------------------------------------
  J'ai dcid d'crire un tutorial l-dessus, puisque c'est la premire fois que
je teste un crackme du Dr. rED mEAT, hormis le trial du RIF.
Et puis le challenge parat intressant  relever...

Solution
--------------------------------------------------------------------------------
  On lance le crackme avec OllyDbg, puis on pose un breakpoint sur
GetDlgItemTextA ("bpx GetDlgItemTextA" avec le plugin de ligne de commande), on
entre un nom/serial et on clique sur "Do it !".

Le programme breake, on peut voir que des instructions testent la prsence du
nom et du serial, il y a galement un appel  MessageBoxA pour afficher le nag.
Jusque l, rien de bien original.

  On arrive ensuite  un endroit assez particulier :

004015B3  MOV ECX,59
004015B8  XOR EBX,EBX                          ; ebx = 0
004015BA  JMP SHORT rifme4.004015C8
004015BC  /MOVSX EAX,BYTE PTR DS:[ECX+4032D2]
004015C3  |ADD EBX,EAX                         ; ebx += byte constante (?)
004015C5  |XOR EBX,ECX                         ; ebx ^= compteur
004015C7  |DEC ECX
004015C8   OR ECX,ECX
004015CA  \JNZ SHORT rifme4.004015BC
004015CC  JMP SHORT rifme4.004015DA
004015CE  /MOVSX EAX,BYTE PTR DS:[ECX+4032D2]
004015D5  |XOR EBX,EAX                         ; ebx ^= byte constante (?)
004015D7  |XOR EBX,ECX                         ; ebx ^= compteur
004015D9  |INC ECX
004015DA   CMP ECX,59
004015DD  \JNZ SHORT rifme4.004015CE

Nous avons affaire  deux boucles qui semblent calculer une valeur insre dans
le registre ebx, mais quel intert puisque cela semble tre  partir d'une
constante (ebx a donc au final toujours le mme contenu quelque soit les donnes
entres) ?

Dtrompons-nous. Cela est en fait le seul petit pige du crackme, "le
anti-patching trick" que nous avons annonc dans l'intitul de ce tutorial.
En fait, cette fameuse "constante" est une partie du code machine du crackme,
laquelle concerne prcisment la routine de validation !
On peut en effet remarquer, en regardant simplement le listing du proggie ou
alors en posant un memory breakpoint en 4032D2, que la routine est copie dans
un buffer, peu avant l'appel  la procdure de validation du serial.

Tout se droule ici :

004014C6  CALL rifme4.00401000       ; copiage du code de validation
004014CB  PUSH DWORD PTR SS:[EBP+8]
004014CE  CALL rifme4.00401558       ; appel de la routine de vrification
004014D3  PUSH 0
004014D5  PUSH 0
004014D7  CALL <JMP.&KERNEL32.Beep>

Si l'on entre dans le premier call, on peut voir ceci :

00401000  PUSHAD
00401001  LEA ESI,DWORD PTR DS:[40155B]                 ; esi = routine de test
00401007  LEA ECX,DWORD PTR DS:[401641]
0040100D  LEA EDI,DWORD PTR DS:[4032D2]                 ; edi = buffer (4032D2)
00401013  SUB ECX,ESI
00401015  REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]  ; copie la routine
00401017  POPAD
00401018  RETN

OK, cela n'a pas l'air trs parlant expos comme ceci ; mais en fait c'est
extrmement important pour la suite.

En effet, ebx est calcul  partir du contenu du buffer 4032D2, c'est  dire le
code de la procdure de validation.
ebx, nous le verrons aprs, intervient dans la gnration du serial avec le nom.

Imaginons que l'on modifie pour une raison quelconque la routine, par exemple
pour patcher le nag (ce qui est d'ailleurs trs tentant). Eh bien, le patch va
altrer le contenu du buffer, qui va lui-mme changer la valeur de ebx, et au
final, le serial gnr sera faux.
Moralit : il ne faut faire aucun patch, ou alors faire en sorte que ebx ne soit
pas modifi (j prfre de loin la premire solution).

Au dbut, j'avais du mal  saisir cette histoire de routine car j'obtenais des
serials valides lorsque j'tais en session de debugging, mais ce n'tait plus le
cas quand le crackme tournait  vide. Assez surprenant !
Heureusement, il s'agit de la seule difficult  surmonter...

  Passons  la suite,  savoir la gnration du serial. Nous avons ceci :

004015DF  XOR ECX,ECX
004015E1  JMP SHORT rifme4.004015EF
004015E3  /MOVSX EAX,BYTE PTR DS:[ECX+40323C]
004015EA  |SUB EBX,EAX                         ; ebx -= byte nom
004015EC  |ADD EBX,ECX                         ; ebx += compteur
004015EE  |INC ECX
004015EF   OR EAX,EAX
004015F1  \JNZ SHORT rifme4.004015E3
004015F3  XOR EBX,28EBFA5                      ; ebx ^= 28EBFA5h
004015F9  ADD ECX,0A                           ; compteur += 0Ah
004015FC  XOR ECX,EBX                          ; compteur ^= ebx
004015FE  PUSH ECX
004015FF  PUSH EBX
00401600  PUSH rifme4.00403225                 ; |Format = "%lu-1789-%lX-R!F"
00401605  PUSH rifme4.0040326E                 ; |s = rifme4.0040326E
0040160A  CALL <JMP.&USER32.wsprintfA>         ; \wsprintfA

Pour rcaptituler, on ajoute chaque byte du nom  la valeur de ebx calcule
prcdemment (valeur constante, FFFFF800h). Il y a aussi quelques oprations
pour modifier la valeur contenue initialement dans le compteur (ecx), puis le
tout est imprim en clair avec wsprintfA.

  Si l'on rentre le serial, le crackme affiche le message de russite, donc
notre tude s'arrte ici...

Voici un exemple de serial valide :

Canterwood
4252060548-1789-FD714B91-R!F

En ce qui concerne le codage le keygen, on recopie en gros le bout de code vu au
dessus...
Quant au patch, c'est inutile. Il ne nous drange pas tant que a, ce nag ?

Conclusion
--------------------------------------------------------------------------------
  Voil, on en a fini assez rapidement avec ce crackme !
L'intert rside ici dans la petite astuce visant  drouter le crackeur de
base, puisque le rsultat dpend des patchs effectus sur le programme...

================================================================================
Remerciements : tous ceux qui m'ont aid (cf le keygen).
Salutations   : les membres de la scne franaise, mais aussi trangre ! Plus
gnralement,  tous ceux qui contribuent au dveloppement du cracking dans le
monde, et bien videmment  vous, lecteurs !

Canterwood