Leçon 01

Précédente Accueil Remonter Suivante

Débogage du logiciel AportisDoc Mobile Edition V2.1

Introduction

La cible:

AportisDoc est un visualiseur de texte au format Doc (à ne pas confondre avec les .doc des documents Word !). On peut trouver de nombreux textes, essais, ou même des livres entiers au format doc. Lire sur le Palm Pilot est assez plaisant, même si pour celà le programme TealDoc est plus pratique.

Le but :

AportisDoc laisse 60 jours à l'utilisateur pour essayer le produit, au delà il doit s'enregister. Néanmoins, s'il ne s'enregistre pas, le programme continue de fonctionner de la même manière. Si l'utilisateur achète la license, il reçoit un code débloquant le programme (clé). Nous allons essayer de déboguer le programme afin qu'il accepte n'importe quel code.

La  philosophie :

Nous allons utiliser la méthode dite "Dead Listing" (Code source mort). Cette méthode est basée sur la lecture et la compréhension du code source, contrairement à la méthode dite "Live Approach" ( approche vivante) qui travaille directement sur le programme en mémoire en utilisant un débugger.

L'approche:

Nous chercherons a repérer où est situé le message indiquant que le code entré n'est pas bon, puis où est située la partie de code qui affiche ce message, puis finalement les instructions qui appellent ce code, et à quelles conditions.Ensuite nous modifierons ces conditions.

Les outils :

Nous utiliserons :

Prc2Bin pour séparer les différentes ressources du programme.

PilotDis pour désassembler le code du programme.

PalmEmulator pour émuler un Palm Pilot, soit pour ceux qui n'en possèdent pas, soit pour éviter de travailler sur son vrai Palm (la HotSync à répétion est assez fastidieuse)

HexEdit pour patcher le programme final.

1ère partie : Repérage

Lancez PalmEmulator. Avec le bouton droit, séléctionnez "Load App" (charger une application) et cliquez le programme AportisDoc (aportisdoc.prc).

Il se peut que l'affichage du PalmEmulator ne se réactualise pas. Cliquez sur le bouton de l'agenda puis revenez, l'icone d'AportisDoc apparaitra.

Lancez le programme ... Activez le menu d'options, cliquez Options/About AportisDoc/Order Now/Order Now/. Le programme attend que vous tapiez le code de déblocage. Tapez un nombre bidon au clavier ( avantage de l'émulateur ) puis cliquez OK. Le logiciel indique que la clé est mauvaise   ("The registration code that you entered is incorrect"). Retenez bien ce message en anglais.

2ème partie : Analyse

2.1) Numéro de la ressource.

Depuis une ligne de commande Dos, lancez le programme Prc2Bin avec en paramètre le fichier aportisdoc.prc. Prc2Bin crée alors 54 fichiers. Ces fichiers contiennent les différentes parties du logiciel Aportis. Avec la commande Rechercher de Windows, chercher le fichier qui contient le texte "is incorrect" (tiré du message d'erreur ci-dessus). En résultat nous avons aportisdoc.prc bien sûr, mais aussi le fichier nommé Talt0ba1.bin. Le nom de ce fichier n'est pas anodin: alt signifie alert, pour indiquer que ce fichier contient un message d'alerte. 0ba1 indique le numéro de ce message en hexadécimal; ainsi , quand on rentre une mauvaise clé, le logiciel demandera au Palm d'afficher le message d'alerte numéro 0ba1. C'est ainsi que l'on voit à l'écran la fenetre contenant "The registration code that you have entered is incorrect".

2.2) Recherche de la ressource

Faites glisser l'icone de aportisdoc.prc sur le programme de PilotDis. Il crée dans son répertoire un fichier APORTI~1.PRC.s . Renommez-le en APORTI~1.PRC.s.txt , ouvrez-le en double-cliquant dessus. Ce document texte contient la retranscription du programme en langage assembleur 68000.

Nous allons chercher maintenant à quel endroit du programe est appellée la ressource numéro 0ba1.

Dans le code source, les nombres hexadécimaux sont précédés du signe "$". Nous allons donc faire une recherche avec la fonction de recherche de texte de WorkPad, et nous lui indiquons que l'on cherche le texte "$ba1". Notez que le "0" a disparu car il n'est pas pris en compte par PilDis.

WorkPad trouve une occurence :

000005c4 584f                 ADDQ.W #4,A7

000005c6 0c040001     L30     CMPI.B #1,D4

000005ca 6606                 BNE L31

000005cc 4ebafe18             JSR L16

000005d0 600a                 BRA L32

000005d2 3f3c0ba1     L31     MOVE.W #2977!$ba1,-(A7)

000005d6 4e4fa192             TRAP #15,$A192 = sysTrapFrmAlert

000005da 544f                 ADDQ.W #2,A7

000005dc 2f0a         L32     MOVE.L A2,-(A7)

 

2.3) Compréhension du code source

Pour faciliter la lecture et la compréhension, la portion du code source qui a été localisée a été remie dans le tableau suivant :

