Nom: DMNotes Version : 1.01 url : http://perso.club-internet.fr/dmessein/share.htm Protection : Name + serial Tools : SoftICE Tasm DMnotes petit soft permettant de gerer des notes et de les ranger dans diverses catégories . Encore une fois ,c'est un soft très facile a keygener,ideal pour debuter =) On lance le soft et on trouve rapidement l'option pour s'enregistrer . Si vous avez SoftICE qui tourne,vous allez planter . Le programmeur a cru malin de mettre des anti-SI .mdr. Faudra leurs expliquer que ça ne sert rien,sauf a nous ralentir ( 2s ;p ) .De plus, ceux la sont debiles (int 3..) . On lance Frogice (1.08.5b pour ma part) et on coche l'option 'bulletproof'. On relance le soft et on essaye de rentrer un serial et de valider . Cette fois ca marche beaucoup mieux =). Bon,bon,allons à la peche au serial :p On entre un nom,prenom & serial mais on ne valide pas . On lance SoftICE avec CTRL+D . Et on entre le breakpoint qui va bien pour recuperer les serials : BPX Hmemcpy . On relance le tout avec F5 et on valide la boite d'enregistrement . BoOM! SI se met en route .On est au début de l'api Hmemcpy. on fait une backtrace avec F12 (12 fois F12) et on se retrouve ici : 0167:004B7120 CALL 0042E444 0167:004B7125 MOV EAX,[EBP-18] -- on a atterrit ici 0167:004B7128 LEA EDX,[EBP-14] 0167:004B712B CALL 004080B4 0167:004B7130 MOV EDX,[EBP-14] 0167:004B7133 MOV EAX,ESI 0167:004B7135 CALL 0042E474 0167:004B713A LEA EDX,[EBP-18] 0167:004B713D MOV ESI,[EBX+000002D8] 0167:004B7143 MOV EAX,ESI 0167:004B7145 CALL 0042E444 0167:004B714A MOV EAX,[EBP-18] 0167:004B714D LEA EDX,[EBP-14] 0167:004B7150 CALL 004080B4 0167:004B7155 MOV EDX,[EBP-14] 0167:004B7158 MOV EAX,ESI 0167:004B715A CALL 0042E474 0167:004B715F LEA EDX,[EBP-18] 0167:004B7162 MOV ESI,[EBX+000002D4] 0167:004B7168 MOV EAX,ESI 0167:004B716A CALL 0042E444 0167:004B716F MOV EAX,[EBP-18] 0167:004B7172 LEA EDX,[EBP-14] 0167:004B7175 CALL 004080B4 0167:004B717A MOV EDX,[EBP-14] 0167:004B717D MOV EAX,ESI 0167:004B717F CALL 0042E474 0167:004B7184 LEA EDX,[EBP-08] 0167:004B7187 MOV EAX,[EBX+000002C4] 0167:004B718D CALL 0042E444 0167:004B7192 LEA EDX,[EBP-10] 0167:004B7195 MOV EAX,[EBX+000002D8] 0167:004B719B CALL 0042E444 0167:004B71A0 LEA EDX,[EBP-04] 0167:004B71A3 MOV EAX,[EBX+000002D4] 0167:004B71A9 CALL 0042E444 0167:004B71AE LEA EDX,[EBP-18] 0167:004B71B1 MOV EAX,[EBX+000002C4] 0167:004B71B7 CALL 0042E444 0167:004B71BC MOV EDX,[EBP-18] 0167:004B71BF LEA ECX,[EBP-14] 0167:004B71C2 MOV EAX,[EBX+000002E4] 0167:004B71C8 CALL 004B6810 ------ génération 1er serial 0167:004B71CD MOV EDX,[EBP-14] 0167:004B71D0 MOV EAX,[EBX+000002E0] 0167:004B71D6 CALL 0042E474 0167:004B71DB LEA EDX,[EBP-18] 0167:004B71DE MOV EAX,[EBX+000002D8] 0167:004B71E4 CALL 0042E444 0167:004B71E9 MOV EDX,[EBP-18] 0167:004B71EC LEA ECX,[EBP-14] 0167:004B71EF MOV EAX,[EBX+000002E4] 0167:004B71F5 CALL 004B6810 ------ génération 2eme serial 0167:004B71FA MOV EDX,[EBP-14] 0167:004B71FD MOV EAX,[EBX+000002EC] 0167:004B7203 CALL 0042E474 0167:004B7208 PUSH 004B7450 ------- contient "DM" 0167:004B720D LEA EDX,[EBP-18] 0167:004B7210 MOV EAX,[EBX+000002E0] 0167:004B7216 CALL 0042E444 0167:004B721B PUSH DWORD PTR [EBP-18] 0167:004B721E PUSH 004B745C ------- contient "2000" 0167:004B7223 LEA EDX,[EBP-1C] 0167:004B7226 MOV EAX,[EBX+000002EC] 0167:004B722C CALL 0042E444 0167:004B7231 PUSH DWORD PTR [EBP-1C] 0167:004B7234 PUSH 004B746C ------- contient "CYN" 0167:004B7239 LEA EAX,[EBP-14] 0167:004B723C MOV EDX,00000005 0167:004B7241 CALL 00403DC0 0167:004B7246 MOV EDX,[EBP-14] --- le serial final 0167:004B7249 MOV EAX,[EBX+000002DC] 0167:004B724F CALL 0042E474 0167:004B7254 LEA EDX,[EBP-0C] 0167:004B7257 MOV EAX,[EBX+000002DC] 0167:004B725D CALL 0042E444 0167:004B7262 MOV EAX,[EBP-04] --- le serial bidon 0167:004B7265 MOV EDX,[EBP-0C] --- le bon serial 0167:004B7268 CALL 00403E10 ------- compare le tout 0167:004B726D JNZ 004B7371 ------- c pas bon ? on saute ! (bad boy) bon ,héhéhé, c'est enfantin a comprendre :) On arrive en 4B7125 . Les premiers calls ne sont pas très interressant . Ils servent juste a traiter ce qui a été saisie dans la box d'enregistrement . On trace un peu avec F10 et on arrive en 4B71C8 ,CALL 004B6810 . On execute le call 4b6810 ainsi que l'instruction qui suit, MOV EDX,[EBP-14] . Et on fait E EDX . Tient, un serial dirait-on =) Mais si on continue un peu la trace avec F10 on tombe sur un autre CALL 004B6810. On execute aussi le MOV EDX,[EBP-14] et on fait E EDX . Hop, un deuxième serial . Si on regarde les entrées du CALL 004B6810, on s'apperçoit quelles sont différentes . Le premier génère un serial en fonction du nom et le second,un serial en fonction du prénom ... Pour finir , le prog va mettre 'DM' au debut du serial, '2000' entre le 1er & 2eme serial et enfin 'CYN' a la fin du deuxième serial . Le proggy compare le serial fianl & le serial bidon à l'@ 4B7268 ,CALL 00403E10 . Now, voyons voir comment le proggy s'y prend pour générer les serials . Lorsque vous etes a l'@ 4B71C8, faites F8 pour rentrer dans le call . On trouve ceci : 0167:004B6810 PUSH EBP 0167:004B6811 MOV EBP,ESP 0167:004B6813 ADD ESP,-0C 0167:004B6816 PUSH EBX 0167:004B6817 PUSH ESI 0167:004B6818 XOR EBX,EBX 0167:004B681A MOV [EBP-0C],EBX 0167:004B681D MOV [EBP-08],ECX 0167:004B6820 MOV [EBP-04],EDX 0167:004B6823 MOV EAX,[EBP-04] 0167:004B6826 CALL 00403EB4 0167:004B682B XOR EAX,EAX 0167:004B682D PUSH EBP 0167:004B682E PUSH 004B68B7 0167:004B6833 PUSH DWORD PTR FS:[EAX] 0167:004B6836 MOV FS:[EAX],ESP 0167:004B6839 XOR EBX,EBX 0167:004B683B LEA EAX,[EBP-0C] 0167:004B683E MOV EDX,[EBP-04] 0167:004B6841 CALL 00403B1C 0167:004B6846 MOV EAX,[EBP-0C] 0167:004B6849 CALL 00403D00 0167:004B684E MOV EDX,EAX 0167:004B6850 TEST EDX,EDX 0167:004B6852 JLE 004B687F 0167:004B6854 MOV EAX,00000001 0167:004B6859 CMP EAX,01 ----- debut de la génération du serial 0167:004B685C JZ 004B6868 0167:004B685E MOV ECX,[EBP-0C] 0167:004B6861 MOVZX ECX,BYTE PTR [EAX+ECX-02] -- prends chaque caratère du nom,le met dans ECX 0167:004B6866 JMP 004B686E 0167:004B6868 MOV ECX,[EBP-0C] 0167:004B686B MOVZX ECX,BYTE PTR [ECX] -- prends chaque caratère du nom,le met dans ECX 0167:004B686E MOV ESI,[EBP-0C] 0167:004B6871 MOVZX ESI,BYTE PTR [EAX+ESI-01] -- prends chaque caratère du nom,le met dans ESI 0167:004B6876 ADD EBX,ESI -- une petite addition entre les caractères 0167:004B6878 IMUL EBX,ECX -- et une multiplication a 2 francs =) 0167:004B687B INC EAX 0167:004B687C DEC EDX 0167:004B687D JNZ 004B6859 -- boucle tant que tout le nom n'est pas traité . 0167:004B687F LEA ECX,[EBP-0C] 0167:004B6882 MOV EDX,00000008 0167:004B6887 MOV EAX,EBX -- le serial dans EBX . 0167:004B6889 CALL 004082CC 0167:004B688E MOV EAX,[EBP-08] 0167:004B6891 MOV EDX,[EBP-0C] 0167:004B6894 CALL 00403B1C Et là, quand on voit l'algo qui génère le serial ,on rigole des genoux =) Le proggy prend chaque caractères du nom et fait deux opérations dessus : une addition et une multiplication .Le serial est stocké dans EBX . Ensuite ,il ne reste plus qu'a transformer le contenu du registre EBX en ascii . Ce qui n'est pas trop dur avec l'api _wsprintfA :) . Le deuxième serial est généré par la meme routine . C'est presque du foutage de gueule =) Pour recoder ça,bah copier/coller rox :) Je vous propose la procedure asm suivante : createKey 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 xor ebx,ebx ; ebx a zéro mov edx, Taille ;------- La taille du nom dans edx mov eax, 1 ;---------- on commence avec la première lettre NextCar: CMP EAX,01 JZ first MOV ECX,Nom MOVZX ECX,BYTE PTR [EAX+ECX-02] JMP second first: MOV ECX,Nom MOVZX ECX,BYTE PTR [ECX] second: MOV ESI,Nom MOVZX ESI,BYTE PTR [EAX+ESI-01] ADD EBX,ESI IMUL EBX,ECX INC EAX DEC EDX JNZ NextCar mov eax,ebx;---- on met le serial final dans eax ret ; ------------ terminé , @+ createKey EndP voila : c'est exactement la meme routine que celle du soft . Il faut quand meme rajouter 2/3 lignes de code pour mettre DM au debut du serial,2000 au milieu et CYN à la fin . De plus, l'api _wsprintfA , c'est bien pratique, mais si votre serial ne fait pas 8 chiffres, seuls les chiffres qui vuivent le zero seront recopiés en ascii (00A7E448 donnera A7E448 en ascii) . Il faut donc penser a ce cas la et coder une toute petite routine qui fera ça . Je vous conseille fortement de vous référer au label 'Generator' dans le code source . Une dernière chose : le nom doit obligatoirement etre en majuscule . Pas besoin rajouter du code ,il suffit juste de cocher l'option 'Uppercase' pour avoir des majuscules par defaut .Editez keygen.res avec Visual C++. Et quand vous saisissez votre prénom (a l'enregistrement du soft) ,pensez bien a mettre une majuscule sur la 1ere lettre de votre de votre prénom . Sinon le soft vous balancera que le serial n'est pas valide, alors qu'il l'est :) . TaMaMBoLo