Tutorial - Spy++

Transcription

Tutorial - 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.
Contenu
I) Fonctionnement
II) Trouver une fenêtre
III) Listage des fenêtres
IV) Listage des processus
V) Listage des threads
VI) Intercepter les messages
VII) Filtrer les messages
VIII) Les désavantages de Spy++
IX) Langage de programmation
X) Conclusion
I) 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).
II) 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é. Ca se
justifie par les styles. Dans le tutorial 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 héxadécimal qui déterminent l'apparence visuelle
du composant. La structure en héxadécimale 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 chapîtres. Alors
patience...
III) 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 possible 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.
IV) 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).
V) 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.
VI) 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.
Refaîtes 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
Ca 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 (ca 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.
VII) Filtrer les messages
Tout d'abord, le feux 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'occurence,
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 apparaîssent : «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.
VIII) Les désavantages de Spy++
Spy++ ne donne pas à l'utilisateur la possibité 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://www.delphifr.com/code.aspx?ID=32233
IX) 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é :
1) Il 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++.
Copyright
© http://altert.family.free.fr/
Ce document est aussi hébergé sur :
http://www.codes-sources.com/

Documents pareils