The Ultimate Tutorial sur Get Right 3.xx

By Nody

Intro.  

 

Logiciel : HeadLight Get Right 3.xx (la 3.3 est utilisΘe pour ce tutorial)

Source : Beaucoup de mag. rΘcents dans le rΘpertoire 'tools'

Outils : W32Dasm, Soft-Ice et un Θditeur hexa (RegMonitor si possible)

Commentaires :

Get Right est un logiciel sympa pour tΘlΘcharger des fichiers et il permet en autres de rΘcupΘrer des tΘlΘchargements perturbΘs par les Θternelles dΘconnexions de Windows.

 

Le Crack.

 

D'abord armez-vous de patience, ce tut. est trΦs long.

 

"PrΘliminaires"

 

Get Right possΦde pas mal de signes distinctifs montrant qu'il est un shareware :

    - limitΘ dans le temps

    - plein de "Buy GetRight"

    - certaines limitations comme le nombre de serveurs, etc .....

 

C'est d'ailleurs par celle-ci que nous allons commencer :

(Commencez par dΘsassembler getright.exe, on en aura besoin plus tard)

DΘmarrez GR (GetRight), puis Edit/Configuration puis cliquez sur l'onglet Login. Ajoutez un nom de serveur et cliquez sur Add. RΘessayez ..... ah une petite MessageBoxA qui se pointe "Sorry, you must be a registered GetRight user etc ....".

Sous W32Dasm, cherchez dans les Strings Data RΘf. ce message. Comme il y en a plusieurs, je vous donne la soluce : c'est en 0040BF57 et τa donne :

 

 

:0040BF4B  call 0043C7D5

:0040BF50  test eax, eax

:0040BF52  jne 0040BF87

:0040BF54  push 00000024

:0040BF56  push eax

* Possible Reference to String Resource ID=00340: "Sorry, you must be a registered GetRight user to have more t"

|

:0040BF57  push 00000154

:0040BF5C  push edi

 

Ce qu'il y a de magic, c'est qu'un saut conditionnel en 40BF52 nous permet de passer au-dessus de ce message. La condition de ce saut est "saute si eax <> 0". Et un juste avant il y a un call, hmmm...Θtrange, quelque chose me dit que ce call dit si on est des utilisateurs enregistrΘs ou non ...

 

1Φre Etape  (crack brutal pour dΘbutants)

 

Dans cette 1Φre Θtape, on va cracker GR de maniΦre (trΦs) brutale.

Voici le dΘbut du call :

 

* Referenced by a CALL at Addresses:

|:00401621 , :00401CEC , :00407339 , :004087D7 , :0040BF4B

|:0040FFFE , :004176BF , :004180AC , :00419247 , :0041C063

|:0042787E , :0042914D , :00429816 , :00429CA4 , :00429EBA

|:0042C9F9 , :0042DBEE , :00431018 , :00433674 , :00434049

|:004410D6 , :004424E3 , :00452036 , :004521BD , :00453E8C

|:004588E9 , :004631B6 , :004667B5

|

:0043C7D5  push ebp

:0043C7D6  mov ebp, esp

:0043C7D8  sub esp, 00000014

:0043C7DB  push ebx

:0043C7DC  push edi

* Possible Reference to Menu: MenuID_0001

|

:0043C7DD  push 00000001

:0043C7DF  mov ebx, ecx

:0043C7E1  pop edi

:0043C7E2  mov dword ptr [ebp-08], edi

:0043C7E5  call 0047BB32

:0043C7EA  mov ecx, ebx

:0043C7EC  call 0047BAE9

:0043C7F1  mov eax, dword ptr [ebx]

:0043C7F3  cmp dword ptr [eax-08], 0000000C

:0043C7F7  je 0043C800

:0043C7F9  xor eax, eax

:0043C7FB  jmp 0043CCD9

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

|:0043C7F7(C)

|

:0043C800  push esi

:0043C801  push edi

 

PrΘcΘdement, on a vu que eax devait Ωtre diffΘrent de 0. Or ici, on a un xor eax, eax en 0043C7F9 (ie eax = 0) donc eax est remis α 0. Transformer un coup le je (en 0043C7F7) par un jmp (74 α remplacer par EB en hΘxa.).

Mouais, τa marche pas (on verra pourquoi plus tard). Essayez autre chose : remplacez le xor eax, eax par nop nop (hΘxa : 33C0 par 9090) de telle maniΦre que eax ne soit pas rΘ-initialisΘ. Ouais, τa marche !! Ah merde, une MessageBoxA nous dit  "GR : divide by zero error." et τa plante. C'est marrant τa, un programme comme GR qui possΦde ses propres messages d'erreur "divide by zero" !! On est plut⌠t habituΘ α la boεte de dialogue Windows... Ne vous inquiΘtez pas, ce ne sont pas de vrais messages d'erreur, ils sont uniquement destinΘs α stopper le jeune cracker, apeurΘ par ces messages α 2F. D'ailleurs, ces messages, on les retrouve dans les String Datas RΘf. comme par exemple celui-lα :

 

 

:0040FFFE  call 0043C7D5        ; τa ne vous dit rien ??

:00410003  test eax, eax

:00410005  je 0041001D             ; et hop je saute au-dessus du messsage                                     ;      d'erreur

* Possible Reference to String Resource ID=00255: "Set Pr&iority"

|

:00410007  push FFFFFFFF

:00410009  push edi

* Possible Reference to String Resource ID=00406: "GR: Divide by zero error."

|

:0041000A  push 00000196

:0041000F  call 00489AC9                     ; appel du fake message

* Possible Reference to Menu: MenuID_0005

|

:00410014  push 00000005

:00410016  xor ecx, ecx

:00410018  call 00481139

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

|:00410005(C)

|

:0041001D  add esi, 00000098

:00410023  push esi

 

Tiens c'est marrant qu'il appelle la routine de vΘrification du RegCode (0043C7D5), avant un message d'erreur...

Pour cracker (brutalement) GR, il suffit de :

    1) Modifier la routine de  vΘrif' pour que eax soit diffΘrent de 0

    2) Changer les je en jmp pour ne pas voir les messages "divide by zero error"

 

C'est α dire :

1) on l'a dΘjα fait ici.

2) Vous devez alors repΘrer chaque "GR : divide by zero error " dans le code ASM avec W32Dasm. Pour cela, prenez la routine de vΘrif' (0043C7D5) et repΘrez chaque adresse qui l'appelle, allez α ces adresses, vΘrifiez qu'il y a une String Data RΘf. "GR : divide by zero error" et changez le je en jmp !

Routine de vΘrif' :

 

* Referenced by a CALL at Addresses:

|:00401621 , :00401CEC , :00407339 , :004087D7 , :0040BF4B

|:0040FFFE , :004176BF , :004180AC , :00419247 , :0041C063

|:0042787E , :0042914D , :00429816 , :00429CA4 , :00429EBA

|:0042C9F9 , :0042DBEE , :00431018 , :00433674 , :00434049

|:004410D6 , :004424E3 , :00452036 , :004521BD , :00453E8C

|:004588E9 , :004631B6 , :004667B5

|

 

Ouaou ! Il y a quand mΩme 25 adresses α vΘrifier, bon courage !!!

Pour ceux qui veulent un crack d'un niveau supΘrieur et/ou ceux qui ont la flemme de vΘrifier 25 adresses et de virer 10 je en jmp, voici la :

 

2Φme Θtape  (crack un p'tit mieux pour les moins dΘbutants)

 

Vous aurez absolument besoin de Soft Ice dans cette partie.

On va faire une simple analyse du code assembleur de la routine de vΘrif' et crΘer notre propre clΘ d'enregistrement (et mΩme un gΘnΘrateur de clΘs).

Tout d'abord, quitter entiΦrement GR (ie virez le mΩme de la barre des tΓches) puis dΘmarrez Reg Monitor (sur le site de Frog's Print) et enfin redΘmarrez GR. Une fois fait, arrΩtez le "Capture Events" de Reg Monitor et analysez les appels faits α la Base de Registre par GR. Une trΦs intΘressante : HKEY_CURRENT_USER/Software/Headlight/GetRight/Config/RegsitrationCode et juste devant celle-ci on a le texte NOT FOUND => commencer par crΘer cette clΘ et affectez lui la valeur que vous voulez (123456).

Bon, on va changer de registre (petit jeu de mots merdique, excusez-moi ...)

Appel de la routine de vΘrif' :

 

:0040FFEA  push 004D413C

:0040FFEF  push eax

