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...