######{{{{{{{{|||||||||||||||||}}}}}}}}###### ~~éè$$$¤¤¤--)( KeyGen Tutorial )(--¤¤¤$$$éè~~ ######{{{{{{{{|||||||||||||||||}}}}}}}}###### Nom : Photosliders Version : 2.1 Disponibilité : http://members.xoom.com/nadey http://www.photoslider.8m.com Protection : nag, serial+name Tools : Softice 4.0 Tasm 5.0 Brain/Ganja/Coca Etc.. Comme son nom l'indique, photosliders est un proggy qui permet de faire des Slideshows . Comme pour le tut de La Calculatrice Rapide, l'algorythme qui calcule le serial en fonction du nom est très simple . Idéal aussi pour se faire la main . Dans cet exemple , je me suis poa fait chier : j'ai repris EXACTEMENT la meme routine qui génère le serial dans le proggy, pour la mettre dans mon générateur . lol:) Step 1 : Serial Fishing Comme d'hab, on va à la peche au serial avant de commencer notre keygen (c'est tout de suite plus facile..) . On lance le proggy et on va à l'option qui permet de rentrer un nom + un serial . On tape notre nom et un serial bidon mais ON NE VALIDE POA ! On fait surgir SI : CTRL D . Et on entre notre breakpoint de la mort pour catcher un serial : BPX HMEMCPY . Et on relance avec F5 . Ce coup-ci on peut valider . Paf! SI se déclenche .On est au début de l'API HMEMCPY . Pour en sortir , on fait une backtrace en pressant 12 Fois sur F12 . Et on arrive à ceci : 015F:004B0301 CALL 004327DC 015F:004B0306 MOV EAX,[EBP-14] ------notre nom 015F:004B0309 LEA EDX,[EBP-0C] 015F:004B030C CALL 004081BC 015F:004B0311 LEA EDX,[EBP-14] 015F:004B0314 MOV EAX,[EBP-04] 015F:004B0317 MOV EAX,[EAX+0000034C] 015F:004B031D CALL 004327DC --------- On passe tous les caractères du nom en majuscules 015F:004B0322 MOV EAX,[EBP-14]------ le serial bidon 015F:004B0325 LEA EDX,[EBP-10] 015F:004B0328 CALL 004081BC 015F:004B032D LEA EAX,[EBP-08] 015F:004B0330 CALL 00403AD8 015F:004B0335 XOR EDI,EDI 015F:004B0337 MOV EAX,[EBP-0C] 015F:004B033A CALL 00403D54 015F:004B033F MOV ESI,EAX 015F:004B0341 TEST ESI,ESI 015F:004B0343 JLE 004B0371 015F:004B0345 MOV EBX,00000001 015F:004B034A MOV EAX,[EBP-0C]---- 015F:004B034D CALL 00403D54 | 015F:004B0352 SUB EAX,EBX | 015F:004B0354 MOV EDX,[EBP-0C] | 015F:004B0357 MOV DL,[EAX+EDX] | ici le programmeur essaie 015F:004B035A LEA EAX,[EBP-18] | 015F:004B035D CALL 00403C7C | de nous embrouiller 015F:004B0362 MOV EDX,[EBP-18] | 015F:004B0365 LEA EAX,[EBP-08] | la tête , mais ca marche 015F:004B0368 CALL 00403D5C | 015F:004B036D INC EBX | poa, lol . 015F:004B036E DEC ESI | 015F:004B036F JNZ 004B034A | 015F:004B0371 MOV EAX,[EBP-08]---- 015F:004B0374 CALL 00403D54 015F:004B0379 MOV ESI,EAX 015F:004B037B DEC ESI 015F:004B037C TEST ESI,ESI 015F:004B037E JLE 004B03A1 015F:004B0380 MOV EBX,00000001 L'algorythme de la génération du serial commence ici : 015F:004B0385 MOV EAX,[EBP-08]--- ici le calcul du serial 015F:004B0388 MOVZX EAX,BYTE PTR [EBX+EAX-01] en fonction du nom 015F:004B038D MOV EDX,[EBP-08] 015F:004B0390 MOVZX EDX,BYTE PTR [EBX+EDX] 015F:004B0394 IMUL EDX ------------- et une petite operation sur le serial 015F:004B0396 CDQ 015F:004B0397 XOR EAX,EDX 015F:004B0399 SUB EAX,EDX 015F:004B039B ADD EDI,EAX 015F:004B039D INC EBX 015F:004B039E DEC ESI 015F:004B039F JNZ 004B0385 Fin génération du serial . 015F:004B03A1 LEA EAX,[EBP-0C] 015F:004B03A4 PUSH EAX 015F:004B03A5 MOV [EBP-20],EDI 015F:004B03A8 MOV BYTE PTR [EBP-1C],00 015F:004B03AC LEA EDX,[EBP-20] 015F:004B03AF XOR ECX,ECX 015F:004B03B1 MOV EAX,004B046C 015F:004B03B6 CALL 00409158 015F:004B03BB MOV EAX,[EBP-0C]------ le bon serial dans ebp-0c 015F:004B03BE MOV EDX,[EBP-10]------ le serial bidon 015F:004B03C1 CALL 00403E64 --------- Et on compare le tout 015F:004B03C6 JNZ 004B0420 --------- c bon ? oui ! on saute 015F:004B03C8 MOV EAX,004B0478------ sinon fake message (Error!) 015F:004B03CD CALL 00453CBC 015F:004B03D2 MOV EAX,[004C80A0] 015F:004B03D7 MOV BYTE PTR [EAX],01 Bon,ça va aussi vite de trouver le serial que de le keygener ... En pressant 12 fois sur F12 on arrive en 4B0306 . On trouve notre nom dans EBP-14 . En continuant la trace avec F10, on arrive en 4B03BB . Dans EBP-0C, le bon serial tu trouveras et dans EBP-10 (à l'addresse 4B03BE ) le fake serial qu'on a entré. Pour moi le serial est A71B . Step 2 : keygener tout ça Bon, la décomposition de l'algorythme est relativement simple . En fait si, c trop facile pour être vrai...En pressant 12 fois sur F12 on est arrivé en 4B0306. En continuant la trace avec F10 on s'apperçoit rapidement que le proggy va recopier le nom qu'on a entré en majuscules (voir commentaires) . Ensuite il y a toute une partie du proggy qui ne nous sert à rien : je suis poa sur mais je crois que c'est pour nous embrouiller.Le prog va recopier toutes les lettres du nom, mais en commençant par la fin . Seulement après , il ne sert poa notre nom recopié à l'envers ... Par contre en 004B0385 commence la vraie génération du serial . Si vous avez lu le tut sur la calculatrice rapide , vous remarquez que la routine qui prend chaque caractère du nom est sensiblement la même : MOVZX EDX,BYTE PTR [EBX+EDX] C'est souvent un MOVZX XXX,BYTE PTR [XXX+XXX] qui prend chaque charatère du nom : quand vous voudrez écrire des keygens, c'est cette instruction qu'il faut repérer. La génération du serial étant souvent juste après ...Sauf que par rapport au tutor 1,il y a deux MOVZX XXX,BYTE PTR [XXX+XXX] .Le premier est en 4B0388 . Bon ce MOVZX EAX,BYTE PTR [EBX+EAX-01] va prendre la première lettre de notre nom et la stocker dans EAX.Le MOVZX EDX,BYTE PTR [EBX+EDX] va prendre la lettre suivante de votre nom et la stocker dans EDX . Ce MOVZX est suivit de : IMUL EDX Une fois les lettres catchées et mises dans EAX et EDX via le MOVZX, on fait une multiplication entre le registre EDX & EAX . Et on va stocker le tout dans le registre EDI . Cette opération sera effectuée autant de fois qu'il y a de caractères dans le nom . La boucle se termine en 4B03A1 . Quand vous êtes à cette addresse, regardez le contenu de EDI : pour TaMaMBoLo , EDI=A71B . Et A71B , c'est le serial correspondant à mon nom... Boa voilà, cherchez poa plus loin, on a toute la routine qui génère le serial ... Il n'y a plus qu'a convertir le contenu de EDI (A71B) en valeur ascii de façon à ce qu'on puisse l'afficher à l'écran sous forme ascii (ba vi, pour l'instant on a le résultat de l'encodage mais en hexa, faut l'afficher maintenant).C'est comme pour le tut de la Calculatrice,c'est l'API _wsprintfA sauf que c'est un autre filtre: %x . Pour recopier tous les caractères du nom en majuscules, c'est très simple aussi en asm . Il y a l'api CharUpperBuffA qui se charge de ça... La génération du serial donne cela : 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 mov ebx, Taille ;la taille du nom dans ebx PUSH EBX MOV EAX,Nom PUSH EAX CALL CharUpperBuffA ;on recopie le nom en majuscules mov esi,00 mov esi, Taille xor edi,edi ; on fout EDI à zéro : on va s'en servir pour stocker le serial xor eax,eax MOV EBX,00000001 ;on commence avec la première lettre NextChar: mov eax, Nom ;j'ai repris exactement la meme routine que le soft movzx EAX,BYTE PTR [EBX+EAX-1] ;la première lettre dans EAX MOV EDX,Nom MOVZX EDX,BYTE PTR [EBX+EDX] ;la suivante dans EDX IMUL EDX ; et on multiplie EAX et EDX ensemble ADD EDI,EAX ;on stocke le résultat de la multiplication dans EDI inc ebx ; on passe à la lettre suivante dec esi ; on enlève -1 à la taille du nom jnz NextChar ;taille=0 ? non on continue ! xor eax,eax mov eax,edi ;et on fout le serial final dans eax,pour pouvoir l'afficher ret Key EndP Voilà ! C'est vraiment poa compliquer de keygener ce truc ... Comme à chaque fois que vous voulez keygener un truc, le plus dur c'est de trouver la génération du serial . Après la reprogrammer c'est poa ce qu'il y a de plus dur .. Référencez vous au source complet de ce keygen pour piger comment la convertion hexadécimal/Ascii est faite (je rappelle que c'est l'API _wsprintfA qui nous facilite la tache) . Voilà,voilà... Pour ce crack : name/TaMaMBoLo serial/A71B , ou utiliser le kergen ..:) TaMaMBoLo