_ _____ 
                                         ___ _ __   ___ __ _  ___   __| |_   _|
                                        |__ \ '_ \ / _ ' _` |/ _ \ / _` | | |  
                                        / __/ |_) | | | | | | (_) | | | | | |  
                                        \___|_.__/|_| |_| |_|\___/|_| |_| |_|  
					.openmod.org


PRASID - VB KEYGEN ME.



-|- A. Introduction

A l'approche des fetes de noel, plutot que de glander sur ce facebook de merde, rien 
ne vaut un bon petit crackme histoire de se mettre en jambe..


-|- B.PRASID - KEYGEN ME


----------------------------------------------------------------------------------------

Level: 1
crackme author : Prasid
type : keygen

----------------------------------------------------------------------------------------

Ccomme d'habitude, je verifie avec PE/ID si l'exe est packed ou crypted. Action

PE/ID nous indique :
Microsoft Visual Basic 5.0 / 6.0

Bon. Pour changer d'ollydebug, on va cette fois se servir de ce bon vieux SMART CHECK.

En mode "SHOW ERRORS and SPECIFIC EVENTS", smart check nous indique ceci lors du calcul 
du serial :

14262 Command1_Click
14267 Text3.Text
14278 OnError(long:-1)
14280 Len(VARIANT:Empty) returns LONG:1242004
14302 Len(VARIANT:VT_DISPATCH:02340F14) returns LONG:1242004
14324 Mid(VARIANT:VT_DISPATCH:02340F14, long:1, VARIANT:Integer:1)
14342 Asc(String:"t") returns Integer:116
14366 Double (112) --> Long (112)
14367 Chr(Integer:112)
14383 Mid(VARIANT:VT_DISPATCH:02340F14, long:2, VARIANT:Integer:1)
14401 Asc(String:"h") returns Integer:104
14425 Double (110) --> Long (110)
14426 Chr(Integer:110)
14443 Mid(VARIANT:VT_DISPATCH:02340F14, long:3, VARIANT:Integer:1)
14461 Asc(String:"o") returns Integer:111
14485 Double (112) --> Long (112)
14486 Chr(Integer:112)
14503 Mid(VARIANT:VT_DISPATCH:02340F14, long:4, VARIANT:Integer:1)
14521 Asc(String:"m") returns Integer:109
14545 Double (116) --> Long (116)
14546 Chr(Integer:116)
14563 Mid(VARIANT:VT_DISPATCH:02340F14, long:5, VARIANT:Integer:1)
14581 Asc(String:"a") returns Integer:97
14605 Double (97) --> Long (97)
14606 Chr(Integer:97)
14623 Mid(VARIANT:VT_DISPATCH:02340F14, long:6, VARIANT:Integer:1)
14641 Asc(String:"s") returns Integer:115
14666 Double (117) --> Long (117)

la correspondance ASCII pour 'thomas' donne normalement :
t=116
h=104
o=111
m=109
a=97
s=115

Voyons maintenant de plus pret, en mode SHOW ALL EVENT pour le calcul de la 
lettre :"t"


14342 Asc(String:"t") returns Integer:116
14345 __vbaVarMove(VARIANT:Integer:116, VARIANT:Empty) returns DWORD:12F3F8
14346 __vbaFreeStr(LPBSTR:0012F3A4) returns DWORD:0
14347 SysFreeString(BSTR:00151F8C)
14350 __vbaVarAdd(VARIANT:Integer:0, VARIANT:Integer:1) returns DWORD:12F394
14351 __vbaVarMove(VARIANT:Integer:1, VARIANT:Integer:0) returns DWORD:12F3B8
14352 __vbaVarTstEq(VARIANT:Integer:1, VARIANT:Const Integer:6) returns DWORD:0
14353 __vbaVarMove(VARIANT:Integer:0, VARIANT:Double:0) returns DWORD:12F3A8
14354 __vbaVarTstEq(VARIANT:Integer:1, VARIANT:Const Integer:0) returns DWORD:0
14355 __vbaVarTstEq(VARIANT:Integer:1, VARIANT:Const Integer:1) returns DWORD:FFFFFFFF
14356 __vbaVarVargNofree(VARIANT:Double:0, VARIANT:Empty) returns DWORD:12F4E4
14357 __vbaVarSub(VARIANT:Double:0, VARIANT:Integer:5) returns DWORD:12F394
14358 __vbaVarAdd(VARIANT:Integer:116, VARIANT:Double:-5) returns DWORD:12F384
14359 __vbaVarMove(VARIANT:Double:111, VARIANT:Integer:0) returns DWORD:12F3A8
14360 __vbaVarTstEq(VARIANT:Integer:1, VARIANT:Const Integer:2) returns DWORD:0
14361 __vbaVarTstEq(VARIANT:Integer:1, VARIANT:Const Integer:3) returns DWORD:0
14362 __vbaVarTstEq(VARIANT:Integer:1, VARIANT:Const Integer:4) returns DWORD:0
14363 __vbaVarTstEq(VARIANT:Integer:1, VARIANT:Const Integer:5) returns DWORD:0
14364 __vbaVarAdd(VARIANT:Double:111, VARIANT:Integer:1) returns DWORD:12F394
14365 __vbaVarMove(VARIANT:Double:112, VARIANT:Double:111) returns DWORD:12F3A8
14366 Double (112) --> Long (112)
14367 Chr(Integer:112)
14371 __vbaVarCat(VARIANT:Empty, VARIANT:String:"p") returns DWORD:12F384
14375 __vbaVarMove(VARIANT:String:"p", VARIANT:Empty) returns DWORD:12F3E8

Notre string 't' (ascii 116) devient 'p' (ascii 112)

116 - 4 => 112
104 +6 =>110
111 + 1 => 112
109 + 7 => 116
97 => 97
115 + 2 => 117

ce qui donne pour notre serial : "pnptau"

On test.. bingo. bon. une chose de trouver.

Par contre, j'ai beau reflechir, je n'ai pas vu de logique. Quelques que soit le NOM que je mettais, 
il rajoutait toujours ces chiffres. 

En fait cette merde boucle au bout de 6 caracteres !
-4
+6
+1
+7
0
+2
et rebelote pour les caracteres suivant ...


-|- C.KEYGEN

Voici un keygen en CPP. 

----------------------------------------------------------------------------------------

#include
#include
#include
int main(void)
{


	char name[199],serial[199];
	int len,i;
	printf("keygen for PRASID KEYGENME - thomas\n");
        start:printf("\n\nName : ");
	scanf("%s",name);
	len=strlen(name);
	if(len <2)
	{
		printf("\n\nNeed 2 or more chars !\nTry again");
		getch();
		goto start;
        }
	printf("\n\nSerial = ");
	i=0;
	do
	{
		serial[i] = name[i] - 4;
        serial[i+1] = name[i+1] + 6;
		serial[i+2] = name[i+2] + 1;
		serial[i+3] = name[i+3] + 7;
		serial[i+4] = name[i+4];
		serial[i+5] = name[i+5] + 2;
		i=i+6;
	}
        while(i<=len);
	serial[len]='\0';
        printf("%s\n",serial);
        getch();

return 0;
}

----------------------------------------------------------------------------------------


-|- D. conclusion


Joyeux noel et bon reverse a tous !