Nom : WebVCR Version : 2.16 Disponibilité : http://Netresultscorp.com Protection : Name+serial Tools : Softice 4.0 Tasm (ou autre compilateur Asm) Ganja/coca/brain WebVCR est un petit soft qui permet de faire je sais poa koi : WebVCR is also an ideal application for organizing, archiving, and distributing web content. It’s visual explorer interface makes it easy to see what you have and haven’t seen. User-defined folders make it easy to quickly organize web content the way you want. Support for read-only and removable media also allows you to easily archive or distribute web content. Tiens ça à la l'air poa mal ce truc ... Step 1: Serial fishing Bon, nous on veut faire un Keygen . Pour ça faut déjà qu'on trouve le serial . Donc on va à l'option pour rentrer un Name+serial . On tape notre nom + email (important) mais ON NE VALIDE POA . On fait surgir SI : CTRL D . Et on entre le breakpoint approprié pour pécher un serial : BPX HMEMCPY . Et on relance le tout avec F5 .Cette fois on valide : BOOm! SI se met en route . On est au début de l'api Hmemcpy . Il faut donc que l'on fasse une backtrace avec la touche F12 de SI afin de revenir dans le code principal du proggy . En appuyant 22 Fois sur F12 on arrive içi : 015F:00453625 LEA ECX,[EBP-18] -- 22 fois sur F12 et on arrive ici avec SI 015F:00453628 PUSH ECX 015F:00453629 MOV ECX,[EBP-60] 015F:0045362C ADD ECX,000000A0 015F:00453632 CALL 0047756A 015F:00453637 LEA EDX,[EBP-20] 015F:0045363A PUSH EDX 015F:0045363B MOV ECX,[EBP-60] 015F:0045363E ADD ECX,000001A0 015F:00453644 CALL 0047756A 015F:00453649 LEA EAX,[EBP-1C] 015F:0045364C PUSH EAX 015F:0045364D MOV ECX,[EBP-60] 015F:00453650 ADD ECX,00000160 015F:00453656 CALL 0047756A Les calls 47756A ne sont pas très interressant : ils recopient en faite le nom, l'email, et le serial que l'on a entré dans un endroit memoire . Idem pour les calls 47757C (je simplifie...) .Par contre en continuant la trace avec F10 on arrive à ceci : 015F:00453714 PUSH ECX 015F:00453715 MOV ECX,ESP 015F:00453717 MOV [EBP-44],ESP 015F:0045371A LEA EDX,[EBP-10] 015F:0045371D PUSH EDX 015F:0045371E CALL 0047757C 015F:00453723 MOV [EBP-008C],EAX 015F:00453729 MOV BYTE PTR [EBP-04],05 015F:0045372D CALL 0041B340------- genere le serial 015F:00453732 ADD ESP,18 015F:00453735 TEST EAX,EAX 015F:00453737 JZ 0045387C On remarke un Call 41B340 suivit d'un test sur le registre EAX, lui-meme suivit d'un saut conditionnel...Rentrons dans le Call 41B340 avec la touche F8 de SI pour voir ce qui se passe à l'interieur: 015F:0041B340 PUSH EBP 015F:0041B341 MOV EBP,ESP 015F:0041B343 PUSH FF 015F:0041B345 PUSH 00479BC2 015F:0041B34A MOV EAX,FS:[00000000] 015F:0041B350 PUSH EAX 015F:0041B351 MOV FS:[00000000],ESP 015F:0041B358 SUB ESP,54 015F:0041B35B MOV DWORD PTR [EBP-04],00000005 015F:0041B362 PUSH ECX 015F:0041B363 MOV ECX,ESP 015F:0041B365 MOV [EBP-14],ESP 015F:0041B368 LEA EAX,[EBP+1C] 015F:0041B36B PUSH EAX 015F:0041B36C CALL 0047757C 015F:0041B371 MOV [EBP-34],EAX 015F:0041B374 MOV ECX,[EBP-34] 015F:0041B377 MOV [EBP-38],ECX 015F:0041B37A MOV BYTE PTR [EBP-04],06 015F:0041B37E PUSH ECX 015F:0041B37F MOV ECX,ESP 015F:0041B381 MOV [EBP-18],ESP 015F:0041B384 LEA EDX,[EBP+18] 015F:0041B387 PUSH EDX 015F:0041B388 CALL 0047757C 015F:0041B38D MOV [EBP-3C],EAX 015F:0041B390 MOV EAX,[EBP-3C] 015F:0041B393 MOV [EBP-40],EAX 015F:0041B396 MOV BYTE PTR [EBP-04],07 015F:0041B39A PUSH ECX 015F:0041B39B MOV ECX,ESP 015F:0041B39D MOV [EBP-1C],ESP 015F:0041B3A0 LEA EDX,[EBP+14] 015F:0041B3A3 PUSH EDX 015F:0041B3A4 CALL 0047757C P'tain, y nous fait encore chier avec ses call 47757C dont on a rien à foutre ! On continue la trace avec F10 et on arrive à ceci : 015F:0041B423 MOV [EBP-60],EAX 015F:0041B426 MOV BYTE PTR [EBP-04],09 015F:0041B42A CALL 0041B2CB 015F:0041B42F ADD ESP,0C 015F:0041B432 MOV [EBP-24],EAX Et dans le call 41b2cb, on trouve : 015F:0041B2CB PUSH EBP 015F:0041B2CC MOV EBP,ESP 015F:0041B2CE PUSH FF 015F:0041B2D0 PUSH 00479B4C 015F:0041B2D5 MOV EAX,FS:[00000000] 015F:0041B2DB PUSH EAX 015F:0041B2DC MOV FS:[00000000],ESP 015F:0041B2E3 PUSH ECX 015F:0041B2E4 MOV DWORD PTR [EBP-04],00000002 015F:0041B2EB LEA ECX,[EBP+10] 015F:0041B2EE CALL 00402270 015F:0041B2F3 PUSH EAX 015F:0041B2F4 LEA ECX,[EBP+0C] 015F:0041B2F7 CALL 00402270 015F:0041B2FC PUSH EAX 015F:0041B2FD CALL 0046CA27 ---- interressant . 015F:0041B302 ADD ESP,08 015F:0041B305 MOV [EBP-10],EAX 015F:0041B308 MOV BYTE PTR [EBP-04],01 Bon , faut encore rentrer dans le Call 46CA27 pour voir ce qui se passe dedans (avec la touche F8 de SI) : 015F:0046CA27 PUSH EBP 015F:0046CA28 MOV EBP,ESP 015F:0046CA2A PUSH FF 015F:0046CA2C PUSH 0047F1EC 015F:0046CA31 MOV EAX,FS:[00000000] 015F:0046CA37 PUSH EAX 015F:0046CA38 MOV FS:[00000000],ESP 015F:0046CA3F SUB ESP,00000088 015F:0046CA45 MOV DWORD PTR [EBP-10],00000000 015F:0046CA4C MOV EAX,[EBP+0C] 015F:0046CA4F PUSH EAX 015F:0046CA50 CALL 0046CACF 015F:0046CA55 ADD ESP,04 015F:0046CA58 TEST EAX,EAX 015F:0046CA5A JZ 0046CA65 015F:0046CA5C MOV DWORD PTR [EBP-10],00000001 015F:0046CA63 JMP 0046CABE 015F:0046CA65 MOV ECX,[EBP+08] 015F:0046CA68 PUSH ECX 015F:0046CA69 LEA EDX,[EBP-0094] 015F:0046CA6F PUSH EDX 015F:0046CA70 CALL 0046C962 ---- enfin le call qui génère le serial :) 015F:0046CA75 ADD ESP,08 015F:0046CA78 MOV DWORD PTR [EBP-04],00000000 015F:0046CA7F LEA ECX,[EBP-0094] cette fois, on y est presque ... C'est le call 46c962 qui va générer le serial . On rentre dedans : F8 et on a ceci sous les yeux : 015F:0046C962 PUSH EBP 015F:0046C963 MOV EBP,ESP 015F:0046C965 SUB ESP,28 015F:0046C968 MOV DWORD PTR [EBP-28],00000000 015F:0046C96F CMP DWORD PTR [EBP+0C],00 015F:0046C973 JZ 0046CA0B 015F:0046C979 MOV EAX,[EBP+0C] 015F:0046C97C MOVSX ECX,BYTE PTR [EAX] 015F:0046C97F TEST ECX,ECX 015F:0046C981 JZ 0046CA0B 015F:0046C987 MOV EDX,[EBP+0C] 015F:0046C98A PUSH EDX 015F:0046C98B CALL 0047802C 015F:0046C990 ADD ESP,04 015F:0046C993 MOV [EBP-20],EAX 015F:0046C996 MOV DWORD PTR [EBP-18],00000000 015F:0046C99D MOV DWORD PTR [EBP-1C],00000000 015F:0046C9A4 JMP 0046C9AF ;debut de l'encodage du serial 015F:0046C9A6 MOV EAX,[EBP-1C]--- EBP-1C= un premier compteur 015F:0046C9A9 ADD EAX,01 015F:0046C9AC MOV [EBP-1C],EAX 015F:0046C9AF CMP DWORD PTR [EBP-1C],10 -- le compteur=10h ? 015F:0046C9B3 JGE 0046CA07---------------- oui, encodage finit, on saute 015F:0046C9B5 MOV ECX,[EBP-18]------------ hop, EBP-18,un deuxième compteur 015F:0046C9B8 CMP ECX,[EBP-20] 015F:0046C9BB JL 0046C9C4 015F:0046C9BD MOV DWORD PTR [EBP-18],00000000 015F:0046C9C4 MOV EDX,[00499BE4] 015F:0046C9CA ADD EDX,[EBP-1C] 015F:0046C9CD MOVSX EAX,BYTE PTR [EDX]----- on prend le 1er caractère de la table1 015F:0046C9D0 MOV ECX,[EBP+0C] 015F:0046C9D3 ADD ECX,[EBP-18] 015F:0046C9D6 MOVSX EDX,BYTE PTR [ECX]----- on prend le 1er caractère contenu dans le mail 015F:0046C9D9 MOV ECX,[EBP-18] 015F:0046C9DC ADD ECX,EAX 015F:0046C9DE ADD EDX,ECX 015F:0046C9E0 MOV [EBP-24],EDX 015F:0046C9E3 MOV EDX,[EBP-24] 015F:0046C9E6 AND EDX,1F 015F:0046C9E9 MOV [EBP-24],EDX 015F:0046C9EC MOV EAX,[EBP-1C] 015F:0046C9EF MOV ECX,[EBP-24] 015F:0046C9F2 MOV DL,[ECX+00485EB8]----- et ici on prend le caractère de la table2+ECX 015F:0046C9F8 MOV [EAX+EBP-14],DL------- là, on stocke le resultat final en EBP-14 015F:0046C9FC MOV EAX,[EBP-18] 015F:0046C9FF ADD EAX,01 015F:0046CA02 MOV [EBP-18],EAX 015F:0046CA05 JMP 0046C9A6 ;fin encodage 015F:0046CA07 MOV BYTE PTR [EBP-04],00 015F:0046CA0B LEA ECX,[EBP-14]---------- le bon serial en EBP-14 015F:0046CA0E PUSH ECX 015F:0046CA0F MOV ECX,[EBP+08] 015F:0046CA12 CALL 0040E960 015F:0046CA17 MOV EDX,[EBP-28] 015F:0046CA1A OR EDX,01 015F:0046CA1D MOV [EBP-28],EDX 015F:0046CA20 MOV EAX,[EBP+08] 015F:0046CA23 MOV ESP,EBP 015F:0046CA25 POP EBP 015F:0046CA26 RET Et ben putain, il l'avait bien planké son serial, le programmeur . Ce fut un peu long et laborieux pour le trouver ce serial ... ENfin, now, on a tout : le serial + la boucle qui génère le serial . Première remark : Le prog se fout totalement du nom qu'on a entré . Pour générer son serial, le programmeur n'utilise que le mail et deux tables . A noter que le serial final se trouve dans le registre EBP-14 (en 46ca0b) . Step 2 : Keygener tout ça Description de l'algo : 1. Le prog se sert d'une 1ère table (à l'addresse 46C9CD) 2. Le prog prend chaque caractère du mail et les additionne avec les caractères de la table1 3. L'addition précédente va donner un nombre compris entre 0 et 32. 4. Le prog pointe sur la table 2 + le resultat de l'addition (2.) . 5. Le prog stocke la valeur de 4. dans un endroit memoire . Bon, c'est un gros résumé (!) . Mais je ne saurai trop vous conseiller de tracer pas à pas avec SI pour voir comment fonctionne l'encodage ... Maintenant il faut savoir ce qu'il y a dans les tables 1 et 2 . Pour cela rien de plus facile : - Pour la table 1, quand vous etes à l'addresse 46C9CD, MOVSX EAX,BYTE PTR [EDX], faites E EDX sous SI.Vous devriez voir ceci : table1 ÄÄÄÄÄWEBVCR!.data+0001CD98ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄbyteÄÄÄÄÄÄÄÄÄÄÄÄÄÄPROTÄÄÄ(0)ÄÄ 0167:004ACD98 33 36 38 71 65 68 66 76-77 78 66 36 36 62 62 64 368qehfvwxf66bbd 0167:004ACDA8 00 00 00 00 00 00 00 00-4C 02 88 00 AC 04 88 00 ........L....... 0167:004ACDB8 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0167:004ACDC8 98 09 48 00 00 00 00 00-00 00 00 00 00 00 00 00 ..H............. 0167:004ACDD8 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0167:004ACDE8 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0167:004ACDF8 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0167:004ACE08 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄPROT32Ä - Pour la table 2, quand vous etes à l'addresse 0046C9F2 , MOV DL,[ECX+00485EB8], Faites E 485EB8 sous SI.Et on a cela sous les yeux: table2 ÄÄÄÄÄWEBVCR!.rdata+5EB8ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄbyteÄÄÄÄÄÄÄÄÄÄÄÄÄÄPROTÄÄÄ(0)ÄÄ 0167:00485EB8 32 33 34 35 36 37 38 39-61 62 63 64 65 66 67 68 23456789abcdefgh 0167:00485EC8 69 6A 6B 6D 6E 70 71 72-73 74 75 76 77 78 79 7A ijkmnpqrstuvwxyz 0167:00485ED8 01 00 00 00 04 00 00 00-06 00 00 00 16 00 00 00 ................ 0167:00485EE8 0C 00 00 00 0F 00 00 00-0D 00 00 00 1B 00 00 00 ................ 0167:00485EF8 1C 00 00 00 1D 00 00 00-0D 00 00 00 04 00 00 00 ................ 0167:00485F08 04 00 00 00 09 00 00 00-09 00 00 00 0B 00 00 00 ................ 0167:00485F18 00 00 00 00 01 00 00 00-00 00 00 00 00 00 00 00 ................ 0167:00485F28 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄPROT32Ä Bon, c PARFAIT ! On a tout pour faire le keygen ! Comme d'hab, je me suis pas pris la tete,g repris EXACTEMENT la meme routine présente dans le prog, lol :) Ce qui me donne : lenght1 dd 0 ; compteur 1 lenght2 dd 0 ; compteur 2 stockage1 dd 50 dup (0) ; le stockage du serial intermediaire stocktout dd 50 dup (0) ; le stockage du serial table1 db 33h,36h,38h,71h,65h,68h,66h,76h,77h,78h,66h,36h,36h,62h,62h,64h ;la table 1 finaltable db 32h,33h,34h,35h,36h,37h,38h,39h,61h,62h,63h,64h,65h,66h,67h,68h,69h db 6Ah,6Bh,6Dh,6Eh,70h,71h,72h,73h db 74h,75h,76h,77h,78h,79h,7Ah ; la table 2 Key proc, Nom :dWord, Taille :Dword ; on crée la procédure Key et on ; déclare deux variables Nom et Taille xor eax,eax mov lenght1,eax mov lenght2,eax jmp goon beginkey: MOV EAX,lenght1 ADD EAX,01 goon: MOV lenght1,EAX CMP lenght1,10h JGE endkey MOV ECX,lenght2 CMP ECX,Taille JL saute MOV DWORD PTR [lenght2],00000000 saute: MOV EDX,offset table1 ADD EDX,lenght1 MOVSX EAX,BYTE PTR [EDX] MOV ECX,Nom ADD ECX,lenght2 MOVSX EDX,BYTE PTR [ECX] MOV ECX,lenght2 ADD ECX,EAX ADD EDX,ECX MOV stockage1,EDX MOV EDX,stockage1 AND EDX,1Fh MOV stockage1,EDX MOV EAX,lenght1 MOV ECX,stockage1 MOV DL,[ECX+finaltable] mov esi,offset stocktout MOV [EAX+esi],DL MOV EAX,lenght2 ADD EAX,01 MOV lenght2,EAX JMP beginkey endkey: xor ebx,ebx xor esi,esi Key EndP Il faut juste remplacer les ebp-XX par un label ,soit : EBP-1C= compteur1 = label 'lenght1' EBP-18= compteur2 = label 'lenght2' EBP-24= stockage intermediaire du serial = label 'stockage1' EBP-14= stockage final du serial = label 'stockagetout' EBP-20 = la taille du mail = label 'Taille' Et il faut définir deux endroits pour faire pointer le proggy sur les 2 tables,soit : 499BE4 = table 1 = label 'table1' 485EB8 = table 2 = label 'Finaltable' Franchement, je ne sais poa comment vous expliquer un peu mieux l'algo : ma routine est EXACTEMENT la meme que celle du proggy . G juste remplacé les EBP-0c,EBP-18, EBP-24 etc.., par des labels, c tout ! Le plus dur dans ce crack, c'est à mon avis de repérer la routine qui génère le serial . Après c'est juste du copier/coller, huhuh... Pour ce crack, run Ze KEyGen ! TaMaMBoLo/CC