Page de mes tutoriels
Comment cracker des Nags-screens


image


Dans ce cours, nous allons voir comment supprimer des nags sur un Crackme. Ce petit tutoriel s'adresse tout particulièrement aux newbies car la solution est très simple. La méthode est semblable à celle utilisée dans le tuto sur StealthPE, lui aussi disponible sur le site.

Il est fort probable qu'il existe d'autres solutions hormis celles que j'ai proposées, n'hésitez donc pas à poster les vôtres !


Je rappelle que je ne peux en AUCUN CAS être tenu pour responsable d'un dommage survenant sur votre PC lors de la mise en pratique de ce tuto.


image


Prérequis :


Vous aurez besoin de connaître le fonctionnement d'OllyDbg, et d'avoir des connnaissances en assembleur, sinon vous n'irez pas très loin.


Voici une introduction à OllyDbg par Crisanar : ./tutos/archives/Crisanar/introOlly.html


Pour l'assembleur, j'ai sélectionné deux cours très bien faits, accessibles aux débutants mais proposant tout de même une approche assez complète.

Cours de Deamon : ./tutos/archives/deamoncrack/cours0.html

Cours de Falcon : ./tutos/archives/pifoman/html/cours_cracking/cours_assembleur.htm


Normalement vous n'avez besoin de rien de plus.


image


Outils :

  • Le crackme KillNag téléchargeable ici : KillNag.zip

  • Peid 0.95 ou RDG Packer Detector 0.6.6 (au choix)

  • Un débuggeur/désassembleur : OllyDbg (1.10 ou 2.0)

  • Un cerveau :)


Les anciennes versions des logiciels proposés (Peid / RDG) marchent également. Pour Olly, je l'ai fait avec la version 1.10. Tout ces logiciels sont trouvables rapidement dans Google.


image


Introduction


Commençons d'abord par observer notre crackme pour repèrer les différentes limitations. Après un rapide coup d'oeil, il en ressort ceci :

  • Nagscreen au démarrage

  • Nagscreen lors de la sortie du crackme


Voilà, je crois qu'on a fait le tour :). J'espère que vous avez bien noté les messages qu'on a eu avec les messagesbox.

Suppression des Nags


On passe tout d'abord notre crackme dans Peid pour voir si il est packé.


image


C'est bon, le Crackme est clean. On peut donc continuer.


Chargez le Crackme dans Olly, faites un click droit, Search for, All referenced text strings pour partir à la recherche des messages contenus dans les nags. On a de la chance, ils sont juste au dessus de notre PUSH 60. Double-cliquez sur la string juste au dessus, celle du nag de départ, pour arriver à l'endroit ou se situe le message d'erreur.

Vous arrivez normalement ici :


image


Examinons voir le code : on observe un CALL à l'API MessageBoxA qui appelle notre Nag en 00401085. Ce CALL est précédé par les éléments nécessaires pour la déclaration de l'API, tel le texte à insérer dans celle ci (la phrase de notre nag). On a deux méthodes pour contourner ce nag. Placez tout d'abord un Bp (F2) sur le MOV ECX,DWORD PTR SS:[ESP+4] en 00401074.


Voyons maintenant la première méthode :

Nous allons ici contourner l'affichage de la messagebox en sautant la procédure qui l'appelle. Faites espace sur le MOV et changez le en JMP 0040108B pour sauter jusqu'à l'instruction après la fin de la routine MessageBoxA.


image

nag et que le programme va se lancer normalement. Et un de fait :).


Voyons maintenant la deuxième méthode :

Nous allons ici contourner l'affichage de la messagebox en effectuant une sortie prématurée de la routine par le biais d'un RETN. On va donc devoir rajouter les instructions qui se trouvent après l'appel à l'API MessageBoxA, pour que le programme continue à tourner normalement.

Modifiez donc le MOV ECX,… en MOV EAX,1 puis rajoutez un RETN à la place du dernier NOP. L'avantage de cette méthode est qu'elle est un peu plus propre, car je déteste utiliser les NOPs. Vous n'avez plus qu'à tester, et ça marche encore une fois :)


image


Passons maintenant au deuxième Nag, celui de la fin du programme.


Faites un click droit, Search for, All referenced text strings pour partir à la recherche du message contenu dans le deuxième nag. Il est juste au dessus de la string de notre premier nag. Double-cliquez sur la string pour arriver à l'endroit ou se situe le message d'erreur.

Vous arrivez normalement ici :


image


Examinons voir le code : on observe un CALL à l'API MessageBoxA qui appelle notre Nag en 00401085. Ce CALL est précédé par les éléments nécessaires pour la déclaration de l'API, tel le texte à insérer dans celle ci (la phrase de notre nag).

Or, la procédure d'appel de notre nag est suivie de la procédure EndDialog qui met fin à la boîte de dialogue ouverte, c'est à dire à celle qui nous fait ici sortir définitivement du programme.

On a qu'une seule méthode (ici :) pour contourner ce nag. Placez tout d'abord un Bp (F2) sur le MOV ESI,DWORD PTR SS:[ESP+8] en 00401074.


Nous allons ici directement sauter sur la procédure de clotûre du Crackme. Faites espace sur le MOV et changez le en JMP 0040104B pour sauter jusqu'à l'instruction qui marque le début de la routine EndDialog.


image

nag et que le programme va se quitter normalement. Et deux de faits :).


Pour maintenant enregistrer les changements, faites Click droit => Copy to executable => All Modifications => Copy All. Dans la fenêtre qui s'ouvre, faites Click droit => Save File.

Votre fichier cracké est maintenant enregistré ;). C'est quand même plus rapide qu'avec un éditeur hexadécimal, non ?


image


Ce tutoriel est fini. J'espère qu'il a été clair, et que vous n'avez pas rencontré de difficultés. Tuto finalisé par Horgh le 03/03/2010


Merci à KiTo pour son crackme


P.S. : J'ai remarqué après avoir fini le tuto que thorpe en avait déjà fait un en anglais, que l'on peut consulter ici : http://www.reversing.be/article.php?story=20050526043821808&query=killnag


Il propose deux autres méthodes intéressantes car la manière de procéder est différente, mais que j'avoue ne pas trop apprécier à cause des NOPs.

Jettez y quand même un œil :)

Copyright (C)- xtx Team (2021)

XHTML valide 1.1 CSS Valide !