|
Have Phun...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.