Programme : RenderSoft Illusionae V2.0 Protection : Numéro de série

Où : Windows News 64 Solution : Calcul du numéro

Niveau : Gentillou Outils : W32dasm, Hiew

Auteur du crack : Votan Date : 23/02/1999

Site perso : http://www.chez.com/shrog

 

INTRODUCTION

Le but du jeu dans ce tut est de trouver le calcul du numéro de série sur le soft Illusionae, un simple générateur de textures.

ETUDE DU PROBLEME

Comme d'hab on installe, on lance et on regarde. Première chose pas de nag-screen ! C'est toujours ça de moins ;-). Bon y a quelques options inutilisables (Save Merged ...). Allons essayer de nous enregistrer.

Surprise, il n'y a pas de message nous disant que notre mot de passe est invalide et il ne ferme même pas la fenêtre d'enregistrement ! On peut remarquer aussi que quoiqu'on rentre il n'y a aucun message (des chiffres dans le nom , pas de nom, pas de numéro de série etc...).

 

POINT D'ENTREE

Etant donné que l'on ne dispose pas de message d'erreur, on va prendre le problème à l'envers. La moindre des choses quand on créé un soft à but lucratif, c'est de remercier l'utilisateur qui a acheté la licence. Donc avant de procéder à une série de BP sous softice et autres recherches de string référence à tâton, je regarde s'il n'y a pas de messages de remerciements ou autres confirmations comme quoi on est bien enregistré. Donc on fait un find de mot comme "Thank you", "Succesful" .... Je sais c'est peut être au petit bonheur la chance, mais si ca peut m'éviter une série de BP sous SI, c'est tant mieux !

On s'aperçoit que c'est payant puisque on trouve la superbe phrase :

* Possible StringData Ref from Data Obj ->"Thank you for registering RenderSoft "

->"Illusionae."

 

ETUDE DU PROGRAMME

Maintenant qu'on a un point d'entrée, regardons grossièrement ce qui entoure cette phrase

* Possible StringData Ref from Data Obj ->"Error"

|

:00408294 6884E24800 push 0048E284

* Possible StringData Ref from Data Obj ->"Cannot get windows directory to "

->"write registration information!"

|

../..

:004082BE 52 push edx

:004082BF 889C2478010000 mov byte ptr [esp+00000178], bl

:004082C6 E8AC840500 call 00460777

:004082CB 8D442414 lea eax, dword ptr [esp+14]

* Possible StringData Ref from Data Obj ->"\RSILLUNA.INI"

|

:004082CF 68B4E34800 push 0048E3B4

:004082D4 8D4C241C lea ecx, dword ptr [esp+1C]

:00408319 6A30 push 00000030

../..

* Possible StringData Ref from Data Obj ->"Error"

|

:0040831B 6884E24800 push 0048E284

* Possible StringData Ref from Data Obj ->"Cannot open file to write registration "

->"information!"

|

../..

* Possible StringData Ref from Data Obj ->"Note"

|

:00408395 6800E34800 push 0048E300

* Possible StringData Ref from Data Obj ->"Thank you for registering RenderSoft "

->"Illusionae."

|

On ne peut pas faire plus clair !! On voit bien que si le sérial est bon, il l'écrit dans le fichier RSILLUNA.INI .

On pourrait donc entrevoir comme patch de lui faire croire que le fichier RSILLUNA.INI contient le bon sérial. Mais ici, il y a quelque chose de plus simple et plus marrant !

ETUDE DU SERIAL

Remontons encore un peu pour voir qui appelle la procédure d'écriture dans le ini

:00408258 8A4C2426 mov cl, byte ptr [esp+26]

:0040825C 80F974 cmp cl, 74 Tiens ?

:0040825F 7407 je 00408268

:00408261 80F954 cmp cl, 54 Re-Tiens (la nuit ;-)

:00408264 7402 je 00408268

:00408266 8BC3 mov eax, ebx Cool ..

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:

|:0040825F(C), :00408264(C)

|

:00408268 85C0 test eax, eax Le sérial est il bon ?

:0040826A 0F854C010000 jne 004083BC Sinon au revoir

:00408270 8D8C24A4000000 lea ecx, dword ptr [esp+000000A4]

:00408277 68C8000000 push 000000C8

:0040827C 51 push ecx

:0040827D A348EA4800 mov dword ptr [0048EA48], eax

:00408282 891DB8F96000 mov dword ptr [0060F9B8], ebx

* Reference To: KERNEL32.GetWindowsDirectoryA, Ord:0151h

|

:00408288 FF15284A6100 Call dword ptr [00614A28]

:0040828E 85C0 test eax, eax

:00408290 7518 jne 004082AA

:00408292 6A30 push 00000030

* Possible StringData Ref from Data Obj ->"Error"

|

:00408294 6884E24800 push 0048E284

* Possible StringData Ref from Data Obj ->"Cannot get windows directory to "

->"write registration information!"

Décidement on croirait qu'ils ont écrit ce soft pour un tut sur le cracking !! En clair on voit que le

test eax, eax conditionne la suite des évenements, qu'il n'est même pas le résultat d'un call mais d'un mov de la valeur ebx dans eax au cas ou les deux cmp auraient échoué !! Si vous avez lu les tuts du dernier défi de la Main Rouge (entre autres ceux de Psyché et Simon-Tête-Creuse) la séquence suivante devrait vous dire quelque chose :

