Les 2 techniques les plus basiques pour cracker un programme sont:
-Regarder les text strings
-Mater les appels dans la pile
Je vous en propose une troisième:
Mettre des breakpoint sur des fonctions spécifiquesLe prog, un crackme que je vous ai codé (code source à la fin) :
https://www.dropbox.com/s/u64y765zl7vhudv/crackme.exeC'est du 100% ligne de commande, il prend le mot de passe en argument dans la ligne de commande.
Donc soit vous ouvrez avec cmd.exe etc, soit vous créez un .bat à coté avec dedans:
crackme.exe password
pause
Donc, on ouvre dans ollydbg,
on va lui mettre un argument avec ce menu, on met 123456789 pour tester:
http://image.noelshack.com/fichiers/2012/33/1344872852-0.pngUne fois que c'est fait, il faut
relancer avec le bouton ou CTRL+F2Pour tenter l'approche classique, on cherche les text strings et... Fail:
http://image.noelshack.com/fichiers/2012/33/1344872989-00.pngIl va falloir trouver une autre solution.
Cette solution sera de s'arrêter sur des fonctions qu'on suspecte de jouer un rôle dans la vérif du serial.
Donc on va aller
cliquer sur le bouton E bleuOn voit les modules chargés, on fait
clic droit sur crackme > View namesCa nous affiche toutes les fonctions utilisées par le programme:
http://image.noelshack.com/fichiers/2012/33/1344873096-1.pngRien de très flagrant, à part
memcmp, qui pourrait servir à comparer des données en mémoire.
On fait donc
clic droit dessus, set breakpoint on every referenceLe programme va s'arrêter à l'appel de memcmp, ce qui nous permettra d'analyser ce qui se passe.
Donc on lance avec F9, et
on regarde la pile quand ça s'arrête:
http://image.noelshack.com/fichiers/2012/33/1344873219-2.pngVoilà les paramètres de memcmp.
s1, s2 et n.
n c'est le nombre de caractères à comparer, ici 10.
s1 et s2 ce sont les chaines comparées.
On fait
clic droit sur s1 > Follow in dump:
http://image.noelshack.com/fichiers/2012/33/1344873557-3.pngCa nous permet de voir les données brutes de s1.
"01 02 03 04 05 06 07 08 09"...Tiens,
c'est le 123456789 qu'on a entré 
On fait
clic droit sur s2 > Follow in dump:
http://image.noelshack.com/fichiers/2012/33/1344873664-4.png01 07 05 04 06 03 02 09 08 08Donc en fait
le pass est 1754632988...
http://image.noelshack.com/fichiers/2012/33/1344873765-7.pngVoilà !
Le code source du programme était:
#include <stdio.h>
#include <stdlib.h>
void pc(int c)
{
putc(c^0xCC,stdout);
}
int main(int argc,char* argv[])
{
char password[]={1,7,5,4,6,3,2,9,8,8,0};
unsigned char msg[]={'B'^0xCC,'a'^0xCC,'d'^0xCC,0xCC};
unsigned char msg2[]={'G'^0xCC,'o'^0xCC,'o'^0xCC,'d'^0xCC,0xCC};
char* buf=argv[1];
if(argc==1) buf=main;
int i;
for(i=0;buf[i]!=0;i++)
buf[i]-=0x30;
if(memcmp(buf,password,10)==0)
for(i=0;msg2[i]!=0xCC;i++)
pc(msg2[i]);
else
for(i=0;msg[i]!=0xCC;i++)
pc(msg[i]);
}
On peut voir que j'ai appliqué un XOR au texte pour qu'on puisse pas le trouver
