Bon on commence par étudier le prog : Il demande un nom d'utilisateur et un serial. Malheuresement il fait le difficile quand je lui donne sirius01 et 666fuckyou. (même en étant plus poli style je lui donne 'password' en login et 'stp' en pass il veut pas, c'est vraiment de la mauvaise volonté ;-)
Alors on se dit qu'il va nous laisser passer de grès ou de force !!!
Quand ca marche pas on obtient :
_________________________________
__* Snif *________________________|
   Meuh faut reflechir + ke ca !!!           |
                                         (OK)         |

Elle est belle ma boite de dialogue hein ?

Alors on va dans Win32Dasm, on regarde les strnRef et on voit que ya pas "Meuh..."
En revanche ya *Snip* mais si on regarde autour ya que des strcpy et pi encore en haut (si on cherche d'ou on vient) on tombe sur du code chelou dans lequel on veut
pas mettre les pieds. Toutes ces strcpy servent a mettre des chaines de caractères dans des vaiables, comme si le concepteur avait fait des titre="*Snip*" (affectation).

On remarque aussi des chaines qui pourraient etre un serial (LET-154873201478-FGHB) ou un login (An-Mojeg) mais ca semble trop beau pour etre vrai, d'ailleurs ca
marche pas.

Il y a alors plusieurs facons (different ways) de cracker ce prog :

The moulu way (La facon du lucky man) : dans votre lassitude (ou votre curiosité), vous descendez de quelques lignes et vous tombez sur deux strcmp suivi d'un
MessageBoxA, schéma classique d'une vérification login / password puis affichage de la validite des informations.
Vous cochez les cases Enables ... de WinDasm et le Stop auto on API.
Vous posez des breaks sur les deux fonctions strcmp et vous vous appercevez qu'il compare 'sirius01' avec 7Sk-An-Mojeg puis il saute sur 00401365 qui n'est autre que
la mechante message box !!
Comme on aimerait bien connaitre le serial, on relance le prog avec '7Sk-An-Mojeg' et '666fuckyou' en serial. On a strcmp('666fuckyou','LET-154873201478-FGHB'); c clair non ?
Voici le code :

:00401325 68FF304000 push 004030FF <- la brute
:0040132A 6863314000 push 00403163 <- le bon

* Reference To: KERNEL32.lstrcmpA, Ord:02D6h <-- On compare les usernames
|
:0040132F E868030000 Call 0040169C
:00401334 83F800 cmp eax, 00000000
:00401337 752C jne 00401365 <-- saut vers '*Snif*'
:00401339 6831314000 push 00403131 <- le truand
:0040133E 6895314000 push 00403195 -< le bon

* Reference To: KERNEL32.lstrcmpA, Ord:02D6h <-- on compare les serials
|
:00401343 E854030000 Call 0040169C
:00401348 83F800 cmp eax, 00000000
:0040134B 7518 jne 00401365 <-- bad boy
:0040134D 6A00 push 00000000
:0040134F 68C7314000 push 004031C7
:00401354 68DB314000 push 004031DB
:00401359 FF7508 push [ebp+08]

* Reference To: USER32.MessageBoxA, Ord:01BBh <-- good boy
|
:0040135C E8F3020000 Call 00401654
:00401361 C9 leave
:00401362 C21000 ret 0010

Une facon plus brute ? Ba on fait un break sur tous les strcmp (yen a que 5) avec les infos de w32dasm et ca revient au même.

Facon 'Allez j'me touche !!!'
Vous désassemblez le prog, vous vous mettez sur l'entry-point, vous regardez en bas de la fenêtre, vous voyez : Code Date @:00401040 @Offset 00000440h. Ca va nous permettre de faire la conversion Code <-> Offset.
Vous ouvrez le crackme avec un éditeur hexa. Vous cherchez "Meuh faut reflechir + ke ca !!!". Vous le trouvez a l'offset 6A0.
Vous calculez le magic number : 401040 - 440 = 400C00.
On fait 6A0 + 400C00 = 004012A0 c'est l'adresse de la chaine sous w32dasm.
Donc on fait une recherche sur 'push 004012A0', on a un seul résultat :

:00401316 68A0124000 push 004012A0 <-- ici
:0040131B 6849324000 push 00403249

* Reference To: KERNEL32.lstrcpyA, Ord:02DCh
|
:00401320 E87D030000 Call 004016A2

On est un peut décu car on aurait préféré que ce soit une MessageBox. Bon le strcpy a deux arguments, la source et la destination. Ici la chaine d'erreur est mise en 403249.
On recherche 'push 00403249' on a deux occurences dont celle que l'on vient de voir.
Donc la bonne est la :

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401337(C), :0040134B(C)
|
:00401365 6A00 push 00000000
:00401367 683F324000 push 0040323F
:0040136C 6849324000 push 00403249 <--ici
:00401371 FF7508 push [ebp+08]

* Reference To: USER32.MessageBoxA, Ord:01BBh <-- on affiche bad boy
|
:00401374 E8DB020000 Call 00401654

On est alors dans le cas d'un crack classique : On a le message d'erreur, on revient à la source : 00401337 et 0040134B. On s'appercoit que c'est deux strcmp et ksi on pose des breaks dessus et bien on connait la suite.

Comment on cracke le prog ? Ben on nop les deux sauts conditionnels.
Pour faire le crack on reprend l'exemple de An-Mojeg, on le modifie un peu et puis voila :

#include <stdio.h>
#include <stdlib.h>

void noper(FILE *f, long offset)
{
  int i;
  for (i=0;i<2;i++,offset++)
  {
    fseek(f,offset,SEEK_SET);
    fprintf(f,"%c",0x90);
  }
}

void main()
{
  FILE *crck = fopen("crackme1.exe", "r+");

  if(!crck){
    printf("Erreur lors de l\'ouverture du fichier\n");
    system("pause");
    exit(0);
  }

  noper(crck,1847L);
  noper(crck,1867L);

  fclose(crck);

  printf("Fichier cracke. sirius_black\nmembres.lycos.fr/lotfree\n");
  system("pause");
}