Programme : CrackMe v3.0 (written by Cruehead / MiB) PlateForme : Windows 95 Date : 21h, 14 juillet 1998 Fichier : Crackme3.exe Outils : Soft-ice v3.2 Ou ça? : sur le net... Temps passé: quelques grosses minutes pour le crack, 2 heures environ pour la rédaction Cours : 12 Matos : Bloc-notes en 800*600 Encore un crackme (désolé, j'adore). Le CrackMe v2.0 étant trop facile je l'ai passé. =========================== 1. THE KEY FILE PROTECTION =========================== Enfin quelque chose de nouveau... Entrons directement dans le vif du sujet. -Avec le loader de SoftICE on lance le crackme et peut commecer à tracer dès le tout début du code. -Premier passage intéressant: XXXX:00401028 68D7204000 PUSH 00402D7 ;A cette adresse en trouve "CRACKME3.KEY" XXXX:0040102D E876040000 CALL KERNEL32!CreateFileA XXXX:00401032 83F8FF CMP,-01 ; Si en sortie EAX=FFFFFFFF alors le XXXX:00401035 750C JNZ 00401043 ; fichier crackme3.key n'existe pas XXXX:00401037 680E214000 PUSH 0040210E XXXX:0040103C E8B4020000 CALL 004012F5 ;rajoute la mention "Uncracked" XXXX:00401041 EB6B JMP 004010AE On va donc créer le fichier et au passage on met quelque chose dedans (n'importe quoi pour le moment). quelques lignes après... -Second passage intéressant: XXXX:0040105B FF35F5204000 PUSH DWORD PRT [004020F5] XXXX:00401061 E830040000 CALL KERNEL32!ReadFile XXXX:00401066 833DA021400012 CMP DWORD PTR [004021A0],12 XXXX:0040106D 75C8 JNZ 00401037 XXXX:0040106F 6808204000 PUSH 00402008 ;le contenu du fichier XXXX:00401074 E898020000 CALL 00401311 ;encodage du contenu du fichier XXXX:00401079 8135F...563412 XOR DWORD PTR [004020F9],12345678 XXXX:00401083 83C404 ADD ESP,04 XXXX:00401086 6808204000 PUSH 00402008 ;le contenu du fichier encodé (pour les XXXX:0040108B E8AC020000 CALL 0040133C ;14 premiers octets) XXXX:00401090 83C404 ADD ESP,04 XXXX:00401093 3B05F9204000 CMP EAX,[004020F9] ;cmp décisif... XXXX:00401099 0F94C0 SETZ AL Tout est là. Il y a deux call à explorer. Que fait donc ce crackme: - détecte la présence du fichier crackme3.key - lit son contenu et le met en 00402008 - Premier call, la routine lit les 14 premiers octets et pour chaque octet effectue un xor avec des valeurs respectives allant de 41 à 4E, l'octet est ensuite stocké à sa même place. En même temps chacun des résultats des xor sont additionnées en [004020F9] et donne ainsi un checksum sur 32bits Pour plus de clarté je vais prendre un exemple. Sur les 14 premiers octets du fichier je veux obtenir mon nom: L u c i f e r 4 8 4C75636966657234382020202020 le call effectue un xor: xor 4142434445464748494A4B4C4D4E ---------------------------- résultat: 0D37202D2323357C716A6B6C6D6E (soit 14 octets) La sommme de chaque octet fait au total: 000003D6 (4C+75+63+...+20) Après l'instruction xor (en XXXX:00401079) on obtient: 123455AE (stocké en 004020F9) - Deuxième call, la routine (très courte) lit des les octets 15,16,17 et 18 et les met dans EAX - En XXXX:00401093 l'ultime comparaison. Comment trouver les bons 4 derniers derniers octets afin que EAX=123455AE ? Première chose: la somme des 14 premiers (ayant subit un xor) ne peut en aucun cas dépasser 3 quartets. Donc dans tout les cas (i.e quelque soit la valeur des 14 premiers octets) on aura forcément un résultat du genre 12345xxx (après le xor évidemment) Cette constatation oblige donc à ce que les octets 17 et 18 aient pour valeur respective 34 et 12 (en héxa bien sûr) En ce qui concerne les octets 15 et 16 leur valeur doit être la même que celle trouvée c'est à dire AE et 55 (pour moi). Récapitulation: on créé un fichier de 18 octets (on a pas besion de plus) et on remplie avec: "0D,37,20,2D,23,23,35,7C,71,6A,6B,6C,6D,6E,AE,55,34,12" On essaye et "Good work cracker!" ============= 2. LE KEY-GEN ============= Comment ne pas finir avec the *Key File Generator* Etant donné que ce soir j'ai pas envie de faire de l'asm ce soir, vous vous contenterez du pascal (remarquez que l'un n'empêche pas l'autre). (*****************************************************************) Program Key_File_Generator_by_Lucifer_48; (* du 14 juillet 1998 *) Var s:string[14]; i,a:byte; somme:longint; f:file; Begin Assign(f,'crackme3.key'); Rewrite(f,1); Writeln('* KeY FiLe GeNeRaToR by LUCIFER48 *'); Writeln; Write('Votre nom (max 14 car): '); Readln(s); For i:=Length(s)+1 to 14 do s:=s+' '; (* comble si besoin avec des esp *) somme:=0; For i:=1 to 14 do somme:=somme+ord(s[i]); somme:=(somme XOR $12345678); (* calcul du checksum *) For i:=$41 to $4E do begin (* 14 boucles *) a:=(i XOR ord(s[i-$40])); Blockwrite(f,a,1); (* ecrit octet par octet *) End; {for} Blockwrite(f,somme,4); (* ecrit les 4 derniers octets *) Writeln('Le fichier CRACKME3.KEY a ete cree avec succes.'); End. (*****************************************************************) Voilà. A la prochaine...