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)
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 .....
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 ....
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.
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.
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.
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.
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.
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.