Ax-Album et sa protection ?

Comme toujours après avoir installé le programme qui se trouve dans le répertoire Cracking du CD, on le lance et on observe ...

Dès le départ un Nagscreen apparaît:

Le TELWARE:
Le TELWARE est un système promotionnel mis au point par AXIALIS pour l'obtention du serial d'enregistrement par le MINITEL.
Les versions TELWARE sont volontairement bridées.
Certaines fonctions sont inhibées et de nombreux messages vous rappellent le principe du TELWARE.
Si vous souhaitez utiliser pleinement un programme en version TELWARE vous devez le débloquer en y introduisant un NUMERO DE SERIE D'ACTIVATION PERSONNEL.

Après avoir cliquer sur SUITE nous avons ceci...

Si on clique sur suite le programme nous dit ceci et se lance ensuite après avoir cliquer sur OK.

On relance le programme et cette fois ci on inscrit dans le champ Numéro d'activation: 123456789 ou 6710886 qui en Hexa donne 666666 très utile parfois pour retrouver un sérial dans les mémoires utilisées !

Un nouveau Nagscreen surgit et indique:

On saisit notre nom: Exxecutor puisqu'il le demande et ...

Et le programme se lance en version non débloquée. On nous le signale encore dans le Menu A Propos de Ax-Album...

