|
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,A7000005c6 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 :
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.
|