:00408258 8A4C2426 mov cl, byte ptr [esp+26] Charge le caractère pointé par [esp+26] dans cl :0040825C 80F974 cmp cl, 74 Compare la valeur hexa du caractère avec 74

:0040825F 7407 je 00408268 Si ok va en 00408268h

:00408261 80F954 cmp cl, 54 Sinon deuxième chance

:00408264 7402 je 00408268 Si ok va en 00408268h

:00408266 8BC3 mov eax, ebx Sinon bouge ebx dans eax

Donc il prend le caractère pointé par [esp+26] et compare sa valeur hexa avec soit 74 soit 54.

Petit rappel : pour savoir à quel caractère correspond la valeur 74h il suffit de la convertir en décimal, soit 74h -> 116d et ensuite de prendre un table ASCII pour voir le caractère associé (ou ds une fenêtre DOS en maintenant la touche ALT enfoncée et en tapant 116, lorsque vous relâchez ALT il affiche le caractère). Ici 116d correspond à "t". Idem pour 54 : 54h -> 84d -> T.

Bilan il compare si le caractère est un "t" (74h) ou un "T"(54h).

 

CALCUL DU SERIAL

Bien que calcul soit un bien grand mot !

Reprenons l'ensemble de la procédure de vérification du sérial en remontant encore un peu plus :

:004081F6 BB01000000 mov ebx, 00000001 On range la valeur 1 dans ebx

:004081FB 8BC1 mov eax, ecx

:004081FD 8BF7 mov esi, edi

:004081FF 8BFA mov edi, edx

:00408201 C1E902 shr ecx, 02

:00408204 F3 repz

:00408205 A5 movsd

:00408206 8BC8 mov ecx, eax

:00408208 33C0 xor eax, eax eax=0

:0040820A 83E103 and ecx, 00000003

:0040820D F3 repz

:0040820E A4 movsb

:0040820F 8A4C241C mov cl, byte ptr [esp+1C] On range dans cl la valeur hexa du 1 caractere

:00408213 80F972 cmp cl, 72 C'est un r ?

:00408216 7407 je 0040821F

:00408218 80F952 cmp cl, 52 Ou un R ?

:0040821B 7402 je 0040821F

:0040821D 8BC3 mov eax, ebx Sinon eax=1

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:

|:00408216(C), :0040821B(C)

|

:0040821F 8A4C241D mov cl, byte ptr [esp+1D] Deuxième caractère

:00408223 80F973 cmp cl, 73 s?

:00408226 7407 je 0040822F

:00408228 80F953 cmp cl, 53 S?

:0040822B 7402 je 0040822F

:0040822D 8BC3 mov eax, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:

|:00408226(C), :0040822B(C)

|

:0040822F 8A4C241E mov cl, byte ptr [esp+1E] Troisième caractère

:00408233 80F969 cmp cl, 69 i?

:00408236 7407 je 0040823F

:00408238 80F949 cmp cl, 49 I?

:0040823B 7402 je 0040823F

:0040823D 8BC3 mov eax, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:

|:00408236(C), :0040823B(C)

|

:0040823F 807C242130 cmp byte ptr [esp+21], 30 Sixième caractère= 0 ?

:00408244 7402 je 00408248

:00408246 8BC3 mov eax, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:00408244(C)

|

:00408248 8A4C2424 mov cl, byte ptr [esp+24] Neuvième caractère

:0040824C 80F972 cmp cl, 72 r?

:0040824F 7407 je 00408258

:00408251 80F952 cmp cl, 52 R?

:00408254 7402 je 00408258

:00408256 8BC3 mov eax, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:

|:0040824F(C), :00408254(C)

|

:00408258 8A4C2426 mov cl, byte ptr [esp+26] Onzième caractère

:0040825C 80F974 cmp cl, 74 t?

:0040825F 7407 je 00408268

:00408261 80F954 cmp cl, 54 T?

:00408264 7402 je 00408268

:00408266 8BC3 mov eax, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:

|:0040825F(C), :00408264(C)

|

:00408268 85C0 test eax, eax Si tout est Ok eax=0

:0040826A 0F854C010000 jne 004083BC

:00408270 8D8C24A4000000 lea ecx, dword ptr [esp+000000A4]

:00408277 68C8000000 push 000000C8

 

Donc en résumé le numéro de série est de la forme RSIxx0xxRxT (ou avec des minuscules)

Le plus marrant c'est que sur 11 caractères il y en 6 qui sont "donnés", et que les autres ne font même pas l'objet d'un quelconque calcul de recoupement. De plus à quoi sert le Nom puisqu'il n'intervient pas dans le sérial !!

 

EN CONCLUSION

Rendersoft nous a conconcté un soft idéal pour un tut puisque :

* Il n'effectue pas de calcul du serial en fonction du nom

* Il ne fait que vérifier la présence de certains caractères à des places précises sans se préoccuper des autres caractères !

* Il simplifie la compréhension en ayant une procédure en ligne sans faire des jmp ou call dans tout les sens.

* J'ai réussi à comprendre ;-)

 

Pour un peu on leur enverrait des remerciements !!

Voilà j'espère ne pas avoir dit trop de conneries, sinon je compte sur vous pour me corriger ( le tut, pas moi ;-).

 

Votan

votan@club-internet.fr

http://www.chez.com/shrog