Nous avons tous les éléments nécessaires pour commencer notre étude en désassemblant le programme dans WinDasm 32 pour avoir les Strings Datas Références et dans OllyDbg pour les diverses modifications (car les strings datas n'apparaissent pas dans OllyDbg). N'oubliez pas de sauvegarder le fichier .wpj de Windasm pour gagner du temps ultérieurement.

Ceci fait, on examine les Strings Datas dans Windasm avec les infos receuillies précédemment pour tomber sur ceci:

et

En cliquant sur "Le numéro de série que vous avez saisi est incorrect. V..." on tombe ici:

On remonte dans les lignes et on se rend compte que la routine qui contrôle si la version est enregistrée ou pas démarre à l'adresse 434C2D appellé par un saut UNCONDITIONNEL ! une seule fois ! Ceci est d'une extrême importance...nous verrons ça plus loin !

Examinons cette routine car 90 % des protections classiques travaillent de cette manière.
Le programme va définir tout au début une valeur booléenne vrai/faux (True/False) qui sera stockée dans une zone de mémoire appelée 'pointeur' (Pointer), représenté par un octet (byte),
un mot (word) ou double-mot (dword) du type:

- mov | byte ptr [(registre +) adresse], Valeur_Booléenne
          | word
          | dword

Ici dans AX-Album nous avons:

- mov dword ptr [004B5E84], | 00000000
                                                | 00000001


En règle générale, la valeur '0' sera souvent utilisée pour 'Vrai' et '1' pour 'Faux' (c'est le compilateur qui décidera de cela au dépens du programmeur:-) mais il peut y avoir des
exceptions.
Lorsque le programme voudra savoir s'il est 'Enregistré' ou non, il n'aura qu'a faire une comparaison du type:

- cmp | byte ptr [(registre +) adresse], Valeur_Booléenne_VRAI
          | word
          | dword


Cette expression est toujours suivie d'un saut conditionnel (jne, jnz, je, jz...).

Voici un petit exemple:

(* Au départ, le programme se définit comme 'Non Enregistré' *) Mov dword ptr[reg+adr],00000001
(* Il lit dans le fichier *.ini si 'Enregistré' *) Call Verifie_Si_Enregistre
(* Vérifie si 'Vrai' *) Cmp dword ptr[reg+adr],00000000
(* Si 'Enregistré' : *) je Début_Du_Programme
(* Si 'Non Enregistré': *) Call NagScreen
......

Note: Si le programme se définit tout d'abord comme 'Non-Enregistré', c'est tout simplement parcequ'une valeur boléenne est toujours initialisée comme étant fausse (FALSE)
au début du progamme. Pour craquer le plus facilement du monde ce type de protection, il suffit de remplacer le

'Mov dword ptr[reg+adr],00000001' par 'Mov dword ptr[reg+adr],00000000'.

Dans Ax-Album nous avons à la ligne 434C74

C705845E4B0001000000 mov dword ptr [004B5E84], 00000001 ( Le pointeur à l'adresse 004B5E84 est initialisé sur non enregistré au départ)

A la ligne 434C83 et suivantes le soft initialise ici les données qu'il va ensuite rechercher à savoir le Nom et le numéro de série.

A la ligne 434DOC dans le Call, il va dans le fichier INI rechercher si il existe un Nom utilisateur et un numéro de sérial et teste ensuite..

A la ligne 434D11 la condition oui ou non ?

A la ligne 434D13 si c'est non il saute à l'adresse 434D2D qui n'est autre que l'appel du 1er Nagscreen. Et si c'est oui continue en 434D1C et

A la ligne 434D1D le Call fait appel à la routine de création du sérial en fonction du Nom utilisateur détecté.

A la ligne 434D25, il teste le mot de passe du fichier INI avec celui créé précédemment. Et à

La ligne 434D27 si c'est oui il sort de cette routine et si c'est non appel à nouveau du 1er Nagscreen.

A la ligne 434D88 le Call nous envoie au 1er Nagscreen.

A la ligne 434DAD c'est la Call du 2eme Nagscreen ou on entre le mot de passe et le nom.

En 434E0E le test vérifie si on n'a bien entré un sérial, ensuite le jump si c'est non ou alors on continue vers l'autre test ..

A la ligne 434E24 ce test là, vérifie si un Nom utilisateur à été entré si oui on saute en 434E71 si non on continue et on indique qu'il n'y a pas d'utilisateur entré et on se fait éjecter et le programme démarre non débloqué.

En 434E9F on pousse dans EAX le sérial entré par l'utilisateur et ensuite

A la ligne 434EA0 le Call nous envoie dans la routine de création du VRAI sérial.

On teste les 2 sérial en 434EA8 on saute si c'est bon on continue en indiquant que ce n'est pas le bon sérial !

On retrouve à la ligne 434EF6 la valeur 1 stockée dans l'adresse mémoire 4B5E84 indiquant une version non enregistrée.

La suite est juste l'enregistrement des données dans le fichier INI et avec

A la ligne 435081 on indique que tout est bon et que nous avons une version enregistrée et pleinement fonctionnelle.

 

On va comme d'habitude retrouver le sérial qui nous permettra plus tard d'obtenir les versions ultérieures.
Dans OllyDbg, on se place à la ligne 434EA0 qui, comme nous l'avons avant est le Call qui nous envoie dans la routine de création du sérial en faisant dans la fenêtre CPU, CTRL-G.

On fait enter pour "suivre" le Call et on se retrouve à la ligne 401AFA qui n'est autre qu'un JUMP en 434AB2. On suit avec à nouveau enter et voilà notre belle routine...

On pose un break avec F2 sur cette adresse (434AB2) et on lance avec F9. On suit les indications, le Nom: Exxecutor est entré et le sérial: 1234567890, on valide et ca break.
Dans la fenêtre des registres on constate qu' EAX contient notre Faux Sérial.

On lance l'animation avec CTRL-F7 et on regarde attentivement les registres. Après un certains temps on va voir dans ECX et également dans la fenêtre mémoire une chaîne de caractères comme ceci A934 vite F12 pour arrêter l'animation automatique on trace en manuel avec F7 ou on va dans la fenêtre mémoire, on clique sur l'adresse qui contient la chaîne et Follow in Dump.

En traçant avec F7 à l'adresse 4448EE on voit que c'est là que l'on met la valeur de AL dans l'adresse mémoire. Posons un break avec F2 et on relance tout après avoir ré-initialisé Ax-Album dans OlyyDbg avecCRTL-F2 et ensuite F9. Ca re-break. On fait F9 et on voit qu' à l'adresse 12FAD0 notre sérial commence à apparaître on va continuer à tracer en manuel et à l'adresse 434B06 à la sortie du Call on va retrouver TOUT le sérial. Il suffit dès lors d'effacer TOUS les break précédents et de placer un break à cet adresse pour sortir tous les sérials désirés !

Exemple: maman donne avec 123456 en sérial: A93456-K2FK-R8PIp_K et pour Exxecutor....exactement la même chose donc un sérial unique...pure ineptie !

Mais en regardant mieux ce programme, souvenez-vous tout au début, cette routine est appellée par un saut inconditionnel et on se retrouve à l'adresse 434C2D ou l'on commence toutes les opérations de sécurité mais si on remplace :

00434C2D 44 push ebp       par       00434C2D C3 ret     on oublie toute cette partie "énervante" et on gagne un peu de temps.

Maintenant que nous avons notre sérial pourquoi pas nous enregsitrer et découvrir où se cache le fichier INI !

On s'enregistre et on est remercié le programme fonctionne parfaitement bien. En recherchant avec REGEDIT on ne trouve pas ce fameux fichier dans la base de registre ou donc est-il ?

 

UTILISATION DE FILEMON:

Ce petit soft est très utile car il espionne les accès aux divers fichiers en temps réels sur le disque on va l'utiliser pour pister AX-Album lorque il cherche dans le fichier INI les informations d'enregistrement.

On lance FILEMON.exe et on trouve ceci.

Dès son lancement, FileMon espionne tous les logiciels qui tournent et qui on des accès divers aux fichiers qui leurs sont utiles.

Pour y voir plus clair on va arrêter les softs que l'on n'a pas besoin et arrêter le défilement en cliquant sur la petite loupe ou CTRL-E. On efface avec les informations précédentes avec CTRL-X et on se prépare à lancer AX-Album rapidement après avoir refait CTRL-E pour relancer l'espionnage fichiers.

On voit alors Ax-Album charger et rechercher les informations qui lui sont nécessaires et on voit effectivement qu'un fichier appellé AXALBM32.INI est appellé dans C:/WINDOWS

On va dans le répertoire et on ouvre notre fichier AXALBM32.INI, effectivement notre fichier contient notre nom et sérial.

 

Par eXXe