[delphi] utiliser microsoft spy++

[delphi] utiliser microsoft spy++

«Hein?? C'est quoi ce truc ?»
C'est un espion pour Windows.

Dans la même gamme, il existe WinSpector (voir site web du même nom) et WinSight (livré avec Delphi). Si j'ai choisit Microsoft Spy++, c'est parce que c'est le plus simple à utiliser, il est rapide et efficace.

Fonctionnement

Il donne strictement tout sur ce que vous voulez savoir : fenêtres, processus, threads, messages... Son principe est de se loger en amont de tous les messages pour pouvoir les intercepter. C'est tellement efficace, que s'il se plante, c'est le PC qu'il faut rebooter. Voici les fichiers qui composent l'application (on remarque un magnifique hook) :
SPYXX.EXE
SPYXX.HLP
SPYHK55.DLL

Le logiciel énumère les fenêtres & threads, décode les styles, repère les handles... bref, c'est l'ultimate tool du développement. A la base, il est surtout fait pour le langage C++ qui est moins facile à utiliser que Delphi, mais ce n'est pas non plus le même niveau de compétance qui est exigé. Il permet donc de débugger des programmes, de voir si le résultat attendu est là...

Mais comme toutes choses, il faut savoir l'utiliser. On va apprendre...

Important : pour des raisons techniques évidentes, Spy++ ne peut pas s'auto-espionner, car en interceptant des messages, il crée des messages qui devront lui reparvenir. Ainsi, on aurait une réaction en chaîne pouvant entraîner le blocage complet de l'application et donc du PC (car tous les messages sont filtrés par cette application).

Trouver une fenêtre

Fermez les sous-fenêtres de Spy++. Cliquez sur >"Spy" >"Find Window (Ctrl+F)". Une petite fenêtre apparaît avec une image en forme de cible. Vous enfoncez le clic gauche sur elle, bougez la souris sur l'écran, et relâchez le clic sur la fenêtre de votre choix.

On rappelle pour mémoire, qu'une fenêtre peut être aussi un composant fenêtré. Ça se justifie par les styles. Dans le tutoriel sur les messages, rappelez-vous de la phrase : «[Les TWinControl] ont une propriété STYLE cachée qui permet en une seule commande de les transformer (en apparence seulement) en fenêtre, en bouton cliquable ou en TGroupBox