:0040FFF0  mov dword ptr [ebp-04], edi

:0040FFF3  call 0047BA8D        (1)

:0040FFF8  add esp, 0000000C

:0040FFFB  lea ecx, dword ptr [ebp-10]

:0040FFFE    call 0043C7D5

 

(1)  D'aprΦs Soft Ice, aprΦs ce call, on retrouve notre RegCode (123456) dans ecx. D'ailleurs, en 0040FFFB, on fait pointer ecx sur notre RegCode, et cela juste avant d'appeler la routine de vΘrification.

D'ailleurs, accrochez vous bien, la voici dans presque son intΘgritΘ :

 

 

* Referenced by a CALL at Addresses:

|:00401621 , :00401CEC , :00407339 , :004087D7 , :0040BF4B

|:0040FFFE , :004176BF , :004180AC , :00419247 , :0041C063

|:0042787E , :0042914D , :00429816 , :00429CA4 , :00429EBA

|:0042C9F9 , :0042DBEE , :00431018 , :00433674 , :00434049

|:004410D6 , :004424E3 , :00452036 , :004521BD , :00453E8C

|:004588E9 , :004631B6 , :004667B5

|

:0043C7D5  push ebp

:0043C7D6  mov ebp, esp

:0043C7D8  sub esp, 00000014

:0043C7DB  push ebx

:0043C7DC  push edi

* Possible Reference to Menu: MenuID_0001

|

:0043C7DD  push 00000001

:0043C7DF  mov ebx, ecx

:0043C7E1  pop edi

:0043C7E2  mov dword ptr [ebp-08], edi

:0043C7E5  call 0047BB32

:0043C7EA  mov ecx, ebx

:0043C7EC  call 0047BAE9

:0043C7F1  mov eax, dword ptr [ebx]

:0043C7F3  cmp dword ptr [eax-08], 0000000C

:0043C7F7  je 0043C800

:0043C7F9  xor eax, eax             ; commentaire

:0043C7FB  jmp 0043CCD9

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

|:0043C7F7(C)

|

:0043C800  push esi

:0043C801  push edi

:0043C802  lea eax, dword ptr [ebp-0C]

* Possible Reference to Menu: MenuID_0005

|

:0043C805  push 00000005

:0043C807  push eax

[...]

:0043C845  mov eax, dword ptr [ebp-0C]

:0043C848  push 0000000A

:0043C84A  add eax, esi

:0043C84C  pop ecx

:0043C84D  cdq

:0043C84E  idiv ecx                         ; commentaire

:0043C850  cmp edx, 00000009

:0043C853  je 0043C859

:0043C855  and dword ptr [ebp-08], 00000000

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

|:0043C853(C)

|

:0043C859  cmp dword ptr [ebp-10], 00000000

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

|

:0043C85D  mov esi, 004D8724

:0043C862  jne 0043C897

:0043C864  push edi

:0043C865  lea eax, dword ptr [ebp-14]

 

[...]

 

 

:0043C973  call 00481AB9

:0043C978  cmp byte ptr [ebp-01], 00

:0043C97C  je 0043C982

:0043C97E  and dword ptr [ebp-08], 00000000

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

|:0043C94D(C), :0043C97C(C)

|

:0043C982  mov eax, dword ptr [ebp-0C]

:0043C985  mov ecx, dword ptr [ebp-10]

:0043C988  add eax, ecx

:0043C98A  push 0000000A

:0043C98C  cdq

:0043C98D  pop ecx                     ; commentaire

:0043C98E  idiv ecx

:0043C990  cmp edx, 00000003

:0043C993  je 0043C999

:0043C995  and dword ptr [ebp-08], 00000000

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

|:0043C993(C)

|

:0043C999  push edi

:0043C99A  lea eax, dword ptr [ebp-14]

:0043C99D  push 00000002

:0043C99F  push eax

:0043C9A0  mov ecx, ebx

 

[...]

 

:0043C9D6  call 00481AB9

:0043C9DB  mov eax, dword ptr [ebp-0C]

:0043C9DE  mov ecx, dword ptr [ebp-10]

:0043C9E1  add eax, ecx

:0043C9E3  push 0000000A

:0043C9E5  cdq

:0043C9E6  pop ecx

:0043C9E7  idiv ecx                 ; commentaire

:0043C9E9  cmp edx, 00000008

:0043C9EC  je 0043C9F2

