Cours n°2 - Y-a-t'il un debuggeur à bord?

 

        Ce dont vous avez besoin : Olly, PEID et le crackme : UnNagMe2

 

        Autant vous prévenir tout de suite :  les programmeurs savent que l'on cracke leurs programmes et ils usent de toutes les méthodes possibles pour empêcher celà! Les salauds!

        Je vais vous montrer ici un exemple très simple (mais alors très très simple) d'une méthode d'anti-debug.

        Juste pour vous montrer ce que ça donne, lancez le programme normalement => une MessageBox "OK".

        Maintenant ouvrez le avec Olly et appuyez sur F9 (Play) => une MessageBox "NAG"!

        Magique? Meuh non, simplement  anti-debique (oui j'ai honte parfois :p ).

 

Analyse du logiciel

        PEID nous apprend : rien! Faut pas croire, c'est pas toujours comme ça! Mais il faut vraiment que ça devienne une habitude avant de commencer l'analyse du code.

 

Analyse du code

        Voilons un peu ce code :

        On voit un appel que nous connaissons maintenant à l'API MessageBox (étrangement nous ne voyons que le bon message, pas le NAG, mais j'expliquerai ça plus tard), juste au dessus un peu de code que nous analyserons après mais surtout un appel à l'API IsDebuggerPresent. Pour ceux qui ne comprennent pas l'Anglais et dont le cerveau n'est plus très éveillé (le cracking se pratique surtout en heures tardives, voire matinales ;) ) cette API regarde si le programme tourne dans un environnement de debugging.

        Les API Windows, lorsqu'elles retournent une valeur, la placent dans eax.

        L'API IsDebuggerPresent retourne 0 dans eax si le programme ne tourne pas dans un environnement de debugging et autre chose que 0 dans le cas contraire.

        Regardons la ligne suivante :

        OR eax,eax

        JE short UnNagMe2.0040101E

        Si vous avez bien révisé, vous savez que OR 0,0=0 et OR 1,1=1. Ici en faisant un OR de eax avec lui même, on ne modifie pas eax (grâce à la règle que je viens de citer) mais on modifie les flags. Celui qui nous intéresse ici est le Zero Flag (ZF) qui sera positionné à 1 si eax=0 et à 0 si eax != 0. Vous me direz "Mais pourquoi ne pas faire un CMP alors?", tout simplement parce qu'un OR prend moins de place qu'un CMP et est plus rapide (même si maintenant ce n'est plus vrai je pense).

        Donc pour résumer, s'il n'y a pas de débuggeur, eax=0, donc le OR eax,eax va positionner le ZF et le saut conditionnel JE(=JZ  Jump if Zero) va nous faire sauter en 0040101E où on va afficher la MessageBox "OK".

        Regardons maintenant ce qui se passe si on ne saute pas, donc s'il y a un débuggeur.

        Nous avons trois XOR, mais ce qui est important c'est ce qui est xorré. C'est une adresse mémoire et si vous regardez l'adresse du texte de la MsgBox, c'est justement la même!

        Si vous passez en pas à pas(F8), vous verrez que ces trois XORs modifient le "OK" en "NAG".

 

Patching

       Bon ici c'est vraiment pour dire puisque le programme "fonctionne" si on le lance normalement.

       De nouveau pour ce crackme, plusieures manières de faire. J'ai choisi celle qui me semble la plus simple et qui ne modifie qu'un byte.

 

       On a vu que l'on sautait ou pas en fonction du débuggeur, il suffit donc de sauter dans tous les cas et ça sera bon!

       Pour cela, double-cliquez sur la ligne du JE (00401007) et remplacez le JE en JMP, cliquez sur Assemble et c'est fait! :D

 

Bon crack,                  

Crisanar         

[ << Cours n°1 ] [ Cours n°3 >> ]

 

Dernière mise à jour le 13/08/2004 18:45