7Sk1: Tutorial - crack de Setup2go
Introduction
Je tien quand même a bien mentionner le caractère exeptionel de ce crack puissque c'est un crack qui m'avait été demandé sur irc. Je suis pas un esclave donc c'est pas la peine de me demander ça.
Voilà, bon, let's go ! Setup2Go v.1.4.9 (disponible sur http://dev4pc.com)
Setup2go
D'abord on lance le programme et la on voit une sorte de nag screen qui nous que la version qu'on a n'est pas enregistré mais qu'il n'est jamais trop tard hahaha ... erm bref on clique sur registration et là un belle boite de dialog avec user/serial apparait on rentre n'importe quoi et ... rien ne se passe ... snif. Ben on va quand même désassemblé tout ça (je passe les vérification quand à la compression/cryptage du prog, il n'a rien de tout ça). Et comme toujours on matte un peu les string references :
"regcode"
"Registered Version"
Bon je pense que c'est assez explicite on va se lancer sur la piste de "regcode" et là on tombe sur une fonction pas mal interressante :
================================================================
* Referenced by a CALL at Address:
|:004058A9
|
:00402F50 51 push ecx
:00402F51 8B44240C mov eax, dword ptr [esp+0C]
:00402F55 53 push ebx
:00402F56 55 push ebp
:00402F57 56 push esi
:00402F58 8B742414 mov esi, dword ptr [esp+14]
:00402F5C 57 push edi
:00402F5D 8BD9 mov ebx, ecx
:00402F5F 50 push eax
:00402F60 56 push esi
:00402F61 895C2418 mov dword ptr [esp+18], ebx
:00402F65 E896FFFFFF call 00402F00
:00402F6A 84C0 test al, al
:00402F6C 0F84EB010000 je 0040315D
:00402F72 8D4C2418 lea ecx, dword ptr [esp+18]
:00402F76 6A00 push 00000000
:00402F78 51 push ecx
:00402F79 6A00 push 00000000
:00402F7B 683F000F00 push 000F003F
:00402F80 6A00 push 00000000
* Possible StringData Ref from Data Obj ->"Setup2GO"
|
:00402F82 681C014700 push 0047011C
:00402F87 6A00 push 00000000
* Possible StringData Ref from Data Obj ->"software\SDS Software\Setup2GO"
|
:00402F89 68A0014700 push 004701A0
:00402F8E 6802000080 push 80000002
* Reference To: ADVAPI32.RegCreateKeyExA, Ord:015Fh
|
:00402F93 FF1504704600 Call dword ptr [00467004]
:00402F99 85C0 test eax, eax
:00402F9B 7565 jne 00403002
:00402F9D 8BFE mov edi, esi
:00402F9F 83C9FF or ecx, FFFFFFFF
:00402FA2 F2 repnz
:00402FA3 AE scasb
:00402FA4 8B542418 mov edx, dword ptr [esp+18]
* Reference To: ADVAPI32.RegSetValueExA, Ord:0186h
|
:00402FA8 8B1D10704600 mov ebx, dword ptr [00467010]
:00402FAE F7D1 not ecx
:00402FB0 49 dec ecx
:00402FB1 51 push ecx
:00402FB2 56 push esi
:00402FB3 6A01 push 00000001
:00402FB5 50 push eax
* Possible StringData Ref from Data Obj ->"username"
|
:00402FB6 68D8014700 push 004701D8
:00402FBB 52 push edx
:00402FBC FFD3 call ebx
:00402FBE 8B54241C mov edx, dword ptr [esp+1C]
:00402FC2 8BE8 mov ebp, eax
:00402FC4 8BFA mov edi, edx
:00402FC6 83C9FF or ecx, FFFFFFFF
:00402FC9 33C0 xor eax, eax
:00402FCB F2 repnz
:00402FCC AE scasb
:00402FCD F7D1 not ecx
:00402FCF 49 dec ecx
:00402FD0 51 push ecx
:00402FD1 52 push edx
:00402FD2 6A01 push 00000001
:00402FD4 50 push eax
:00402FD5 8B442428 mov eax, dword ptr [esp+28]
* Possible StringData Ref from Data Obj ->"regcode"
|
:00402FD9 68E4014700 push 004701E4
:00402FDE 50 push eax
:00402FDF FFD3 call ebx
:00402FE1 8B4C2418 mov ecx, dword ptr [esp+18]
:00402FE5 8BF8 mov edi, eax
:00402FE7 51 push ecx
* Reference To: ADVAPI32.RegCloseKey, Ord:015Bh
|
:00402FE8 FF1500704600 Call dword ptr [00467000]
:00402FEE 85ED test ebp, ebp
:00402FF0 0F8567010000 jne 0040315D
:00402FF6 85FF test edi, edi
:00402FF8 0F855F010000 jne 0040315D
:00402FFE 8B5C2410 mov ebx, dword ptr [esp+10]
(...)
================================================================
Bon je pense que c'est clair cette fonction est appellée pour foutre le serial et l'user dans la base de registre quand ils concordent. Nous allons aller maintenant a l'endroit o˘ cette fonction est appellée : 004058A9. On tombe sur un bout de code qui provient d'un jump conditionel ce bout de code est situé à l'offset 00405819 on va mettre un breakpoint ici avec softice pour voir si on passe par là. Bingo ! voilà le code :
================================================================
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004057E8(C)
|
:00405819 8B4330 mov eax, dword ptr [ebx+30]
:0040581C 55 push ebp
* Reference To: USER32.SendMessageA, Ord:0214h
|
:0040581D 8B2D9C724600 mov ebp, dword ptr [0046729C]
:00405823 56 push esi
:00405824 57 push edi
:00405825 6820754700 push 00477520
:0040582A 6800020000 push 00000200
:0040582F 6A0D push 0000000D
:00405831 50 push eax
:00405832 FFD5 call ebp ; recupère le username fournit ( et le fou dans 00477520 )
:00405834 BF20754700 mov edi, 00477520
:00405839 83C9FF or ecx, FFFFFFFF
:0040583C 33C0 xor eax, eax
:0040583E 8D942414010000 lea edx, dword ptr [esp+00000114]
:00405845 F2 repnz
:00405846 AE scasb
:00405847 F7D1 not ecx
:00405849 2BF9 sub edi, ecx
:0040584B 6820754700 push 00477520
:00405850 8BC1 mov eax, ecx
:00405852 8BF7 mov esi, edi
:00405854 8BFA mov edi, edx
:00405856 6800020000 push 00000200
:0040585B C1E902 shr ecx, 02
:0040585E F3 repz
:0040585F A5 movsd
:00405860 8BC8 mov ecx, eax
:00405862 6A0D push 0000000D
:00405864 83E103 and ecx, 00000003
:00405867 F3 repz
:00405868 A4 movsb
:00405869 8B4B38 mov ecx, dword ptr [ebx+38]
:0040586C 51 push ecx
:0040586D FFD5 call ebp ; recupère ici le serial fournit
:0040586F BF20754700 mov edi, 00477520
:00405874 83C9FF or ecx, FFFFFFFF
:00405877 33C0 xor eax, eax
:00405879 8D542410 lea edx, dword ptr [esp+10]
:0040587D F2 repnz
:0040587E AE scasb
:0040587F F7D1 not ecx
:00405881 2BF9 sub edi, ecx
:00405883 8BC1 mov eax, ecx
:00405885 8BF7 mov esi, edi
:00405887 8BFA mov edi, edx
:00405889 8D942414010000 lea edx, dword ptr [esp+00000114]
:00405890 C1E902 shr ecx, 02
:00405893 F3 repz
:00405894 A5 movsd
:00405895 8BC8 mov ecx, eax
:00405897 83E103 and ecx, 00000003
:0040589A F3 repz
:0040589B A4 movsb
:0040589C 8D4C2410 lea ecx, dword ptr [esp+10]
:004058A0 51 push ecx ; serial fourni
:004058A1 52 push edx ; username fourni
:004058A2 E8990D0300 call 00436640 ; meuh kesske c cette fonction dit-donc ?
:004058A7 8BC8 mov ecx, eax
:004058A9 E8A2D6FFFF call 00402F50 ; notre fonction (pour la base de registre)
:004058AE 5F pop edi
:004058AF 5E pop esi
:004058B0 84C0 test al, al
:004058B2 5D pop ebp
:004058B3 7426 je 004058DB
:004058B5 8B842410020000 mov eax, dword ptr [esp+00000210]
:004058BC 680D080000 push 0000080D
:004058C1 50 push eax
* Reference To: USER32.EndDialog, Ord:00B9h ; fin de la boit de dialog register
|
:004058C2 FF1570734600 Call dword ptr [00467370]
:004058C8 B001 mov al, 01
:004058CA 5B pop ebx
:004058CB 81C408020000 add esp, 00000208
:004058D1 C21000 ret 0010
================================================================
Bon ben on a trouvé un fonction en 00436640 qui prend pour paramètre le serial en ecx et l'user en edx ...
Jettons un coup d'oeil sur ça. un breakpoint sur Setup2Go a l'addresse 00436640 (bpx 00436640). Rien d'interressant en fait c sur la fonction qui fou tout dans la base de registre qui va falloir se pencher. Et en effet au début de cette fonction voilà sur quoi on tombe :
================================================================
* Referenced by a CALL at Address:
|:004058A9
|
:00402F50 51 push ecx
:00402F51 8B44240C mov eax, dword ptr [esp+0C]
:00402F55 53 push ebx
:00402F56 55 push ebp
:00402F57 56 push esi
:00402F58 8B742414 mov esi, dword ptr [esp+14]
:00402F5C 57 push edi
:00402F5D 8BD9 mov ebx, ecx
:00402F5F 50 push eax
:00402F60 56 push esi
:00402F61 895C2418 mov dword ptr [esp+18], ebx
:00402F65 E896FFFFFF call 00402F00 ; call interressant
:00402F6A 84C0 test al, al
:00402F6C 0F84EB010000 je 0040315D ; ce jump nous zape toute la fonction si al est égale a 0
(...)
================================================================
Pour vérifier cette hypothèse nous alons modifier ce je 0040315D en nop, nous allons le 'noper' soit remplacer grace a un editeur hexadecimal 0F84EB010000 en 909090909090 pour voir si on a juste. On lance le prog on entre user : An-Mojeg / serial : arfarfarf et là bingo tout se grise, registered version dans tout les sens etc ... Bin nous reste plus qu'a voir kesskisspass en fait. Analyson le call juste avant ...
Voici l'état des registres avant le call :
- EAX : serial
- EDX : user
En suivant le call on tombe sur une fonction bizare avec ... un str ref bizare aussi :
================================================================
* Referenced by a CALL at Addresses:
|:00402F65 , :00403247
|
:00402F00 56 push esi
:00402F01 8B742408 mov esi, dword ptr [esp+08]
:00402F05 85F6 test esi, esi
:00402F07 57 push edi
:00402F08 743F je 00402F49 ; ici un petit va te faire foutre
:00402F0A 8B542410 mov edx, dword ptr [esp+10]
:00402F0E 85D2 test edx, edx
:00402F10 7437 je 00402F49 ; ici aussi
:00402F12 8BFE mov edi, esi
:00402F14 83C9FF or ecx, FFFFFFFF
:00402F17 33C0 xor eax, eax
:00402F19 F2 repnz
:00402F1A AE scasb
:00402F1B F7D1 not ecx
:00402F1D 49 dec ecx
:00402F1E 7429 je 00402F49 ; ici aussi ( user vide )
:00402F20 8BFA mov edi, edx
:00402F22 83C9FF or ecx, FFFFFFFF
:00402F25 F2 repnz
:00402F26 AE scasb
:00402F27 F7D1 not ecx
:00402F29 49 dec ecx
:00402F2A 741D je 00402F49 ; encore ici ( serial vide )
:00402F2C 8944240C mov dword ptr [esp+0C], eax
:00402F30 8D44240C lea eax, dword ptr [esp+0C]
:00402F34 52 push edx
:00402F35 50 push eax
* Possible StringData Ref from Data Obj ->"pasha and andrey"
|
:00402F36 681C044700 push 0047041C ; meuh ?
:00402F3B 56 push esi
:00402F3C E8AFFC0400 call 00452BF0 ; encore un call interressant
:00402F41 83C410 add esp, 00000010
:00402F44 5F pop edi
:00402F45 5E pop esi
:00402F46 C20800 ret 0008
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses: ; haaa il est là notre va te faire foutre ;)
|:00402F08(C), :00402F10(C), :00402F1E(C), :00402F2A(C)
|
:00402F49 5F pop edi
:00402F4A 32C0 xor al, al
:00402F4C 5E pop esi
:00402F4D C20800 ret 0008
================================================================
Bon on va voir qu'est-ce qu'il en découle grace a softice. Attaquons nous encore a ce jump :
================================================================
* Referenced by a CALL at Address:
|:00402F3C
|
:00452BF0 53 push ebx
:00452BF1 8B5C2414 mov ebx, dword ptr [esp+14]
:00452BF5 56 push esi
:00452BF6 57 push edi
:00452BF7 8BFB mov edi, ebx
:00452BF9 83C9FF or ecx, FFFFFFFF
:00452BFC 33C0 xor eax, eax
:00452BFE F2 repnz
:00452BFF AE scasb
:00452C00 F7D1 not ecx
:00452C02 49 dec ecx
:00452C03 8BF9 mov edi, ecx
:00452C05 8D4701 lea eax, dword ptr [edi+01]
:00452C08 50 push eax
:00452C09 E88D480000 call 0045749B
:00452C0E 8BF0 mov esi, eax
:00452C10 8B44241C mov eax, dword ptr [esp+1C]
:00452C14 83C404 add esp, 00000004
:00452C17 85C0 test eax, eax
:00452C19 742C je 00452C47
:00452C1B 8A4B01 mov cl, byte ptr [ebx+01]
:00452C1E 55 push ebp
:00452C1F 51 push ecx
:00452C20 E89BFFFFFF call 00452BC0
:00452C25 8A13 mov dl, byte ptr [ebx]
:00452C27 8BE8 mov ebp, eax
:00452C29 52 push edx
:00452C2A E891FFFFFF call 00452BC0
:00452C2F C1E004 shl eax, 04
:00452C32 03E8 add ebp, eax
:00452C34 8B442424 mov eax, dword ptr [esp+24]
:00452C38 81F5FF000000 xor ebp, 000000FF
:00452C3E 83C408 add esp, 00000008
:00452C41 83ED55 sub ebp, 00000055
:00452C44 8928 mov dword ptr [eax], ebp
:00452C46 5D pop ebp
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00452C19(C)
|
:00452C47 8B00 mov eax, dword ptr [eax]
:00452C49 8B4C2414 mov ecx, dword ptr [esp+14]
:00452C4D 8B542410 mov edx, dword ptr [esp+10]
:00452C51 57 push edi
:00452C52 56 push esi
:00452C53 50 push eax
:00452C54 51 push ecx
:00452C55 52 push edx
:00452C56 E835FEFFFF call 00452A90
:00452C5B 57 push edi
:00452C5C 53 push ebx
:00452C5D 56 push esi
:00452C5E E88D5F0000 call 00458BF0
:00452C63 85C0 test eax, eax
:00452C65 56 push esi
:00452C66 0F94C3 sete bl
:00452C69 E8E2430000 call 00457050
:00452C6E 83C424 add esp, 00000024
:00452C71 8AC3 mov al, bl
:00452C73 5F pop edi
:00452C74 5E pop esi
:00452C75 5B pop ebx
:00452C76 C3 ret
================================================================
Perso j'ai pas trop envie de me lancer dans la création d'un keygen donc je vais faire ça à la porcos. La routine qui teste les serial user (en 00402F00) est appelé par deux endroits dans le prog :
* Referenced by a CALL at Addresses:
|:00402F65 , :00403247
On va donc tout simple supprimer les :
test al, al
je ********
qui suivent l'appelle de cette fonction en les noppants.
Le premier :
:00402F6A 84C0 test al, al
:00402F6C 0F84EB010000 je 0040315D
Le second :
:0040324C 84C0 test al, al
:0040324E 0F846A010000 je 004033BE
Bon ben on fait un ptit test puis on s'attaque à la programmation (facile) du crack. Alors toujours avec l'editeur hexadécimale on remplace les tests + les jumps puis voilàà :)
On est registered :)
Création du crack
Je vois tout de suite ceux qui vont me faire des merdes avec leur prog qui fait des cracks automatiquements ... NON ! On est pas des PD ok ? Ce qui veulent le faire qu'ils arrete de lire ce zine complètement non mais ! ;-)
Bon je vous file le code source en C++ :
//------------------------------------------------------------
#include <stdio.h>
void noper(FILE *f, long offset)
{
int i;
for (i=1;i<9;i++,offset++)
{
fseek(f,offset,SEEK_SET);
fprintf(f,"%c",0x90);
}
}
void main()
{
FILE *crck = fopen("Setup2Go.exe", "r+");
if(!crck){
printf("Mettez ce crack dans le meme dossier que setup2go merci.");
return;
}
noper(crck,12138L);
noper(crck,12876L);
fclose(crck);
printf("crack Setup2go - An-Mojeg fear biensur :)");
return;
}
//------------------------------------------------------------
Je n'ai fait aucune verification pour la version etc ... a vous de voir ...
Un signature MD5 du fichier ? ... faut que j'arrete avec MD5 moi :)
An-Mojeg [ an-mojeg@mail-developpeur.com ]
sources du crack
CRS2GO.CPP
// Setup2go cracked by An-Mojeg [an-mojeg@mail-developpeur.com]
#include <stdio.h>
void noper(FILE *f, long offset)
{
int i;
for (i=1;i<9;i++,offset++)
{
fseek(f,offset,SEEK_SET);
fprintf(f,"%c",0x90);
}
}
void main()
{
FILE *crck = fopen("Setup2Go.exe", "r+");
if(!crck){
printf("Mettez ce crack dans le meme dossier que setup2go merci.");
return;
}
noper(crck,12138L);
noper(crck,12876L);
fclose(crck);
printf("crack Setup2go - An-Mojeg fear biensur :)");
return;
}