Nom : Arclab Mailist controller Version : 1.0 Disponibilité : http://arclab.com Protection : NaMe + serial Tools : Soctice 4.0 Tasm Brain/ganja Arclab Mailist Controller (amc) est prog permettant de gérer vos différents comptes E-mail . L'interet d'un tel soft pour un particulier reste encore à déterminer... La protection du soft est assez simple : un Nom+serial qui permet de débrider le soft . Ce qui va etre interressant , c'est de faire le keygen qui est un peu plus dur que ceux que l'on a vu dans Drapeau noir 9 . Step 1 : serial fishing La première étape consiste bien entendu à trouver le bon serial : c'est tout de suite plus facile de faire le keygen quand on a le serial, lol :) . On lance le amc et on va à l'option pour rentrer un nom et un serial . On tape notre nom et un serial mais on ne valide poa : on fait surgir SI avant , en pressant CTRL D . On entre notre breakpoint pour pécher les serials : BPX Hmemcpy. On relance avec F5 et on valide le tout . BoOM ! SI se déclence . On est au début de l'API hemcpy : il faut faire une Backtrace avec F12 afin de revenir dans le code principale du proggy . On presse 21 fois F12 et on arrive ici : 015F:004175D9 CALL 0041B586 015F:004175DE PUSH 0042CE40 ----21 fois F12, on arrive ici 015F:004175E3 LEA ECX,[EDI+000001AC] 015F:004175E9 CALL 0041B586 015F:004175EE CMP DWORD PTR [0042CE48],01 015F:004175F5 JNZ 00417738 015F:004175FB LEA EBP,[EDI+000001EC] 015F:00417601 PUSH 0042CE44 015F:00417606 MOV ECX,EBP 015F:00417608 CALL 0041B586 015F:0041760D LEA ECX,[ESP+10] 015F:00417611 CALL 0041B58C 015F:00417616 PUSH 0042CE40 015F:0041761B LEA EAX,[ESP+18] 015F:0041761F PUSH 0042CE3C 015F:00417624 PUSH EAX 015F:00417625 MOV DWORD PTR [ESP+2C],00000000 015F:0041762D CALL 0041B550 015F:00417632 PUSH EAX 015F:00417633 LEA ECX,[ESP+14] 015F:00417637 MOV BYTE PTR [ESP+24],01 015F:0041763C CALL 0041B562----- ici on recopie la company à la suite du nom 015F:00417641 LEA ECX,[ESP+14]- voir contenu de ESP+14 015F:00417645 MOV BYTE PTR [ESP+20],00 015F:0041764A CALL 0041B54A 015F:0041764F PUSH ECX 015F:00417650 LEA EDX,[ESP+14] 015F:00417654 MOV ECX,ESP 015F:00417656 MOV [ESP+18],ESP 015F:0041765A PUSH EDX 015F:0041765B CALL 0041B6C4 015F:00417660 LEA EAX,[ESP+18] 015F:00417664 MOV ECX,0042CD38 015F:00417669 PUSH EAX 015F:0041766A CALL 00408AA0------- là, on calcule le serial en fonction du nom 015F:0041766F MOV EDX,[0042CE44]- le serial bidon 015F:00417675 MOV EAX,[EAX]------ le bon serial 015F:00417677 MOV ESI,EDX En pressant 21fois F12 on arrive en 4175DE . En traçant rapidement avec F10 on arrive à l'addresse 41766F : le serial bidon est mis dans EDX et en 417675, le bon serial est mis dans EAX .Peu après le proggy va comparer le tout . Si vous rentrer dans les différents calls (CALL 0041B550,0041B58C etc...), vous ne trouverez rien d'interressant . Sauf pour un call : CALL 00408AA0 . C'est lui qui va calculer le serial en fonction du nom et de la company . A noter le CALL 41B562 qui va recopier la company à la suite du nom . Par exemple , Name = TaMaMBoLo, company = Celebrity Crackers, va donner la chaîne finale : TaMaMBoLoCelebrity Crackers. Allons voir maintenant ce qui se passe de plus près dans le call qui génère le serial: CALL 00408AA0 , en 41766A . Une fois à cette addresse (41766a) on presse F8 sous SI pour rentrer dans le Call . Et en traçant avec F10 , on arrive rapidement à ceci : 015F:00408B42 MOV ECX,[ESP+3C] 015F:00408B46 MOV EDI,[ECX-08]----- ECX-08 = 0fh 015F:00408B49 CMP EDI,ESI 015F:00408B4B JLE 00408B94 015F:00408B4D MOV EBX,[00422504] 015F:00408B53 LEA EBP,[EDI*4+0042B768]--- on se sert d'une table kon stock dans EBP 015F:00408B5A MOV EDX,[ESP+3C] 015F:00408B5E MOV ECX,[EBP+00]------ prend la première valeur de la table et on la fout dans ecx 015F:00408B61 MOVSX EAX,BYTE PTR [EDX+ESI]-- on prend chak caractères du nom+company 015F:00408B65 LEA EDX,[ESP+1C] 015F:00408B69 LEA EAX,[ECX+EAX+7F]-------- ici on calcule la valeure de chak lettre 015F:00408B6D PUSH EAX kon stock dans eax 015F:00408B6E PUSH 0042BDDC--- le filtre de conversion 015F:00408B73 PUSH EDX 015F:00408B74 CALL EBX ------- ici on convertit la valeur obtenue pour une lettre en ascii 015F:00408B76 ADD ESP,0C 015F:00408B79 LEA EAX,[ESP+1C] 015F:00408B7D LEA ECX,[ESP+10] 015F:00408B81 PUSH EAX 015F:00408B82 CALL 0041B6FA 015F:00408B87 INC ESI 015F:00408B88 ADD EBP,04----- on additionne 4 à la table , pour passer à la valeur suivante 015F:00408B8B CMP ESI,EDI 015F:00408B8D JL 00408B5A--- et on boucle tant que ESI n'est poa egal à 0fh Voilà vous avez toute la génération du serial ... Le proggy commence par mettre 0fh dans ECX-8 : cela va servir de compteur au proggy (il va effectué 15 fois cette boucle) . La plus grande difficulté,à mon avis, c'est la table dont se sert le proggy pour générer le serial . En effet, le proggy va pointer sur une table qui contient certaines valeurs . Il est important de noter que cette table a des valeurs fixes, ce qui va nous faciliter la tache ,héhéhé... La PREMIèRE fois que vous arrivez à cette addresse vous faite sous SI : E EDI*4+0042B768 . Normalement vous devriez avoir ceci sous les yeux : ÄÄÄÄÄAMLC!.data+07A4ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄbyteÄÄÄÄÄÄÄÄÄÄÄÄÄÄPROTÄÄÄ(0)ÄÄ 0167:0042B7A4 07 00 00 00 08 00 00 00-05 00 00 00 03 00 00 00 ................ 0167:0042B7B4 07 00 00 00 03 00 00 00-01 00 00 00 03 00 00 00 ................ 0167:0042B7C4 06 00 00 00 01 00 00 00-03 00 00 00 04 00 00 00 ................ 0167:0042B7D4 04 00 00 00 08 00 00 00-06 00 00 00 01 00 00 00 ................ 0167:0042B7E4 07 00 00 00 03 00 00 00-04 00 00 00 09 00 00 00 ................ 0167:0042B7F4 04 00 00 00 06 00 00 00-07 00 00 00 03 00 00 00 ................ 0167:0042B804 09 00 00 00 06 00 00 00-08 00 00 00 07 00 00 00 ................ 0167:0042B814 05 00 00 00 06 00 00 00-02 00 00 00 07 00 00 00 ................ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄPROT32Ä Bon la première valeur de la table est 07 , la suivante 08 ,05,03,etc... Une fois que le proggy à stocker la 1ère valeur , il va stocker la première lettre du nom+company dans EAX : MOVSX EAX,BYTE PTR [EDX+ESI] . Ensuite, le proggy calcule la première valeur du serial pour la première lettre : c'est le LEA EAX,[ECX+EAX+7F] qui se charge de ça . Dans ECX on a la première valeur de la table (07), dans EAX la première lettre du nom+company (054h=T en ascii pour moi) et finit par rajouter 7fh au total .... Voilà, l'algo est décomposé : y'a plus qu'a keygener tout ça ! Step 2 : Keygen Bon , comme je l'ai dit plus haut, le plus dur (lol) c'est de pointer sur la table qui génère le serial ...Le reste , c'est du standart ... Je récapitule l'algo : 1. On recopie la company à la suite du nom 2. On pointe sur une table 3. On ajoute la valeur de la table , à la valeur hexa de chak caractère du nom+company et on rajoute encore 7fh au total . Moi g codé le truc de la façon suivante, toujours en AsM : table_valeur dd 7,8,5,3,7,3,1,3,6,1,3,4,4,8,6,1,7,3,4,9,0 ; la table Key proc, Nom :dWord ; on crée la procédure Key uses edi, ebx ;on sauvegarde edi et ebx mov esi,00 ;--------- on commence au début de la table mov edx,0fh ;------- La taille du nom dans edx mov eax, 0 ;---------- on commence avec la première lettre NextCar: mov edi, Nom ;-------- le nom dans edi movzx edi, byte ptr [edi+eax] ; --- la valeur de edi (nom) + eax (No de lettre) -1 MOV ECX,Table_valeur+esi ;------ On pointe sur la table LEA ecx,[ECX+EDI+7Fh] ;-- on additionne la valeur de la table, à la valeur ;hexa et on ajoute 7fh mov finalserial+eax,ecx ;- et on stocke le résultat dans une case mémoire add esi,4 ;--------------- on passe à la valeur suivante de la table inc eax ;----------------- on passe à la lettre suivante dec edx ;----------------- on soustrait -1 à la taille de notre nom jne NextCar ;------------- et on continue à traiter le nom si c poa finit ret ; ------------ terminé , @+ Key EndP Voilà , c'est vraiment tout con ! Après 'y a plus qu'a convertir en valeur ascii. Pour convertir, g comme d'habitude, utilisé l'api _wsprintfA . Ce qui me donne la routine suivante : mov esi,offset stockserial ;- on met le serial calculé précédement dans ESI mov edi,-3 boucle: mov eax,finalserial+edi call _wsprintfA, esi, offset conversion, eax ;et on convertit le tout en Ascii inc edi inc esi inc esi cmp edi,10h ;---- boucle effectuée 16 fois ? jne boucle ;---- non ! on boucle ... Je n'ai pas parlé du 1. de l'algo, étant donné qu'il n'y a rien à coder : j'ai utlisé l'API GetDlgItemTextA pour recopier la company à la suite du nom . Enfin bon, regardez le code principal du keygen ...:) TaMaMBoLo/CC