Name: Lucifer48 Serial Number: 6280-076-8 Name: LUCIFER48 Serial Number: 4429-504-0 Programme : JavaScript Scrambler Cathégorie : Utilitaire PlateForme : Windows 95/NT Date : 21h, 21 juin 1998 Version : v1.0 Protection : Registration (via Serial Number) Fichier : Jsscram.exe Outils : Soft-ice v2.0 Ou ça? : CD n°26 de PcTeam / http://members.tripod.com/~tier Temps passé: Quelques minutes (+ quelques dizaines de minutes pour la rédaction) Cours : 03 Les novices parlent aux novices... (en 800*600) - Menu Register, je remplis le nom et je mets un serial bidon (ne pas appuyer sur entrée pour l'instant). - je vais dans Soft-ice (i.e. j'appuie sur sur CTRL+D). - je mets un breakpoint, le célébrissime hmemcpy (i.e. je tape bpx hmemcyp). - F5, je click sur le button "Register" et ça reviens immédiatement sous soft-ice - Je désactive mon bp (en faisant bd0 ou bc0 pour carrément l'effacer) - Je cherche en mémoire mon serial, je tape S 0 L FFFFFFFF "nom_serial_bidon" Et je met un breakpoint dessus (via BPM) - F5 et zou je commence à tracer... (avec F10) - A un moment le message fatal arrive: "The serial number you entered, was wrong!" Dans le code vous êtes ici: XXXX:0042B630 MOV EAX,[EBX+000001B8] XXXX:0042B636 CALL 00428C74 XXXX:0042B63B JMP 0042B672 XXXX:0042B63D MOV EAX,0042B770 XXXX:0042B642 CALL 0042733C < Méchant CALL qui affiche la bôâte XXXX:0042B647 XOR EDX,EDX A partir de là, il va faloir remonter dans le code. A commencer par le ligne du dessus: un jmp... c'est gros comme une maison... a mon avis le serial est bon alors on exécute ce saut. Il va donc faloir trouver un saut conditionnel Jxx 0042B63D. On remonte dans le code (moi j'utilise CTRL + UpArrow), on remarque au passage qu'il n'y a que des mov des call. Et voilà le saut apparaît sous nos yeux... voiça donc THE passage intéressant XXXX:0042B53F E8687FFDFF CALL 004034AC XXXX:0042B544 83F804 CMP EAX,04 < Si le nom est inférieur à 5 caractères XXXX:0042B547 0F8EF0000000 JLE 0042B63D XXXX:0042B54D 8D4DF4 LEA ECX,[EBP-0C] XXXX:0042B550 8B55FC MOV EDX,[EBP-04] XXXX:0042B553 8BC3 MOV EAX,EBX XXXX:0042B555 E802FCFFFF CALL 0042B15C < Génère le code... XXXX:0042B55A 8B45FA MOV EAX,[EBP-0C] XXXX:0042B55D 8B55F8 MOV EDX,[EBP-08] XXXX:0042B560 E85780FDFF CALL 004035BC < Compare le code entré XXXX:0042B565 0F85D2000000 JNZ 0042B63D XXXX:0042B56B C6052CC7420001 MOV BYTE PTR [0042C72C],01 ... Si le saut (JNZ) est exécuté alors le message "The serial number you entered, was wrong!" apparaît. L'instruction CMP regarde si notre nom entrée fait plus de 4 caractères sinon au quitte. On devine tout de suite que le premier call (en 0042B555) génère le code et que le deuxième call (0042B560) compare le serial entré préalablement. Le cracker de base va avoir tendance à NOPer le jnz ou à remplacer pae jz ou autres choses mais cela n'est pas très judicieux. En effect NOPant le menu register s'efface et le soft est bien enregistré mais en relancant... c'est try again, insert coins. Un peu d'intuition nous amène à découvrir qu'un fichier JSScrambler.ini à été créé dans le repétoire windows, évidemment il contient notre serial qui ne marche pas. Alors que faire? J'ai pas envie de me prendre la tête à cherche la vérification dans le .ini . Dans donc le vrai serial ce sera plus simple. Etant donné que notre nom entré doit excéder 4 caractères, il doit y avoir un calcul sur ce nom, on suppose donc que le serial calculé sera supérieur à 32bits et fatalement le code est stocké quelque part en mémoire (après bien sûr l'appel du CALL 0042B15C). Ou ça qu'il est? Réfléchissons un peu: si j'écris une procédure de comparaison de deux chaînes, quels arguments je doit fournir? La chaîne de départ et la chaîne d'arriver (logique). Et qu'est-ce qu'on voit juste avant le call... oh deux mov... Sous soft-ice je tape D EDX et je vois s'afficher mon serial bidon. je tape D EAX et le bon serial s'affiche Ultime remarque: le breakpoint (BMP) n'est en réalité pas indispensable, via F10 on arrive au même résultat (heureusement).