Précédent   Forum du club des développeurs et IT Pro > Général Développement > Programmation système > Windows
Windows Forum d'entraide sur la programmation Windows. Tutoriel API Windows
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 08/01/2013, 11h48   #1
geek-59600
Membre du Club
 
Inscription : août 2008
Messages : 152
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 152
Points : 50
Points : 50
Par défaut Mise en place d'un hook sur processus externe

Bonjour à tous,

Je suis à la recherche d'information au sujet de la mise en place de hook clavier sur un processus distant.

Je m'explique, j'aimerai ouvrir une messagebox a chaque fois qu'une touche est pressée dans l'application 'cible' ; l'utilité ? Aucune, juste satisfaire ma curiosité.

J'ai lu pas mal de tuto parlant de DLL à injecter et compagnie je m'y suis essayé.

J'ai donc crée un injecteur de DLL qui fonctionne, j'ai crée également ma DLL qui met en place un hook avec un fichier de sortie pour pouvoir logger le déroulement de la chose.

L'installation du hook se passe bien cependant je rencontre un souci un peu particulier voyez plutot :

A la réussite de l'installation du hook, je demande (via ma dll) de m'afficher une messageBox à chaque action 'recue' , de plus une fois le hook placé et en cas de réussite, je me fais afficher une messageBox ("Hook en place") mais le hook est placé sur cette fenêtre. En effet si je valide la fenetre (hook en place) par la souris je n'ai plus de sortie par contre si je la valide en tappant sur entrée, j'ai une nouvelle MsgBox qui s'ouvre m'informant de la réception d'une action clavier ...

J'en déduit que le hook est pas placé comme il faut (sur le mauvais process), malheureusement je n'arrive pas à isoler le souci, j'ai bien tenter de modifier le dernier paramètre de la fonction SetWindowHookEx() par 0 ou par le l'ID du thread ayant généré la fenêtre que je désire écouter mais rien n'y fait.

Auriez vous une idée ?
Merci d'avance.

Bonne journée
geek-59600 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 15h50   #2
Andnotor
Rédacteur/Modérateur
 
Avatar de Andnotor
 
Inscription : septembre 2008
Messages : 2 886
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 2 886
Points : 4 372
Points : 4 372
En gros, tu te plains que le hook fonctionne
Tu n'auras pas d'autres choix que de filtrer le handle de fenêtre à laquelle est destiné le message et le cas échéant appeler directement CallNextHookEx sans plus de traitement.

Une autre approche serait de passer par Raw Input.
__________________
Mes tutoriels Delphi
Andnotor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 16h00   #3
geek-59600
Membre du Club
 
Inscription : août 2008
Messages : 152
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 152
Points : 50
Points : 50
Mince, je pensais que le hook n'était actif que dans le process l'ayant lancé, d’où l’intérêt de l'injection de DLL et du remoteThread :s

Donc pour faire un hook global ou est l’intérêt de la DLL, j'ai lu partout qu'il en fallait une :s
geek-59600 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 22h55   #4
Andnotor
Rédacteur/Modérateur
 
Avatar de Andnotor
 
Inscription : septembre 2008
Messages : 2 886
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 2 886
Points : 4 372
Points : 4 372
Mais injectée où si ce n'est dans les autres processus

Il y a deux façons d'implémenter un hook pour le clavier (ou la souris). Ce choix se fait par le type de hook installé :
  • par injection de DLL à l'aide de WH_KEYBOARD. La librairie est véritablement chargée dans chaque processus en cours de la session utilisateur, la DLL sera utilisée N fois. Seule une librairie peut être injectée, un exécutable pas ;
  • par commutation de processus à l'aide de WH_KEYBOARD_LL. Le processus cible est interrompu et le traitement transféré à ton application. La DLL est chargée une fois. Le hook peut être directement dans l'application (sans DLL) puisque le code sera dans tous les cas exécuté dans son processus.
Tu peux ensuite ciblé un thread précis en le spécifiant à l'appel de SetWindowHookEx mais peu importe, le but est bien d'observer (et d'influer sur) le flux de messages des autres processus.
Si tu vises une fenêtre particulière, c'est à toi de tester que le message lui est bien adressé.
__________________
Mes tutoriels Delphi
Andnotor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 23h24   #5
geek-59600
Membre du Club
 
Inscription : août 2008
Messages : 152
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 152
Points : 50
Points : 50
D'accord, donc mon idée d'injecter dans chaque processus n'été donc pas totalement fausse.

Admettons que je veuille logger les WH_KEYBOARD (non LL) je dois donc injecter la dll et la faire loader par le processus via un appel a RemoteThread en lui passant comme fonction à executer un LoadLibrary donc ?
geek-59600 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 09h27   #6
Andnotor
Rédacteur/Modérateur
 
Avatar de Andnotor
 
Inscription : septembre 2008
Messages : 2 886
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 2 886
Points : 4 372
Points : 4 372
Inutile, SetWindowHookEx s'en charge
__________________
Mes tutoriels Delphi
Andnotor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 10h17   #7
geek-59600
Membre du Club
 
Inscription : août 2008
Messages : 152
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 152
Points : 50
Points : 50
Oula me serais bien compliqué la vie ?

Admettons que je veuille logger les saisies dans notepad PID (2069)

Je crée donc un programme appelant setWindowsHookEx mais a quel moment je lui dis que c'est notepad que je veux logger, le dernier paramétre étant un threadId et pas un Pid ?

De plus la fonction de callback doit elle etre situé dans une DLL ou simplement dans l'éspace mémoire du process appellant setWindowsHookEx ?
geek-59600 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 14h23   #8
Andnotor
Rédacteur/Modérateur
 
Avatar de Andnotor
 
Inscription : septembre 2008
Messages : 2 886
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 2 886
Points : 4 372
Points : 4 372
Citation:
Envoyé par geek-59600 Voir le message
Admettons que je veuille logger les saisies dans notepad PID (2069)

Je crée donc un programme appelant setWindowsHookEx mais a quel moment je lui dis que c'est notepad que je veux logger, le dernier paramétre étant un threadId et pas un Pid ?
Si tu cibles un processus, depuis le hook en appelant GetCurrentProcessId ou GetWindowThreadProcessId.

Citation:
Envoyé par geek-59600 Voir le message
De plus la fonction de callback doit elle etre situé dans une DLL ou simplement dans l'éspace mémoire du process appellant setWindowsHookEx ?
Déjà répondu ici
__________________
Mes tutoriels Delphi
Andnotor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 11h58   #9
geek-59600
Membre du Club
 
Inscription : août 2008
Messages : 152
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 152
Points : 50
Points : 50
Bon alors j'ai refait un essaie.

J'injecte la DLL, dans le dllmain la fonction setWindowHookEx() est exécuté avec en dernier paramètre le thread qui gére les fenêtre graphique de cette application (vérifié avec Spy++)
J'ai aucune erreur aux code retour mais j'ai pas de retour suite à la pression d'une touche clavier
geek-59600 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h59.


 
 
 
 
Partenaires

Hébergement Web