:0043C9EE  and dword ptr [ebp-08], 00000000

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

|:0043C9EC(C)

|

:0043C9F2  cmp dword ptr [ebp-10], 00000000

:0043C9F6  jne 0043CA2B

 

 

:0043CAA6  mov eax, dword ptr [ebp-0C]

:0043CAA9  mov ecx, dword ptr [ebp-10]

:0043CAAC  add eax, ecx

:0043CAAE  push 0000000A

:0043CAB0  cdq

:0043CAB1  pop ecx

:0043CAB2  idiv ecx                 ; commentaire

:0043CAB4  test edx, edx

:0043CAB6  je 0043CABC

:0043CAB8  and dword ptr [ebp-08], 00000000

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

|:0043CAB6(C)

|

:0043CABC  cmp dword ptr [ebp-10], 00000000

:0043CAC0  jne 0043CAF5

 

[...]

 

:0043CB6B  call 00481AB9

:0043CB70  mov eax, dword ptr [ebp-0C]

:0043CB73  mov ecx, dword ptr [ebp-10]

:0043CB76  add eax, ecx

:0043CB78  push 0000000A

:0043CB7A  cdq

:0043CB7B  pop ecx

:0043CB7C  idiv ecx                     ; commentaire

:0043CB7E  cmp edx, 00000005

:0043CB81  je 0043CB87

:0043CB83  and dword ptr [ebp-08], 00000000

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

|:0043CB81(C)

|

:0043CB87  cmp dword ptr [ebp-10], 00000000

:0043CB8B  jne 0043CBC0

[...]

 

:0043CC3B  mov eax, dword ptr [ebp-0C]

:0043CC3E  mov ecx, dword ptr [ebp-10]

:0043CC41  add eax, ecx

:0043CC43  push 0000000A

:0043CC45  cdq

:0043CC46  pop ecx

:0043CC47  idiv ecx                 ; commentaire

:0043CC49  cmp edx, 00000002

:0043CC4C  je 0043CC52

:0043CC4E  and dword ptr [ebp-08], 00000000

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

|:0043CC4C(C)

|

:0043CC52  cmp dword ptr [ebp-10], 00000000

:0043CC56  jne 0043CC8B

:0043CC58  push edi

:0043CC59  lea eax, dword ptr [ebp-14]

:0043CC5C  push 00000000

 

[...]

 

:0043CCC6  mov ecx, ebx

:0043CCC8  call 0043CCDD

:0043CCCD  test eax, eax        ; commentaire

:0043CCCF  je 0043CCD5

:0043CCD1  and dword ptr [ebp-08], 00000000

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

|:0043CCCF(C)

|

:0043CCD5  mov eax, dword ptr [ebp-08]

:0043CCD8  pop esi

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

|:0043C7FB(U)

|

:0043CCD9  pop edi

:0043CCDA  pop ebx

:0043CCDB  leave

:0043CCDC  ret

 

Commentaires de la routine :

