Nom : MP3 EXplorer Version : 4.1 Url : http://www.mp3-explorer.com/download-fr.htm Protection : name+serial Tools : SoftICE TaSM mp3 - explorer est un explorateur de fichiers musicaux, il offre toutes les fonctions nécessaires à la gestion d'une grande collection de fichiers musicaux et il vous permet un accès direct à une sélection de sites web musicaux ainsi qu'à des moteurs de recherche .Ca a l'air sympa =) .On va se keygener ça en deux minutes ;p Cette fois on va utiliser un autre breakpoint pour attaquer le soft . Si vous tapez un email et un serial bidon dans la box pour débrider le soft, ce dernier vous balance un joli nag vous précisant que ce n'est pas le bon serial . A la tete de la box, je me suis rapidement dit que cela ne pouvait etre qu'un messagebox qui envoyait le message . On fait surgir SoftICE : CTRL + D . On entre notre breakpoint : BPX MessageBoxA . Et on relance avec F5 . On entre un email et un serial bidon (123456 par exemple) et on valide . BoOM ! SI se met en route et se bloque au début de l'api MessageBoxA . On fait une fois F11 et on se retrouve de nouveau dans windows . Mais en cliquant sur le 'ok' du nag , SI se remet en route . Et on tombe ici : 0167:0043B391 MOV ECX,[ESI+1C] 0167:0043B394 PUSH DWORD PTR [ESP+10] 0167:0043B398 PUSH EAX 0167:0043B399 PUSH DWORD PTR [ESP+10] 0167:0043B39D PUSH ECX 0167:0043B39E CALL [USER32!MessageBoxA]-- le messagebox 0167:0043B3A4 POP ESI------------------- on a atterrit ici avec SI 0167:0043B3A5 RET 000C Donc, nous sommes dans la procédure qui nous balance le nag . On trace un tout petit peu avec F10 et on arrive ici : 0167:00401A44 LEA ECX,[ESP+10] 0167:00401A48 CALL 0043D86D 0167:00401A4D MOV ECX,[ESP+0C] 0167:00401A51 PUSH 30 0167:00401A53 PUSH 00 0167:00401A55 PUSH ECX 0167:00401A56 MOV ECX,ESI 0167:00401A58 CALL 0043B376---- le call de la procédure appelant le nag 0167:00401A5D LEA ECX,[ESP+0C]- on est ici en traçant avec F10 0167:00401A61 MOV BYTE PTR [ESP+00000084],00 Bon, en traçant un tout petit peu avec F10 on a atterrit en 401A5D . Avec votre souris, remontez un peu dans le code . Et là, il y a pleins de trucs :) 0167:00401938 PUSH EBP 0167:00401939 PUSH ESI 0167:0040193A MOV ESI,ECX 0167:0040193C PUSH EDI 0167:0040193D PUSH 00 0167:0040193F LEA ECX,[ESP+1C] 0167:00401943 CALL 00402910 0167:00401948 LEA ECX,[ESP+18] 0167:0040194C MOV DWORD PTR [ESP+00000084],00000000 0167:00401957 CALL 004392AF ------- la boite qui nous permet de saisir un eamil & serial 0167:0040195C CMP EAX,01 ------- quelque chose a été saisi ? 0167:0040195F JNZ 00401A6E ------- non,on saute 0167:00401965 MOV EAX,[0047CCF4]-- sinon on traite les entrées de la boite 0167:0040196A MOV [ESP+0C],EAX 0167:0040196E PUSH ECX 0167:0040196F LEA EDX,[ESP+7C] 0167:00401973 MOV ECX,ESP 0167:00401975 MOV [ESP+14],ESP 0167:00401979 PUSH EDX 0167:0040197A MOV BYTE PTR [ESP+0000008C],01 0167:00401982 CALL 0043D031 0167:00401987 PUSH ECX 0167:00401988 LEA EAX,[ESP+7C] 0167:0040198C MOV ECX,ESP 0167:0040198E MOV [ESP+1C],ESP 0167:00401992 PUSH EAX 0167:00401993 MOV BYTE PTR [ESP+00000090],02 0167:0040199B CALL 0043D031 0167:004019A0 MOV ECX,0047FA08 0167:004019A5 MOV BYTE PTR [ESP+0000008C],01 0167:004019AD CALL 0040A110 --------- ici, on génère & compare le bon serial avec celui entré 0167:004019B2 TEST EAX,EAX --------- c'est bon ? 0167:004019B4 JZ 00401A3F --------- non ! on saute vers le nagscreen (bad boy) 0167:004019BA LEA ECX,[ESP+74] 0167:004019BE LEA EDI,[ESI+00000098] 0167:004019C4 PUSH ECX 0167:004019C5 MOV ECX,EDI 0167:004019C7 CALL 0043D3F5 0167:004019CC LEA EBP,[ESI+0000009C] Moi ce que je cherchais, c'était de me retrouver au début la procédure (saisie & comparaison du bon serial) . Or, en remontant un peu , on se trouve au début d'une belle procèdure ... Effaçons tous nos breakpoints (BC *) et mettons en un en 401938 . On ressaisit un email & un serial,sauf que la,SI se déclenche avant que l'on puisse entrer quoi que ce soit . Il s'est bloqué en 401938 . On trace avec F10 et en 401957 on a un CALL 4392AF . C'est lui qui nous permet de saisir un email & un serial . On entre email & serial ,puis on clique sur 'ok' . Et on se retrouve juste derrière le CALL 4392AF . Un petit test pour voir si on a bien saisit quelque chose dans les différents champs ; si tout est ok on continue . En continuant la trace avec F10 , on voit que l'on s'approche de quelque chose de très interressant : 0167:004019AD CALL 0040A110 0167:004019B2 TEST EAX,EAX 0167:004019B4 JZ 00401A3F Un call suivit d'un test sur le registre eax , à la sortie . Et selon le resultat, on saute ou pas vers le nag qui nous dit que le serial n'est pas bon ... Interressant =) Voyons voir ce qui se passe dans ce fameux call . Quand vous êtes à l'addresse 4019AD, faites F8 pour rentrer dans le CALL 40A110 . Et on tombe sur ceci : 0167:0040A110 PUSH FF 0167:0040A112 PUSH 00458D50 0167:0040A117 MOV EAX,FS:[00000000] 0167:0040A11D PUSH EAX 0167:0040A11E MOV FS:[00000000],ESP 0167:0040A125 PUSH ECX 0167:0040A126 PUSH EBP 0167:0040A127 PUSH ESI 0167:0040A128 PUSH EDI 0167:0040A129 LEA ECX,[ESP+24] 0167:0040A12D MOV DWORD PTR [ESP+18],00000001 0167:0040A135 CALL 00436601 0167:0040A13A LEA ECX,[ESP+24] 0167:0040A13E CALL 004365B5 0167:0040A143 MOV ECX,[ESP+24] 0167:0040A147 LEA EAX,[ESP+0C] 0167:0040A14B PUSH EAX 0167:0040A14C PUSH 00478AE0 0167:0040A151 PUSH ECX 0167:0040A152 CALL 00425D2F 0167:0040A157 MOV EDX,[ESP+2C] 0167:0040A15B ADD ESP,0C 0167:0040A15E XOR ESI,ESI 0167:0040A160 XOR EBP,EBP 0167:0040A162 MOV EDI,[EDX-08]--- la longueur de la chaine contenant notre email 0167:0040A165 CMP EDI,04 -------- est-elle > que 4 caractères ? 0167:0040A168 JGE 0040A19F------- oui, on saute vers la génération du serial 0167:0040A16A LEA ECX,[ESP+20]--- sinon, on sort de la routine (bad boy) 0167:0040A16E MOV BYTE PTR [ESP+18],00 0167:0040A173 CALL 0043D2BC 0167:0040A178 LEA ECX,[ESP+24] 0167:0040A17C MOV DWORD PTR [ESP+18],FFFFFFFF 0167:0040A184 CALL 0043D2BC 0167:0040A189 POP EDI 0167:0040A18A POP ESI 0167:0040A18B XOR EAX,EAX 0167:0040A18D POP EBP 0167:0040A18E MOV ECX,[ESP+04] 0167:0040A192 MOV FS:[00000000],ECX 0167:0040A199 ADD ESP,10 0167:0040A19C RET 0008 0167:0040A19F TEST EDI,EDI 0167:0040A1A1 JLE 0040A1BB 0167:0040A1A3 MOV EAX,[ESP+20] 0167:0040A1A7 MOVSX ECX,BYTE PTR [EAX+ESI]--- on prend chaque caractère de l'email 0167:0040A1AB PUSH ECX 0167:0040A1AC CALL 00425BF4 --- on passe le caractère en majuscule 0167:0040A1B1 ADD ESP,04 0167:0040A1B4 ADD EBP,EAX --- on additionne chaque caractère dans le registre EBP 0167:0040A1B6 INC ESI 0167:0040A1B7 CMP ESI,EDI 0167:0040A1B9 JL 0040A1A3 --- et on boucle tant que tout l'email n'est pas traité 0167:0040A1BB MOV ECX,[ESP+0C] 0167:0040A1BF MOV EDX,0001D4C0 --- on met 1D4C0 (hexa) dans EDX 0167:0040A1C4 SUB EDX,EBP -------- et on soustrait 1D4C0 avec l'addition de tous les caractères de l'email 0167:0040A1C6 XOR EAX,EAX 0167:0040A1C8 CMP ECX,EDX -------- on compare le serial bidon et le bon serial 0167:0040A1CA LEA ECX,[ESP+20] 0167:0040A1CE SETZ AL 0167:0040A1D1 MOV ESI,EAX 0167:0040A1D3 MOV BYTE PTR [ESP+18],00 0167:0040A1D8 CALL 0043D2BC 0167:0040A1DD LEA ECX,[ESP+24] 0167:0040A1E1 MOV DWORD PTR [ESP+18],FFFFFFFF 0167:0040A1E9 CALL 0043D2BC 0167:0040A1EE MOV ECX,[ESP+10] 0167:0040A1F2 MOV EAX,ESI 0167:0040A1F4 POP EDI héhéhé, c'est encore une fois, risible =) . Les premiers calls ne sont pas interressant pour nous (ils servent au proggy a convertir le serial que l'on a saisit) . Par contre, en 40A162, le soft recupère la longueur de la chaine de notre email ,et il la compare avec 4 . Si elle est supèrieure à 4,le proggy saute en 40A19F.Et le traitement de notre email commence . L'algo est archi-super simple (peut-on vraiment parler d'algo dans un cas pareil !) =) . Le soft prend chaque caractère de notre nom ( @ 40A1A7), récupère le caractère en majuscule dans EAX (@ 40A1AC) et additionne tous les caractères entre eux (@ 40A1B4).Et on finit par une petite soustraction entre 1D4C0h et le resultat de l'addition de tous les caractères =) lol :p En 40A1C8, le prog compare le serial bidon et le bon serial .Quand vous êtes là,faites ? ECX pour voir le serial bidon (123456 pour moi) et ? EDX pour le bon serial :) . Hihihi ,bah recoder ça ,c'est pas la mort :) Voici une procédure asm qui le fait très bien : mov ebx,eax ; eax = la longeur de la chaine (voir source) PUSH EBX MOV EAX,offset buffer ; on convertit l'email en majuscules PUSH EAX CALL CharUpperBuffA LEA ESI,[buffer] ;l'email dans esi XOR EBX,EBX ; ebx à 0 XOR EAX,EAX ; eax idem bcl: LODSB ;prends chaque caractère de l'email (charge AL/AX avec le contenu de DS:SI) OR AL,AL ; on est arrivé a la fin de la chaine (test avec 0) ? JZ sous ; oui, go à la soustraction ADD EBX,EAX ; sinon on additionne les caractères entre eux JMP bcl ; et on boucle sous: MOV EDX,0001D4C0h ;1D4C0h dans edx SUB EDX,EBX ;et on soustrait =) call _wsprintfA, offset finalserial, offset convert, edx ;convertion en decimal Le moins que l'on puisse dire, c'est que c'est court :) Pour convertir l'email en majuscules, je me suis servi de l'api CharUpperBuffA . Bah sinon la procédure pour générer le serial est pas très dure a comprendre =) Au lieu de mettre un truc aussi minable pour l'enregistrement de son soft, l'auteur aurait mieux fait de ne rien mettre =) TaMaMBoLo