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.