(Ses commentaires sont rΘalisΘs α partir d'observation sous Soft-Ice)

 

commentaire 1    retour au code

 

En [eax-08] est placΘ la taille de notre RegCode. Si vous avez entrΘ 123456, [eax-08] = 6.

Nous avons juste aprΦs un cmp dword ptr [eax-08], 0C => il compare la longueur de notre RegCode α 12 et saute si Θgale. Remplacez le 123456 par 123456789012. Regardez ce qu'il se passe sous SI et c'est bon, on passe la condition !!

A partir de maintenant, je dΘsigne le code de cette faτon :

[1] [2] [3] ..... [12] ie [1] = le 1er chiffre, etc ... jusqu'au douziΦme.

On continue .....

 

commentaire 2   retour au code

0043C845 : eax = [9] et esi = [6].

0043C84A :  eax := eax + esi ie eax := [9] + [6].

0043C84C : ecx := 10 (car 2 lignes au-dessus, on a push 0A et Ah = 10d)

0043C84E : idiv ecx

Rappel de l'instruction IDIV (division signΘe) :

    IDIV reg  <=>   EAX / reg et on place dans EAX le quotient et dans EDX le reste

On a donc comme division :

    ( [9] + [6] ) / 10  

et en 0043C850, on a un cmp edx, 9 c'est α dire  on compare le reste de la division α 9 et il faut que celui-ci l'Θgale !!

   ( [9] + [6] ) / 10 = quotient + 9   <=>     [9] + [6] = 9 car [9] et [6] sont infΘrieurs α 10.

On a donc les 2 premiers ΘlΘments de notre RegCode : le neuviΦme plus le sixiΦme doivent Θgaler 9  (je vous laisse choisir).

On continue ....

 

commentaire 3 retour au code

 

Le code est similaire au commentaire 2 avec :

eax := [7] et ecx := [2] et il faut que le reste soit Θgale α 3 (on divise tjrs par 10).

Donc il suffit de prendre [7] + [2] = 3 ou 13.

 

 

commentaire 4 retour au code

 

 

Le code est similaire au commentaire 2 avec :

eax := [12] et ecx := [3] et il faut que le reste soit Θgale α 8 (on divise tjrs par 10).

Donc il suffit de prendre [12] + [3] = 8 ou 18.

 

 

commentaire 5 retour au code

 

Le code est similaire au commentaire 2 avec :

eax := [5] et ecx := [4] et il faut que le reste soit Θgale α 0 (on divise tjrs par 10 et on cette fois un test edx, edx qui est α peu prΦs Θgale α un cmp edx, 0).

Donc il suffit de prendre [5] + [4] = 10 car 10/10 = quotient (=1) + 0.

 

commentaire 6 retour au code

 

Le code est similaire au commentaire 2 avec :

eax := [11] et ecx := [8] et il faut que le reste soit Θgale α 5 (on divise tjrs par 10).

Donc il suffit de prendre [11] + [8] = 5 ou 15.

 

 

commentaire 7 retour au code

 

Le code est similaire au commentaire 2 avec :

eax := [10] et ecx := [1] et il faut que le reste soit Θgale α 2 (on divise tjrs par 10).

Donc il suffit de prendre [10] + [1] = 2 ou 12.

 

 

commentaire 8 retour au code

 

Dans la routine appelΘe en 0043CCC8, il y a une derniΦre vΘrification, qui vΘrifie si le code n'est pas un code frauduleusement acquis (c'est GR qui le dit) car ces petits vicieux ont placΘs comme String Data RΘf. des n░ de code bidons.

 

On a donc tout ce qu'il faut pour Θcrire un petit gΘnΘrateur de n░ de sΘrie.

Voici qques numΘros valides :

113731228135

121732127137

213646253005  , etc ....

Voilα une source Pascal :

==dΘbut==

program getright3;

uses crt;

var
un,deu,tro,qua,cin,six,sep,hui,neu,dix,onz,dou:real;

begin
clrscr;
textcolor(green);
writeln('Key Generator for Get Right 3.xx by Nody');
textcolor(white);
writeln;writeln;
randomize;
un:=0;deu:=0;tro:=0;qua:=0;cin:=0;six:=0;sep:=0;hui:=0;neu:=0;dix:=0;onz:=0;dou:=0;

while un+dix <> 2 do
begin
  un:=int(random*9+0);
  dix:=int(random*9+0)
end;

while six+neu <> 9 do
begin
  six:=int(random*9+0);
  neu:=int(random*9+0)
end;

while deu+sep <> 3 do
begin
  deu:=int(random*9+0);
  sep:=int(random*9+0)
end;

while tro+dou <> 8 do
begin
  tro:=int(random*9+0);
  dou:=int(random*9+0)
end;

while qua+cin <> 10 do
begin
  qua:=int(random*9+0);
  cin:=int(random*9+0)
end;

while onz+hui <> 5 do
begin
  onz:=int(random*9+0);
  hui:=int(random*9+0)
end;


write(un:1:0,deu:1:0,tro:1:0,qua:1:0,cin:1:0,six:1:0,sep:1:0,hui:1:0,neu:1:0,dix:1:0,onz:1:0,dou:1:0)


end.

 

==fin==

 

 

 

Et voilα, Get Right 3.xx version version d'essai n'est plus. Faεtes en bonne usage mais d'oublier que ce que vous Ωtes en train de lire est une AIDE pour les crackers dΘbutants !! Si vous vous en servez α un autre usage, allez sur un moteur de recherche, cherchez un patch pour Get Right 3.xx, mettez-y votre nom et soyez heureux mais vous n'Ωtes pas cracker alors mais simple copieur.

 

nodless@usa.net