Lorsque vous bougez la souris, vous voyez un surlignage des contours des fenêtres et on remarque qu'il y en a partout (ou presque). Cet effet graphique permet de détecter les composants qui n'auraient pas forcément été visibles. Lorsque vous relâchez le clic, des propriétés apparaissent :

  • Handle : C'est le numéro identifiant (en héxadécimal) du composant sélectionné. C'est le même numéro qui sert dans SendMessage.
  • Caption : C'est le texte qui est associé au handle via le message WM_SetText. C'est l'équivalent de la propriété Caption des composants fenêtrés de Delphi.
  • Class : C'est l'encapsuleur de la ressource. Dans Delphi, le composant Form1 est géré par la classe TForm1. Une classe est indispensable pour tout Handle.
  • Style : Ce sont les fameux styles écrits en hexadécimal qui déterminent l'apparence visuelle du composant. La structure en hexadécimal permet de voir facilement 8 portions pouvant contenir l'une des 16 valeurs suivantes: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. On ne se servira pas des styles (ceux choisis par Delphi lorsque vous faites un composant TCustomControl n'ont pas à être modifiés).
  • Rect : C'est la dimension et position du composant avec les coordonnées du point supérieur gauche et inférieur droit.

En sélectionnant PROPERTIES et en cliquant sur OK, vous accédez à des propriétés plus avancées, dont le décodage des styles simples et étendus. Les valeurs possibles des styles étant connues, Spy++ fait des tests en IF xxx AND NOT yyy = yyy then et affiche les autres styles combinatoires restants (officieux).

En sélectionnant MESSAGES et en cliquant sur OK, vous dépassez les chapitres. Alors patience...

Listage des fenêtres

Vous cliquez sur >"Spy" >"Windows (Ctrl+W)". Vous avez un arbre hiérarchisé en parenté. Si vous avez une application Delphi à vous, vous repérez facilement un TApplication ainsi que votre TForm1. En développant les +, vous trouvez les composants fenêtrés que vous avez introduits. On détecte naturellement les TButton, TPanel... tous les composants Standard en somme.

En faisant un clic droit sur l'un de ces composants, vous avez la possibilité d'espionner les messages arrivant sur le composant, et de le repérer par surlignement. Faites le test... Par contre, ça ne peut marcher que sur des composants visible.

En cliquant sur l'item Messages, vous brûlez une fois de plus les étapes.

Listage des processus

Vous cliquez sur >"Spy" >"Processes (Ctrl+P)". Vous voyez alors toutes les applications qui sont lancées par le SYSTEM, par les SERVICE et par l'utilisateur. En développant les +, on retrouve quelles fenêtres sont attachées à tel ou tel processus. Disons simplement que le processus est le fil d'Ariane de l'application en liaison avec Windows. Coupez le processus via TERMINATEPROCESS entraîne naturellement la fermeture de l'application. On remarque que le thread SPYXX (bien que pouvant être espionné) renvoie une flagrante passivité (pour les mêmes raisons que tout à l'heure).

Listage des threads

Cliquez sur >"Spy" >"Threads (Ctrl+T)". Vous avez une liste plus convaincante, à ne pas confondre avec les PROCESSES.

Un thread ayant un handle et étant une classe comme les autres, il est possible qu'il soit en intéraction avec Windows via des messages. C'est pour cela, qu'il y a un item Messages sur le clic droit.

En cliquant sur l'item Messages, ne vous sentez pas fautifs, car c'est maintenant qu'on va en parler.

Intercepter les messages

Si vous avez cliqué sur les items proposés en clic droit, cliquez alors sur l'espèce de formulaire à droite du feu tricolore. Sinon, dans la procédure normale, cliquez sur >"Spy" >"Messages (Ctrl+M)". Vous arrivez sur une fenêtre complexe.

Windows

Vous avez ici la possibilité de changer la cible de votre espionnage. De toute façon, si quelque chose est déjà sélectionné, vous devriez voir en haut à droit pleins d'informations. Refaites comme dans FIND WINDOW pour sélectionner votre cible.

Pour ce qui des Additional windows, habituellement rien ne doit être coché, car sinon des messages parents ou enfants pourraient interférer sur les messages du composant que vous voulez voir.

La case à cocher All Windows in system affiche tous les messages traversant le hook. Par leur importance et quantité, vous voyez pourquoi les messages sont si utiles et indispensable. Ce n'est pas de la gnognotte.

Messages

Vous voyez que les messages sont dédiés à des catégories de ressources. On va voir ça après.

Output

Ça permet de configurer l'affichage de sortie.
Par défaut sont cochées les cases suivantes :

  • Line number (bon pour repérer les lignes qui vous intéressent)
  • Message nesting level (ça active ou non les points de suspension qui hiérarchisent les messages en fonction des entrées-sorties rencontrées)
  • Decoded message parameters (indispensable)
  • Decoded return values (indispensable)

Si vous voulez enregistrer le résultat dans un fichier, saisissez le nom du fichier. Spy++ ne demandera jamais la moindre confirmation au sujet de la manipulation de ce fichier. Alors, ne vous trompez pas.

Voilà, y'a plus qu'à cliquer sur OK.

Filtrer les messages

Tout d'abord, le feu tricolore permet ou non d'activer l'affichage des messages. Le hook est toujours actif tant que Spy++ n'est pas éteint, mais il n'y a plus d'affichage. La croix rouge à côté permet de vider la liste.

On voit que l'affichage est perturbé par la souris et les clic-tests. On va devoir les supprimer. Cliquez sur l'espèce de formulaire coincé entre les deux boutons évoqués aux quelques lignes ci-dessus. Vous avez alors la possibilité de reparamétrer le hook. En l'occurrence, désactivez MOUSE et le message WM_NCHITEST que vous trouverez dans la liste. Refaîtes des tests et effacez les messages récurrents.

Pourquoi faire tout cela ?

Souvent des questions apparaissent : «Comment je fais pour détecter que la fenêtre bouge ou va être bougée», «Comment je fais pour détecter que la fenêtre est réduite», «Comment je fais pour détecter que ma grand-mère fait du vélo» (je blague) ...

Via Spy++, vous trouvez le nom du message et vous faîtes un évènement dans le PRIVATE qui intercepte tel ou tel message. (Re)voir dans ce cas le tutorial sur les messages et le développement de composants.

Les désavantages de Spy++

Spy++ ne donne pas à l'utilisateur la possibilité de modifier les données qu'il détecte. Genre : changer la priorité de tel thread, envoyer un message précis à tel handle... C'est un manque certain. Sinon, il sert beaucoup, mais une fois de plus, si on n'a pas compris à quoi servent les messages et comment ils fonctionnent, l'utilisation de Spy++ devient caduque.

Spy++ a choisit de ne pas espionner certains noms de classe. Voir le code suivant pour une mise en application :
http://codes-sources.commentcamarche.net/source/32233-bloquer-l-espion-spy-ttygrab-consolewindowclass-32768-32769

Langage de programmation

Chaque langage a ses petites manies. Et grâce aux noms de classes que vous trouvez facilement avec FIND WINDOW, vous pouvez déduire le langage de programmation à l'origine de tel ou tel logiciel que vous avez. Il suffit simplement de survoler avec la cible l'interface de l'application.

Voici quelques noms de classe caractéristiques :
VisualBasic : Thunder
C++ : #32768, Static, Combo, Afx:...
C++Builder, Delphi : TBidule, TMachin...

Bien sûr, un examen approfondi de l'application peut-être envisagé au niveau des ressources.
1) Y a-t-il une ressource MENU et des ACCELERATOR dans l'application ?
2) Qui sont les DLL utilisées par l'application ?
3) Les LOCALES de Borland

Généralement, le nom des classes suffit à avoir une petite idée.

Ce paragraphe donnait juste un autre exemple d'application du logiciel Spy++.

Tanguy ALTERT, http://altert.family.free.fr/

Ce document intitulé « [delphi] utiliser microsoft spy++ » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous