Nom d'utilisateur (User name)Alors comment ca marche ? Ben on debugge le prog avec w32 sur cette zone avec les options sur les apis et on regarde :
:0042C897 mov dword ptr [ebp+FFFFF38], 0040B1F0
Veuillez saisir votre nom d'utilisateur de Ftp Rapide.
:0042C8EA push 0040B11C
MSVBVM60.rtcInputBox, Ord:0254h username en 00471fc8 (adresse dans eax) //première input box (username)
:0042C973 Call dword ptr [004010A4]
MSVBVM60.__vbaStrCmp, Ord:0000h // hehe
:0042C9E4 Call dword ptr [004010EC]
Clef pour (Key for) Ftp Rapide
:0042CA58 mov dword ptr [ebp+FFFFFF38], 0040B314
Veuillez saisir votre clef (mot de passe pour Ftp Rapide).
:0042CAA7 push 0040B230
MSVBVM60.rtcInputBox, Ord:0254h pass en00468d88 //seconde input box (password)
:0042CB30 Call dword ptr [004010A4]
MSVBVM60.__vbaStrCmp, Ord:0000h //hinhin
:0042CBA1 Call dword ptr [004010EC]
test eax, eax
je 0042D0E9 <- celui la ?
:0042CBAF lea ecx, dword ptr [ebp-1C] -> adress password
:0042CBB2 lea edx, dword ptr [ebp-28] -> adresse login
:0042CBB5 push ecx
:0042CBB6 push edx
...
:0042CBB7 call 0041FBB0
test ax, ax
jne 0042CE61 <- vers Valid username and key.(tiens c'est celui là)
:0042CBC5 call 0041EE30
:0042CBE5 Bad Boy
__vbaStrCopy(57f18b56,8dec8b55,0,0,0,0,0,0)=004566a4->"RAPIDFTP"// met RAPIDFTP en mémoire et dan eaxOuais je sais j'ai mis un peu trop de détail, j'en met un peu moins maintenant :
API Address=0041FC71, API Return Address=0041FC77
__vbaStrCmp("",004566ec->"sirius01",6602465b,66025324,0,0,0,0)=1 // on vérifie que une clé a été entrée
API Address=0041FC88, API Return Address=0041FC8A
__vbaStrCmp("",00468ae4->"niicolas",6602465b,66025324,0,0,0,0)=1 // on vérifie qu'un username a été entré
API Address=0041FC9D, API Return Address=0041FC9F
__vbaStrCat(00468ae4->"niicolas",004086dc->"KIRIASSE",6602465b,66025324,0,0,0,0)=00468d2c->"KIRIASSEniicolas"
//concaténation
API Address=0041FCB5, API Return Address=0041FCBB
__vbaStrMove(6602465b,66025324,0,0,0,0,0,0)=00468d2c->"KIRIASSEniicolas" et eax //mise en mémoire
API Address=0041FCC6, API Return Address=0041FCC8
rtcRightCharBstr(00468ae4->"niicolas",8,6602465b,66025324,0,0,0,0)=00468d88->"niicolas"
//on prend les 8 derniers car du login (dans mon cas yen a deja 8)
API Address=0041FCCD, API Return Address=0041FCD3
__vbaStrMove(6602465b,66025324,0,0,0,0,0,0)=00468d88->"niicolas" //mise en mémoire
API Address=0041FCD8, API Return Address=0041FCDA
rtcUpperCaseBstr(00468d88->"niicolas",6602465b,66025324,0,0,0,0,0)=00468cb8->"NIICOLAS" //mise en majuscule
API Address=0041FCDB, API Return Address=0041FCE1
__vbaStrMove(6602465b,66025324,0,0,0,0,0,0)=00468cb8->"NIICOLAS" //mise en mémoire
API Address=0041FCE6, API Return Address=0041FCE8
__vbaFreeStr(6602465b,66025324,0,0,0,0,0,0)=20 //libération de l'espace
API Address=0041FCEB, API Return Address=0041FCF1
rtcMidCharBstr(00468cb8->"NIICOLAS",1,0067e2f0,6602465b,66025324,0,0,0)=00468d88->"N" //on prend le premier caractère a partir du début API Address=0041FD4B, API Return Address=0041FD51 __vbaStrMove(6602465b,6602465b,66025324,0,0,0,0,0)=00468d88->"N" //mise en mémoire API Address=0041FD56, API Return Address=0041FD5C __vbaStrCopy(6602465b,66025324,0,0,0,0,0,0)=00471fec->"N" //mise en mémoire API Address=0041FD66, API Return Address=0041FD6C
Ca recommence ensuite avec les 7 lettres qui
restent de notre login.
Puis il fait la meme chose (mise en memoire de lettres) avec la chaine
de caractères "RAPIDFTP".
Une fois cette partie effectuée il prend la première lettre
de RAPIDFTP, puis la compare au lettres de l'alphabet mises dans un
ordre spécial. Quand il l'a trouvé il s'arrête de
comparer et calcule en nombre. Ensuite il passe à la lettre suivante
etcetera
Au départ j'avais classé les lettres de cette alphabet
spécial en fonction de leur proximité dans la mémoire,
j'avais obtenu :
par zone de chainece qui ne m'avait pas vraiment arrangé !! Alors je me suis dit : chaque fois qu'une lettre trouve sa correspondance, le programme en déduit une valeur. Il faut donc que je classe par "conséquence". En effet certaines lettres renvoient le même nombre. J'ai donc fait un regroupement par "jump" suivant les lettres et j'ai obtenu :
1,2,3,4,5,6,7,8,9,0,A,K,U,B,L,V,C,
M,W,
D,N,X,
E,O,Y,F,
P,
Z,G,Q,H,R,I,S,J,T,#,$
par sautVoilà qui est plus lisible !! Premier problème que l'on remarque dans le programme : un calcul inutile !!! A quoi bon calculer un code à partir d'une chaine qui est toujours la même :(
1,2,3,4,5,6,7,8,9,0, -> 00420332
A,K,U, 004202f0 ->"1"
B,L,V, 004202ab
C,M,W, 00420266
D,N,X, 00420221 ->"4"
E,O,Y, 004201dc
F,P,Z, 00420197 ->"6"
G,Q, 00420152
H,R, 0042010d ->"8"
I,S, 004200c8 ->"9"
J, 00420083
T, 004203a8 ->"0"
#,
$
rtcR8ValFromBstr(471eb4->"8")=10 //toujours pris dans w32dasm puis modifier pour la lectureIl fait donc une addition avec toutes les lettres. Mais si on calcule le serial comme ca, ca ne marchera pas... Il fait des calculs en plus. Alors je suis passé sur smartcheck pour la première fois et la vraiment ça vaut le coup !!
rtcAnsiValueBstr(00468de4->"N",,,,,,,)=4e // transformation en ascii de la première lettre
__vbaFpI2(6602465b,66025324,0,0,40538000,4e,0067e2b0,bff6a26e)=56 // 4E + 8 = 56
rtcBstrFromAnsi(56,6602465b,66025324,0,0,40538000,4e,0067e2b0)=00471f68->"V" // valeur de "V" ? 56 evidemment
API Address=004205DA, API Return Address=004205E0
Voilà !!
Récapitulatif :
il prend le nom 'niicolas'
il le met en majuscules 'NIICOLAS'
il fait l'addition avec '81694606'
ce qui nous donne 'VJOLSRAY'
On enleve les 'o' etc 'VJ$LSRAY'
/* Keygen by sirius_black
+ FTP Rapide v4.4.1006
* Pure 3133t3 c0d3Z
+ F34R m3 !!!
+ Yah !!!
+ Pr0uT !!
+ Sex, Punk & CrackZ
+ Enjoy
*/
#include <stdio.h>
#include <stdlib.h>
void calcul(char *x){
int i;
char *y=x;
for (i=0;i<strlen(x);i++){
if (*y<123 && *y>96)*y=(char)((*y)-32);
y++;
}
}
int is_alpha(char *y){
if (*y>64 && *y<91)return 1;
else return 0;
}
void calcul2(char *x){
char *y=x;
if (is_alpha(y) && (*y)+8<91)*y=(*y)+8;
else *y='9';
y++;
if (is_alpha(y) && (*y)+1<91)*y=(*y)+1;
else *y='2';
y++;
if (is_alpha(y) && (*y)+6<91)*y=(*y)+6;
else *y='7';
y++;
if (is_alpha(y) && (*y)+9<91)*y=(*y)+9;
else *y='#';
y++;
if (is_alpha(y) && (*y)+4<91)*y=(*y)+4;
else *y='5';
y++;
if (is_alpha(y) && (*y)+6<91)*y=(*y)+6;
else *y='7';
y++;
if (!is_alpha(y))*y='1';
y++;
if (is_alpha(y) && (*y)+6<91)*y=(*y)+6;
else *y='7';
}
void fuck_hOokers(char *x){
int i;
char *y=x;
for (i=0;i<8;i++){
if (*y=='O')*y='$';
y++;
}
}
int main()
{
int taille;
char * username;
int i;
username=malloc(16);
printf("Crack de FTP Rapide 4.4.1006\n");
printf("par sirius_black\n");
printf("\nEntrez votre username (pas d\'espaces) : ");
scanf("%s",username);
while(strlen(username)<8){
printf("\nEntrez votre username (au moins 8 caracteres) : ");
scanf("%s",username);
}
calcul(username);
taille=strlen(username)-8;
for(i=0;i<taille;i++)username++;
calcul2(username);
fuck_hOokers(username);
*(username+8)='\0';
printf("Votre serial est :\n%s\n",username);
free(username);
system("PAUSE");
return 0;
}