Adresse Instruction codée en hexadécimal numéro de ligne Instruction en assembleur Explication
000005c4 584f   ADDQ.W #4,A7 inutile ...
000005c6 0c040001 L30 CMPI.B #1,D4 Est ce que D4=1
000005ca 6606   BNE L31 si non on va en ligne 31
000005cc 4ebafe18   JSR L16 si oui on appelle la routine en ligne 36
000005d0 600a   BRA L32 puis on part en ligne 32
000005d2 3f3c0ba1 L31 MOVE.W #2977!$ba1,-(A7) On charge en mémoire le numéro du message d'erreur (ba1)
000005d6 4e4fa192   TRAP#15,$A192 = sysTrapFrmAlert On affiche le message d'erreur
000005da 544f   ADDQ.W #2,A7 inutile ...
000005dc 2f0a L32 MOVE.L A2,-(A7) On continue l'execution du programme ...

Le raisonnement est simple :

en ligne 5c6, on teste si d4 égal 1. Si d4 est différent de 1la ligne 5ca (branch if not equal) nous envoie à la ligne L31. Si d4 vaut 1, la ligne 5ca n'est pas prise en compte, donc on passe à la ligne 5cc. A cet endroit est appelée la sous-soutine située en ligne L16 (jump to sub-routine). Une fois que cette sous-routine s'est exécutée, on reviens en ligne 5d0, qui nous branche (branch) en ligne L32.

Dans le cas oû d4 égal 1, on a vu que la ligne 5ca nous amène en L31. Là, on charge en mémoire notre fameux numéro de message ba1, dont l'affichage est déclenché en ligne 5d6. En 5da , une instruction inutile à comprendre, puis ensuite on reprend tranquilement le cours de l'execution en ligne L32.

Je pense que vous vous doutez du rôle de ce bout de programme. Une procédure quelconque va faire des calculs sur la clé que vous avez rentrée, et vas rendre un résultat dans d4. Si d4 ne vaut pas 1, cela signifie que la clé est mauvaise, dans ce cas on affiche le message d'erreur puis on continue en L32. Si d4 vaut 1, cela signifie que la clé est bonne, donc on appelle la sous-routine L16, qui enregistre la license, puis on continue le programme en L32.

 

3ème Partie: Modification du programme

La solution approche ... J'espère que vous vous rendez compte que pour que le programme accepte n'importe quel code, il suffit de l'empecher d'aller en L31. Comme c'est en adresse 5ca que ce test est effectué, c'est à cet endroit qu'il faut modifier le programme.

Une possibilité est de changer le BNE L31 en BEQ L31. De cette manière, le programme n'ira en L31 que si l'on rentre le bon code (!), et acceptera n'importe quel autre code.

Une autre possibilité est "d'effacer" l'instruction BNE L31, de manière à ce que le saut ne fasse jamais. Mais comme on ne peut pas "détuire" l'instruction, on va la remplacer par une instruction qui ne fait rien. Une telle instruction s'appelle NOP (no operation). On voit que le code hexadécimal du BNE L31 est 6606. En fait le 66 explique que l'opération est BNE , et le 06 correspond au L31 ( 5D2-5CA-2 =6 ; le 2 correspond aux 2 octets du 6606). Le code hexadécimal du NOP est 4E71. Comme les deux instructions ont même longueur, il suffit de remplacer dans le fichier aportisdoc.prc les 2 octets 66 et 06 par les 2 octets 4E et 71.

Pour celà il faut utiliser un éditeur hexadécimal tel que HexEdit.

Avec HexEdit, ouvrez le fichier aportisdoc.prc, puis faîtes Edit/Goto.

Cliquez sur l'onglet Hex pour indiquer que l'on veux une adresse en haxdécimal, puis saisissez l'adresse 5ca.HexEdit nous amène aux octets 6606. Remplacez-les par 4E71, puis faite File/Save. Quand HexEdit vous demande si vous voulez faire une copie de sauvegarde, repondez oui (c'est plus prudent).

Maintenant, relancez le PalmEmulator, recharger la version modifiée de aportisdoc.prc grace à l'option "Load App" (l'ancienne version d'Aportis dans le PalmEmu sera automatiquement remplacée par la nouvelle). Lancez Aportis et rentrez lui une clé aléatoire ... et voilà plus de message d'erreur ! Si vous faites Option/About, vous voyez que le programme est bien enregistré ! Quittez Aporis et relancez-le pour vérifier que l'enregistrement est bien pris en compte .

4ème Partie: Conclusion

Vous vous rendez compte qu'il est extremement facile de venir à bout de clé de protection comme celle-ci. Beaucoup de Sharewares fonctionnent sur le même principe. Si vous êtes programmeur, j'espère que vous saurez en tirer des leçons.

Vous trouverez un exemple un peu plus difficile dans la leçon numéro 2.

Le programme AportisDoc fonctionne identiquement s'il est enregistré ou s'il ne l'est pas. Si vous voulez juste éviter de payer vos licenses, il donc inutile d'opérer la manipulation exercée dans cette leçon. Néanmoins, j'espère que ce cours vous restera en tant qu'information, et non pas pour utiliser des logiciels dans un cadre illégal. AportisDoc est un bon programme, et si vous l'utilisez au delà de 60 jours je vous incite à payez la license à son auteur, Rick Bram, afin de l'encourager à continuer son logiciel.

Note additionelle

Pour ceux qui désireraient la 1ère méthode de modification, c.à.d. changer le BNE L31 en BEQ L31, et sachant que le code du BEQ est 67, il suffit de remplacer 6606 par 6706.

 

Cette page est (c) PalmIpède 1999. Reproduction même partielle interdite sans autorisation.
Pour toute question ou problème concernant ce site Web, envoyez un email au WebMaster.
Dernière modification : 10 mars 1999.
1