RESTORATOR 2.00 (2.01)
 
(La version 2.01 etant sortie et le schema de protection etant exactement le meme il est inutile de refaire un tut dessus donc aidez vous de celui ci pour cracker la version 2.01, c'est exactement la meme demarche :)

Outils :

                    - Sice 3.xx
                    - W32dasm 8.93 (en tout cas c'est celle qu j'ai utilisé)
                    - et un éditeur héxa

Date :

                    04.03.1999

Protections du prog :

                                - Limitation à 30 jours d'utilisation.
                                - Le nag "shareware reminder" (c'est pas une protection mais ca nous fait chier quand meme)
 

Salut a tous,

Comme je viens de l'ecrire, ce soft est limité a 30 jours d'utilisation apres quoi vous ne verez plus que le nag "shareware reminder" qui vous laissera le choix entre soit vous enregistrer (la blague !) ou soit ... bah rien du tout :(

Avant de s'attaquer au nag, on va d'abord virer la limitation des 30 jours. Pour ce la j'ai utilisé l'API :

GetLocalTime

qui recupere la date et l'heure courante.
On pose, dans sice, un bpx GetLocaTime et on regarde ce qui se passe : on observera qu'on break seulement deux fois. On laisse passer le premier break et dès qu'on a la main ss sice avec le second break on tape F11 (backtrace) et on se retrouve a l'instruction qui suit l'appel de l'API. On trace un peu, on sort de quelques routines (plusieurs 'ret'...) et on se retrouve la:

:0047E11D 55                      push ebp
:0047E11E 68B1E44700              push 0047E4B1
:0047E123 64FF30                  push dword ptr fs:[eax]
:0047E126 648920                  mov dword ptr fs:[eax], esp
:0047E129 B043                    mov al, 43
:0047E12B E888F5FEFF              call 0046D6B8
:0047E130 8945DC                  mov dword ptr [ebp-24], eax
:0047E133 E804F5FEFF              call 0046D63C
:0047E138 DD5DE8                  fstp qword ptr [ebp-18]
:0047E13B 9B                      wait
:0047E13C BA00000080              mov edx, 80000000                        << on se retrouve qqpart par la je crois !
:0047E141 8B45E0                  mov eax, dword ptr [ebp-20]
:0047E144 E8D7D3FEFF              call 0046B520
:0047E149 8D4DBC                  lea ecx, dword ptr [ebp-44]
:0047E14C B894394A00              mov eax, 004A3994
:0047E151 BA3B000000              mov edx, 0000003B
:0047E156 E85DFAFFFF              call 0047DBB8
:0047E15B 8B55BC                  mov edx, dword ptr [ebp-44]
:0047E15E 8B45E0                  mov eax, dword ptr [ebp-20]
:0047E161 E8D2DDFEFF              call 0046BF38                            << et la qq c'est ???
:0047E166 84C0                    test al, al                                                << il y a un test, bizarre !
:0047E168 0F8495020000            je 0047E403                                << et la il y a un saut qui nous fait sauter une bonne partie de code si eax=0
:0047E16E 33C0                    xor eax, eax
:0047E170 55                      push ebp
:0047E171 68F9E34700              push 0047E3F9
:0047E176 64FF30                  push dword ptr fs:[eax]
:0047E179 648920                  mov dword ptr fs:[eax], esp
:0047E17C 8D4DBC                  lea ecx, dword ptr [ebp-44]
:0047E17F B894394A00              mov eax, 004A3994
:0047E184 BA3B000000              mov edx, 0000003B
:0047E189 E82AFAFFFF              call 0047DBB8

On va tout de suite aller regarder ce qui se passe dans le call 0046bf38

* Referenced by a CALL at Addresses:
|:0047E161   , :0049816A   , :0049817B                                   << on voit qu'il y a plusieurs appels
|
:0046BF38 53                      push ebx
:0046BF39 E83AFFFFFF              call 0046BE78                    << verification dans la base de registre
:0046BF3E 8BD8                    mov ebx, eax
:0046BF40 85DB                    test ebx, ebx
:0046BF42 7406                    je 0046BF4A
:0046BF44 53                      push ebx

* Reference To: advapi32.RegCloseKey, Ord:0000h
                                  |
:0046BF45 E8FA96F9FF              Call 00405644                << si on la fere c'est qu'on la ouverte... je vais expliquer tout ca apres

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046BF42(C)
|
:0046BF4A 85DB                    test ebx, ebx
:0046BF4C 0F95C0                  setne al                                << et c'est la que tout se joue
:0046BF4F 5B                      pop ebx
:0046BF50 C3                      ret

L'idée c'est que eax (ou mieux al car c'est al qui est testé en sorti de cette fonction) soit a 0 pour que le test soit toujours vrai et donc que le saut se fasse tout le temps.
On va donc patcher en 0046bf4c et on obtient :

:0046BF4A 85DB                    test ebx, ebx
:0046BF4C 90                     nop
!0046BF4D 95C0                  xor al,al                                << al=0
:0046BF4F 5B                      pop ebx
:0046BF50 C3                      ret

Voici maintenant les explications :

Quand le programme arrive dans la fonction qui est juste au dessus cette partie de code se charge de chercher a l'aide de la base de registre si le soft a deja ete lance une fois, si oui il retourna 1 dans al pour dire que ce n'est pas la premiere fois que le prog est executé . Je n'ai pas creusé pour savoir si il recupere la date au meme moment ou si il le fait apres... a voir mais je ne pense pas , on va voir pourquoi.

Donx en retour al=0 et on jump en 0047E403 sinon on continu et je pense que c'est dans cette partie de code que le prog recupere la date et la calcule par rapport a la date courante pour savoir si on a depassé les 30 jours. je dis ca car plus loin en 0047E3F7 il y a un jmp 0047E403 et donc je pense que quand on arrive a celui ci c'est qu'on est dans la periode des 30 jours d'utilisation. (calcul des dates .....)

Donc le patch (al=0) va faire que a chaque fois qu'on lancera le programme il croira que c'est le premier jour d'utilisation du prog.

La limitation n'etant plus attaquons nous a ce *#&@'$% de nag qui nous emmerde car en plus il faut attendre pour avoir le droit d'appuyer sur ok ou cancel :(

On desassemble le prog avec w32dasm et cherche dans les strings ce qui pourrais nous interresse et on trouve le titre de la fenetre "shareware reminder" et cool pour nous il n'y a qu'nue seule occurrence a cette string : qu'est ce qu'on  attend  on y va !

* Referenced by a CALL at Address:
|:00496695                                                                       << un seul appel
|
:0049651C 55                      push ebp
:0049651D 8BEC                    mov ebp, esp
:0049651F 83C4F4                  add esp, FFFFFFF4
:00496522 53                      push ebx
:00496523 56                      push esi
:00496524 33C9                    xor ecx, ecx
:00496526 894DFC                  mov dword ptr [ebp-04], ecx
:00496529 8BDA                    mov ebx, edx
:0049652B 8BF0                    mov esi, eax
:0049652D 33C0                    xor eax, eax
:0049652F 55                      push ebp
:00496530 68FA654900              push 004965FA
:00496535 64FF30                  push dword ptr fs:[eax]
:00496538 648920                  mov dword ptr fs:[eax], esp

* Possible StringData Ref from Code Obj ->"Shareware Reminder"
                                  |
:0049653B BA10664900              mov edx, 00496610
:00496540 8BC6                    mov eax, esi
:00496542 E8F18FF8FF              call 0041F538
:00496547 8D4DFC                  lea ecx, dword ptr [ebp-04]
:0049654A B8A03E4A00              mov eax, 004A3EA0
:0049654F BA24000000              mov edx, 00000024
:00496554 E87FFFFFFF              call 004964D8

Cette routine ne nous interesse pas car ce sont juste les info que contient la boite de dialogue "shareware reminder".
On va alors a l'appel de la fonction.

* Referenced by a CALL at Address:
|:0049A5C0
|
:00496690 53                      push ebx
:00496691 8BD8                    mov ebx, eax
:00496693 8BC3                    mov eax, ebx
:00496695 E882FEFFFF              call 0049651C                    << ca c'est l'appel mais pas l'affichage :(
:0049669A 33D2                    xor edx, edx
:0049669C 8B83DC010000            mov eax, dword ptr [ebx+000001DC]
:004966A2 E8F98DF8FF              call 0041F4A0
:004966A7 33D2                    xor edx, edx
:004966A9 8B83E0010000            mov eax, dword ptr [ebx+000001E0]
:004966AF E8EC8DF8FF              call 0041F4A0
:004966B4 8A15E0664900            mov dl, byte ptr [004966E0]
:004966BA F7D2                    not edx
:004966BC 229334010000            and dl, byte ptr [ebx+00000134]
:004966C2 8BC3                    mov eax, ebx
:004966C4 E8CF52F9FF              call 0042B998

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00496662(C)
|
:004966C9 B201                    mov dl, 01
:004966CB 8B8340020000            mov eax, dword ptr [ebx+00000240]
:004966D1 E8BA40FAFF              call 0043A790
:004966D6 8BC3                    mov eax, ebx
:004966D8 E88374F9FF              call 0042DB60                << l'affichage se trouve ici
:004966DD 5B                      pop ebx
:004966DE C3                      ret

Si on trace a partir de 00496695 on verra bien que l'affichage ne se fait qu'avec l'appel en 0042DB60.
On va tout simplement patcher en noppant l'appel on obtient :

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00496662(C)
|
:004966C9 B201                    mov dl, 01
:004966CB 8B8340020000            mov eax, dword ptr [ebx+00000240]
:004966D1 E8BA40FAFF              call 0043A790
:004966D6 8BC3                    mov eax, ebx
:004966D8 90                        nop
:004966D9 90                        nop
:004966DA 90                        nop
:004966DB 90                    nop
:004966DC 90                    nop
:004966DD 5B                      pop ebx
:004966DE C3                      ret

Voila c'est tout et vous voila avec une version non limité.
Si vous voulez voir autre chose que "unregistered version" dans l'image "about" qui apparait notament a chaque execution du prog allez faire un tour en 0x9850C dans le fichier restorator.exe avec un editeur hexa ... j'ai pas besoin de vous expliquer la suite.

Si vous quelque suggestion que ce soit ou des problemes car vous ne comprenez pas ce que j'ai ecrit ( ou voir meme des amelioration sur mon crack) dites le moi.

By Elraizer 1999
Elraizer@cryogen.com