WINZIP 7.00 SR-1 / Version US

HTTP://WWW.WINZIP.COM

OUTILS: Soft-Ice, Editeur HΘxadΘcimal

TAILLE PRG:  922 Ko

DATE PRG:  16/10/98


         Voici le crack de la derniΦre version de Winzip (α ce jour), la version 7.0. Il semblerait que les programmeurs ne se soient pas pris la tΩte au niveau de la routine de protection, car en fait il s'agit de la mΩme que dans la version 6.3. Seules quelques subtilitΘs changent au niveau de l'endroit o∙ sont stockΘes les donnΘes. Mais nous verrons cela un peu plus tard...

Bon, tout d'abord on installe le logiciel. On le lance pour voir de quoi τα cause... En fait, quand on lance winzip, il y a un Θcran qui nous demande si on a bien compris ce que voulait dire le mot SHAREWARE....

Petit indice qui attire notre attention: le logiciel enregistrΘ ne prΘsente pas cet Θcran. Donc...quand le logiciel affiche cet Θcran cela veut dire qu'il a dΘjα fait la vΘrification si le logiciel est enregistrΘ ou pas. Logique.

Bon, on clique sur "I AGREE". Un petit mot dans le titre de la fenΩtre est des plus dΘplacΘ:
"WINZIP (Unregistered)" Bon, on va chercher s'il est possible de s'enregistrer α partir du programme, donc on regarde dans le menu HELP, puis dans ABOUT WINZIP.

Lα, dans un cadre, il est clairement dit que le logiciel dans l'Θtat actuel des choses n'est pas enregistrΘ. De plus il y a un boutton qui permet d'entrer son code pour s'enregistrer, donc on clique sur REGISTER.

Petit Θcran qui nous demande notre NOM et SERIAL. Bon, alors on lance Soft-Ice, puis on place des breakpoints sur GetDlgItemTexta et GetMessageA qui sont des API pour rΘcupΘrer du texte α partir d'une fenΩtre. Ce sont les plus utilisΘes, enfin il faut espΘrer....

On tape quelque chose, histoire d'Θviter toutes les routines qui testent si quelque chose a ΘtΘ tapΘ. On clique sur OK, et Hop! Soft-Ice apparait...C'est kool...on va pouvoir regarder ce qu'il se passe, F11 pour voir d'o∙ l'API a ΘtΘ appellΘe...on arrive la dessus:

:00408036  FF150C844600 Call USER32.GetDlgItemTextA  
:0040803C  56 push esi <-on arrive ici
:0040803D  E800160200 call 00429642 <-1er CALL
:00408042  59 pop ecx  
:00408043  56 push esi  
:00408044  E822160200 call 0042966B <-2eme CALL
:00408049  803D18D9470000 cmp byte ptr [0047D918], 00 <-1er CMP
:00408050  59 pop ecx  
:00408051  745F jz 004080B2  
:00408053  803D48D9470000 cmp byte ptr [0047D948], 00 <-2eme CMP
:0040805A  7456 jz 004080B2  
:0040805C  E8EAFAFFFF call 00407B4B <-3eme CALL
:00408061  85C0 test eax, eax  
:00408063  744D jz 004080B2  

Bon, alors...qu'est ce qui est intΘressant ici??? AprΦs l'API GetDlgItemTextA, il y a 3 CALL, 2 CMP avec des sauts conditionnels juste en-dessous. Et enfin un petit TEST EAX,EAX avec encore un autre saut conditionnel. Autre remarque: tous les sauts conditionnels pointent vers la mΩme adresse...

