|
Débogage du logiciel LClock V1.0 Introduction La cible: LClock est un programme affichant une petite horloge avec alarme. Il est aussi possible de faire afficher l'heure d'un autre fuseau horaire. Le but : LClock laisse à l'utilisateur le temps qu'il désire pour essayer le produit, au delà il doit s'enregister. La seule limitation est le message "Please Register" à l'écran.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 : Comme dans la leçon n°1, 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. 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ède 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 et chargez le programme LClock. Il se peut que l'affichage du PalmEmulator ne se réactualise pas. Cliquez sur le bouton de l'agenda puis revenez, l'icone de LClock apparaitra. Lancez le programme... Vous voyez un message "Please register" à l'écran. Cliquez dessus pour afficher l'écran d'enregitrement.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 key entered is not correct"). Retenez bien ce message en anglais. Vous remaquerez le message "(not set)" à l'écran. Celà correspond au nom d'utilisateur, qui n'est pas définit (set) sur l'émulateur. 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 lclock.prc. Prc2Bin crée alors 47 fichiers. Ces fichiers contiennent les différentes parties du logiciel LClock. Avec la commande Rechercher de Windows, cherchez le fichier qui contient le texte "not correct" (tiré du message d'erreur ci-dessus). En résultat nous avons lclock.prc bien sûr, mais aussi le fichier nommé Talt235c.bin. Le nom de ce fichier n'est pas anodin: alt signifie alert, pour indiquer que ce fichier contient un message d'alerte. 235c 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 235c. 2.2) Recherche de la ressource Faites glisser l'icone de lclock.prc sur le programme de PilotDis. Il crée dans son répertoire un fichier LCLOCK.PRC.s . Renommez-le en LCLOCK.PRC.s.txt ,puis 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 235c. 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 "$235c". WorkPad trouve une occurence : 00001af4 610000d4 BSR L19800001af8 defc0014 ADDA.W #20!$14,A7 00001afc 4a40 TST.W D0 00001afe 660e BNE L190 00001b00 3f3c235c L189 MOVE.W #9052!$235c,-(A7) 00001b04 4e4fa192 TRAP #15,$A192 = sysTrapFrmAlert 00001b08 7001 MOVEQ #1,D0 00001b0a 60000028 BRA L193 00001b0e 2483 L190 MOVE.L D3,(A2) 00001b10 3f3c235e MOVE.W #9054!$235e,-(A7) 00001b14 4e4fa192 TRAP #15,$A192 = sysTrapFrmAlert
2.3) Compréhension du code source Si vous avez bien suivis la leçon n°01, vous pouvez déjà comprendre ce morceau de code. En L189 se produit l'affichage de notre message d'erreur $235c, puis le programme continue son execution en L193. En L190 se produit l'affichage d'un autre message, le $235e. Si vous cherchez dans le répertoire de Prc2Bin la ressource Talt235e.bin, et que vous ouvrez ce fichier avec NotePad ou HexEdit, vous voyez que ce message correspond à l'affichage de "Thank you for registering LClock". Intéressant ! Maintenant regardons un peu plus haut : à l'adresse 1af4 s'effectue un appel à la sous-routine L198 (bsr= branch to sub-routine). La ligne en 1af8 ne nous interesse pas. En 1afc se fait un test sur D0. Comme D0 est très souvent utilisé pour exprimer le résultat d'une procédure, on se doute que la valeur de D0 dépend de la sous-routine L198 appelée plus haut. En 1afe se décide suivant la valeur de D0 si l'on doit soit afficher le message d'erreur (si D0=0), soit le message de remerciement (si D0<>0). La solution est donc simple: modifier le BNE L190 en BRA L190 afin que quelque soit le résultat de la procédure L198 exprimé dans D0, on lance le message de remerciement. Le BNE L190 est s'écrit en hexadécimal 660e (66 pour le BNE, et 0e pour le L190). Comme l'octet codant le BRA est 60, on changera donc l'instruction 660e en 600e. Lancez donc HexEdit, ouvrez le fichier lclock.prc, faites Edit/Goto, tapez 1afe comme adresse. HexEdit nous amenes au 660e. Remplacez-le par 600e, puis quittez HexEdit en sauvegardant le fichier modifié, et en acceptant la sauvegarde en .bak. Maintenant lancez le PalmEmulator, chargez le fichier lclock.prc modifié, lancez LClockn, enregistrez-vous en tapant un numéro au hasard, et appuyez sur ok .. et hop! le programme vous remercie de vous être enregistré. Voilà, tout pourrait être bien qui finit bien, seulement quand vous tapez ok, vous voyez que le message "Please Register" est toujours là !! Damn ... Magie Noire ? Il faut se rendre à l'évidence, la seule modification que nous avons faite ne concerne que l'affichage du message, mais n'enregistre pas réellement le programme. Un test doit être fait ailleurs ... D'après ce que nous avons vu plus haut, la sous-routine L198 semble être faite pour tester la clé, et retourner un résultat dans D0. Nous avons vu que si D0 vaut zéro celà induit le message d'erreur, et si D0 est différent de zéro le message de remerciement. Jetons donc un oeil à la routine L198 en faisant une recherche de texte sur L198. Nous obtenons : 00001bca 4e560000 L198 LINK A6,#000001bce 48e71f00 MOVEM.L D3-D7,-(A7) 00001bd2 2c2e0008 MOVE.L 8(A6),D6 00001bd6 2e2e000c MOVE.L 12(A6),D7 La commande Link A6,#0 est celle qui commence toute procédure. La fin d'une procédure est obtenue par la commande RTS, qui ramène à l'instruction suivant la BSR qui a appelé la routine. Cherchons donc la fin de la routine L198, en faisant une recherche de texte sur "RTS". Nous trouvons : 00001c4e b083 CMP.L D3,D000001c50 670c BEQ L200 00001c52 2f04 MOVE.L D4,-(A7) 00001c54 4e4fa012 TRAP #15,$A012 = sysTrapMemChunkFree 00001c58 4240 CLR.W D0 00001c5a 6000000a BRA L201 00001c5e 2f04 L200 MOVE.L D4,-(A7) 00001c60 4e4fa012 TRAP #15,$A012 = sysTrapMemChunkFree 00001c64 7001 MOVEQ #1,D0 00001c66 4cee00f8ffec L201 MOVEM.L -20(A6),D3-D7 00001c6c 4e5e UNLK A6 00001c6e 4e75 RTS00001c70 4e560000 L202 LINK A6,#0 La procédure se termine donc en 1c6e par le RTS. D'ailleurs, une autre procédure commence en L202... Nous voyons immédiatement deux instructions intéressantes : en 1c58, l'instruction CLR.W D0 qui met D0 à zéro (clr=clear=efface), et en 1c64 l'instruction MOVEQ #1,D0 qui met la valeur 1 dans D0. Apparement, en 1c4e se fait un test, qui en 1c50 nous amène soit en L200 qui met D0 à 1 puis saute en L201 pour quitter la routine, soit continue en effaçant D0 puis sautant en L201 pour quitter. Deux solutions s'offrent donc à nous : soit nous modifions le saut conditionnel BEQ 200 en BRA 200, soit nous modifions le CLR.W D0. Disons que pour changer un peu nous allons choisir la deuxième solution: changer le CLR.W D0 en MOVEQ #1,D0. En 1c64 nous voyons que le code du MOVEQ est 7001, il suffit donc de changer en 1c58 la valeur 4240 par 7001. Je pense que vous connaissez maintenant cette manipulation à faire sous HexEdit. Modifiez donc le fichier lclock.prc , puis chargez le dans le PalmEmulator. Tapez une clé bidon et là ho, joie ! le programme s'enregistre correctement... 3ème Partie: Conclusion La leçon n°02 a pour but de vous faire comprendre que parfois, vous ne modifiez que le test d'affichage du message d'erreur, et non pas le test complet du mot de passe. Dans notre cas, c'est la routine L198 qui teste le mot de passe. Cette routine est appelée lors du test d'affichage, mais est aussi utilisée ailleurs dans le programme, notamment lors du test d'enregistrement. C'est pourquoi il faut effectuer la modification dans la routine elle-même*. 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 3. Le programme LClock fonctionne quasi-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. Si vous utilisez LClock régulèrement, je vous incite à payer la license afin de d'encourager son auteur à continuer son logiciel.
Note additionelle * : Il est aussi possible de rechercher tous les endroits dans le programme oû est appelée la routine L198 pour modifier le test sur D0 qui est fait après. C'est pourquoi il est plus simple de faire la modification dans L198. |
Cette page est (c) PalmIpède 1999. Reproduction même partielle
interdite sans autorisation.
|