Nom : Uninstall Manager Version : 3.10 Disponibilité : http://members.tripod.com/~umpage Protections : nag,name+serial Tools : Softice 4.0 Tasm 5.5 Uninstall Manager est un petit soft qui surveille tous les softs que vous installez et vous propose de faire des desinstallations propres,lol . Un peu comme Clean sweep.La protection du soft est standart : une periode de 30 jours d'essai avec des nags redondant . Une option pour entrer un name+serial est mis a notre disposition,histoire de nous faciliter la tache:) Comme nous on est des très bons(...),on va se faire un petit keygen vite fait bien fait :) . Step 1 : serial fishing Comme d'hab ,on va commencer par trouver le serial correspondant à notre nom. On va à l'option pour entrer un name+serial On tape notre nom et un serial bidon mais on ne valide poa.On fait surgir SI: CTRL D .On entre le breakpoint qui le fait bien quand on veut trouver un serial : BPX Hmemcpy et on relance le tout avec F5 . Cette fois on valide . BooM! SI se declenche . On est au début de l'api Hmemcpy . Pour en resortir et se retouver dans le code principal du proggy, on fait une backtrace avec F12 : on presse 12Fois F12 et on se retrouve ici : 0167:0047ADF8 CMP DWORD PTR [EBP-0C],00-12 fois sur F12,on arrive ici 0167:0047ADFC JZ 0047AE15 0167:0047ADFE LEA EDX,[EBP-10] 0167:0047AE01 MOV EAX,[EBP-04] 0167:0047AE04 MOV EAX,[EAX+000002F8] 0167:0047AE0A CALL 00430E4C--on verifie que kelke chose est entré dans le nom 0167:0047AE0F CMP DWORD PTR [EBP-10],00 0167:0047AE13 JNZ 0047AE27---- c bon on saute :) 0167:0047AE15 MOV EAX,[EBP-04] 0167:0047AE18 MOV DWORD PTR [EAX+0000022C],00000002 0167:0047AE22 JMP 0047B161 0167:0047AE27 MOV EAX,[EBP-04] 0167:0047AE2A CALL 0047A780----- et on compare le serial entré avec le bon 0167:0047AE2F CMP AL,01 0167:0047AE31 JNZ 0047B088 -- c poa bon ? on saute :( 0167:0047AE37 MOV DL,01 On repere tout de suite plein de chose insterressantes : en 47ADF8, on compare EBP-0C, qui est en fait le contenu de la case memoire correspondant au champ de saisie du serial, avec 0 . Si EBP-0C=0 on a rien entré dans le champ de saisie du serial, donc on effectue le saut conditionnel en 47ADFC. Ensuite on fait la meme chose mais avec le champ de saisie du nom . Si on a entré kelke chose dans le nom et dans le serial, on se retrouve en 47AE2A . C'est le CALL 47A780 qui va comparer le serial bidon avec le bon . Comment je le sais ? Bah.. après le CALL 47A780 le proggy va tester le registre AL avec 1 .Et si vous effectuez le saut en 47AE31,vous tomberez rapidement sur la boite de dialiogue 'invalide registration...' .A partir de la , c'est poa très dur d'en déduire que le test du serial se fait via le CALL 47A780.Donc une fois en 47AE2A, appuyez sur F8 pour rentrer dans le CALL 47A780.Et on continue la trace pour se retrouver rapidement devant ça : 0167:0047A7E0 XOR EBX,EBX 0167:0047A7E2 TEST EDI,EDI 0167:0047A7E4 JLE 0047A806 0167:0047A7E6 MOV EAX,00000001 0167:0047A7EB MOV EDX,[EBP-04]----- on met notre nom dans EDX 0167:0047A7EE MOV DL,[EAX+EDX-01]-- on prend chak caractères du nom que l'on fout dans DL 0167:0047A7F2 CMP DL,20 ----------- Est-ce un espace ? 0167:0047A7F5 JZ 0047A802--------- oui,passe au caractère suivant 0167:0047A7F7 MOV ECX,[EBP-04] 0167:0047A7FA AND EDX,000000FF 0167:0047A800 ADD EBX,EDX ----- et on fait une petite opération sur la valeur hexa du caractère 0167:0047A802 INC EAX 0167:0047A803 DEC EDI 0167:0047A804 JNZ 0047A7EB -- Tous les caractères ont été traité?non!boucle. 0167:0047A806 XOR EBX,00000089 - et finalement on fait encore une operation 0167:0047A80C XOR EBX,33-------- sur l'addition totale des caractères du nom 0167:0047A80F INC EBX----------- (plus la modif) 0167:0047A810 LEA EDX,[EBP-08] 0167:0047A813 MOV EAX,[ESI+000002F8] 0167:0047A819 CALL 00430E4C 0167:0047A81E MOV EAX,[EBP-08] 0167:0047A821 CALL 00408914 0167:0047A826 CMP EBX,EAX------ ici on compare le serial entré avec le bon :) 0167:0047A828 JNZ 0047A82E Rapidement on arrive en 47A7EE.Le prog va prendre chaques caractères du nom et les mettre dans le registre DL . A cette addresse faites E EAX+EDX-01 pour voir votre nom . On verifie que le caractère entré n'est poa un espace (20h en hexa correspond au caractère espace, rien koi :)).En 47A7F7 on reprend notre nom que l'on met cette fois dans le registre ECX (en 47A7EB on avait mis notre nom dans EDX ) . Et on fait un petit AND sur EDX et on additionne EDX et ECX, c tout ,lol :) .Tant que l'on a pas traité tous les caractères de notre nom, on boucle(c le saut conditionnel en 47A804).En fin de boucle on fait une dernière petite opération sur l'addition de notre boucle: 0167:0047A806 XOR EBX,00000089 0167:0047A80C XOR EBX,33 0167:0047A80F INC EBX Et on compare enfin le serial bidon avec le bon : c le CMP EBX,EAX qui se charge de cela ,en 47A826.Une fois à cette addresse faite ? EAX et ? EBX : EAX=Serial bidon EBX=Serial valide Bon ,bah ca va poa etre trop dur à keygener ca :)))) Il y a juste un petit truc que je n'ai poa abordé : le proggy , avant d'additionner tous les caractères de votre nom, va recopier ce dernier en minuscules . Comme je ne savais plus quelle api permettait de passer du texte en minuscules, je me suis poa fait chier, g utilisé l'option de VC++ qui fait ca automatiquement :) . Step 2 : Ze KeYGeN Si vous avez lu DN9, vous allez voir que le code n'est poa très différent d'un keygen qu'on a vu dans ce No :) . 'M suis poa trop fait chier encore une fois, g repris le code meme du proggy :)) : Key proc, Nom :dWord, Taille :Dword ; on crée la procédure Key et on ; déclare deux variables Nom et Taille uses edi, ebx ;on sauvegarde edi et ebx mov esi,00 ;---------- Esi va nous servir de stockage pour l'addition de ;nos lettres mov edx, Taille ;------- La taille du nom dans edx xor ebx,ebx ;-----ebx à 0 xor eax,eax ;-----eax idem NextCar: mov edi, Nom ;-------- le nom dans edi movzx ecx, byte ptr [edi+eax-1] ; --- la valeur de edi (nom) + eax (No de lettre) -1 cmp ecx,20h ;----le caractère est un espace ? je inccar ;---- oui ! passe au caractère suivant and ecx,0ffh ;-- petite operation sur add ebx,ecx ;-- chaque caractère du nom inccar: 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 XOR EBX,00000089h ;---et une petite opération XOR EBX,033h ;----- sur le resultat INC EBX ; ---- final mov eax,ebx ret ; ------------ terminé , @+ Key EndP Voilà ! C'est vraiment poa dure à keygener :). Comme d'hab, pour convertir le serial en valeur ascii (lisible à l'écran koi!:), je me sert de l'api _wsprintfA .Référez vous au source du keygen :) . TaMaMBoLo