Bon, on va essayer de changer le chemin du premier saut conditionnel, comme ca pour voir ce qui se passe si un des sauts prend ce chemin... Donc quand on arrive sur le JE, on tape r fl z (pour changer l'Θtat du flag zero qui est utilisΘ par JZ) on relance et lα il y a un message qui nous indique que ce qu'on a entrΘ est invalide...

DONC!!! tous les sauts conditionnels pointent vers la mauvaise adresse!!! Bon, on refait une tentative. Mais cette fois ci on fait du step-by-step avec F10, et on remarque que mΩme avec un NOM et un SERIAL bidon, les 2 premiers sauts conditionnels ne sont pas pris... ce qui n'est pas le cas du 3eme. C'est donc que c'est le 3eme saut qu'il va falloir changer. On le change en un JNZ puis on relance...Et HOP! un petit message nous indique que le logiciel est enregistrΘ avec notre NOM et SERIAL. On clique sur OK, mais lα grosse dΘception, car le texte au milieu du cadre nous indique toujours que le logiciel est en version UNREGISTERED... :(

Mais.... il y a du changement, il n'y a plus (Unregistered) dans le titre de la fenΩtre... On ressort et on relance, le nagscreen est toujours lα, mais (Unregistered) ne l'est plus.
C'est donc que le prog a Θcrit quelque chose quelque part pour lui indiquer que le logiciel a ΘtΘ enregistrΘ partiellement (puisqu'il affiche toujours l'Θcran et quand on fait ABOUT il est toujours Unregisted).
On regarde dans le rΘpertoire o∙ le logiciel a ΘtΘ installΘ, pas de fichier .INI, on regarde dans le rΘpertoire de WINDOW$, pas de WINZIP.INI, dans le fichier WIN.INI il y a une section pour WINZIP, mais il n'y a rien en ce qui concerne le NOM et le SERIAL... Bon, un petit tour dans la base de registre, et lα on tape ou WINZIP, ou le NOM ou SERIAL, et on arrive sur:

Poste de travail/HKEY_CURRENT_USER/Software/Nico Mak Computing/Winzip/Winini

Et lα il y a notre NOM et SERIAL...

On remet τα α zΘro, et on relance Winzip...Et lα le (Unregistered) est rΘapparu dans le titre de la fenΩtre active...

Donc si dans la base de registre NAME et SN sont remplis alors (Unregistered) n'est plus affichΘ. Quelques soient les valeurs.

Bon, mais il reste l'Θcran du dΘpart et le ABOUT...

Retournons dans Soft-Ice pour voir...

On regarde au-dessus du saut conditionnel que l'on a modifiΘ et on y trouve un petit CALL 00407B4B... Il va falloir aller regarder ce CALL de plus prΦs....

De plus, apparement c'est cette routine qui dΘtermine quelque chose d'important au niveau de
l'enregistrement du logiciel (puisqu'en changeant le saut conditionnel d'aprΦs on est presque enregistrΘ). Donc on va placer un breakpoint au tout dΘbut du CALL. Car il faut se rappeler que le logiciel fait un test au lancement de Winzip pour savoir s'il faut afficher le nagscreen ou pas.
Pour tester cela, on place un breakpoint dΦs la premiΦre ligne de code du CALL,
on sort et on relance le prg....

Et lα Soft-Ice rΘapparait!!!! Ce qui veut dire qu'avant d'afficher le nag (vΘrification par F4) le logiciel passe par ce CALL 00407B4B...Hum..cela parait Θtrange non???
Bon, on va STEPPER pour voir ce qui se passe...

Petite remarque:
Il faut que EAX soit diffΘrent de 0 en resortant de la routine...(cf. code ci-dessus)
Et on remarque qu'il n'est pas Θgal α 0 en y rentrant... Donc s'il pouvait y avoir un moyen de le faire ressortir de la routine tout de suite, cela serait kool...

On arrive ici:

:00407B4B  55 push ebp  
:00407B4C  8BEC mov ebp, esp  
:00407B4E  81EC08020000 sub esp, 00000208  
:00407B54  53 push ebx  
:00407B55  56 push esi  
:00407B56  33F6 xor esi, esi  
:00407B58  803D18D9470000 cmp byte ptr [0047D918], 00 <-1er CMP
:00407B5F  57 push edi  
:00407B60  0F84A1000000 je 00407C07 <-petit saut...qui va loin...!

...

:00407C07  33C0 xor eax, eax <-ici
:00407C09  E9B3000000 jmp 00407CC1 <-saut inconditionnel

....

:00407CC1  5F pop edi  
:00407CC2  5E pop esi        
:00407CC3  5B pop ebx  
:00407CC4  C9 leave  
:00407CC5  C3 ret  

Bon...on peut remarquer que le saut conditionnel pointe vers une instruction qui remet α 0 la valeur de EAX...Mais c'est pas ca qu'on veut...
Puis juste aprΦs il y a un saut INconditionnel qui va vers la fin de la routine.

Bon...on sait que EAX n'est pas Θgal α 0 quand il arrive ici, mais qu'en sautant en :00407C07 il est remis α zΘro, puis il y a un JMP qui va α la fin.
Donc si on change le premier saut conditionnel (aprΦs le 1er CMP) en un saut INCONDITIONNEL qui pointrait non pas vers le XOR EAX,EAX mais vers l'instruction d'en-dessous, alors EAX serait inchangΘ (donc pas Θgal α 0) et en plus le prg sauterait tout de suite vers la fin de la routine.

Donc on modifie le JZ 00407C07 en JMP 00407C09...

Mais se pose alors un pb de taille de codage d'instruction:
0F84A1000000 JZ 00407C07 et on remplace par:
E9A4000000 JMP 00407C09

Il faut donc ajouter un octet...Bah on peut ajouter un NOP ou un INC EAX...

On effectue les modifications... puis on relance avec F5...et lα il n'y a plus d'Θcran au dΘbut!!
Bon, premier obstacle ΘliminΘ...

On va dans HELP/ABOUT...on essaye REGISTER...
On sait d'avance que le CALL 00407B4B va Ωtre executΘ...et qu'en plus en sortant du CALL, EAX ne sera pas Θgal α 0...Donc logiquement le logiciel devrait nous montrer le petit message qui nous dit que le logiciel est enregistrΘ (tout comme lorsqu'on avait modifiΘ le saut aprΦs le TEST EAX,EAX qui se trouvait aprΦs le CALL 00407B4B).

Ce que l'on ne sait pas, c'est si en faisant HELP/ABOUT aprΦs s'Ωtre enregistrΘ, le logiciel va continuer α afficher que le logiciel est toujours un shareware...?

Donc...REGISTER, on tape son Pseudo, puis un numΘro de sΘrie bidon...
OK, petit message qui apparait...Puis...Timidement on appuye sur OK...
Et lα...Oh bonheur! Oh joie!...le texte a changΘ...
Et notre pseudo est lα, avec le numΘro de SΘrie..

Il ne reste plus qu'α faire les modifications au niveau du fichier en HEXA...et τa roule tout seul...

Voilα, c'est tout pour WINZIP 7.0...

Par Rapport α la version 6.3:
Comme je le disais au dΘbut de ce texte, il n'y a pas beaucoup de diffΘrences entre les 2 versions. Pour la 6.3, le NOM et le SERIAL Θtaient dans le fichier WIN.INI, et la prΘsence de ces donnΘes avaient le mΩme effet que la prΘsence des donnΘes dans la base de registre pour la version 7.0 (prΘsence de (Unregistered) dans le titre de la fenΩtre).

Sinon le principe du crack est le mΩme: on modifie la routine qui est appelΘe α chaque fois pour vΘrifier que le NOM et le SERIAL sont OK. On fait en sorte qu'en sortant, cette routine retourne une valeur diffΘrente de 0.

Have Phun...
<-[ ALSINDOR ]->

alsindor(arobase)yahoo(point)com