IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Mise en place d'un hook sur processus externe


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Points : 84
    Points
    84
    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

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    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.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Points : 84
    Points
    84
    Par défaut
    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

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    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é.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Points : 84
    Points
    84
    Par défaut
    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 ?

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Inutile, SetWindowHookEx s'en charge

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Points : 84
    Points
    84
    Par défaut
    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 ?

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    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

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Points : 84
    Points
    84
    Par défaut
    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

Discussions similaires

  1. Mise en place d'un SFTP sur Debian
    Par Gregory.M dans le forum Serveurs (Apache, IIS,...)
    Réponses: 1
    Dernier message: 01/01/2009, 08h40
  2. [DEBUTANT] Mise en place d'un site sur IIS
    Par Kalion dans le forum ASP.NET
    Réponses: 1
    Dernier message: 03/12/2008, 11h04
  3. [samba/ldap]Mise en place d'une corbeille sur un NAS!
    Par flavio_dev dans le forum Linux
    Réponses: 1
    Dernier message: 11/08/2008, 14h25
  4. [FLASH 8][AS2][OFFLINE]Mise en place d'un Listener sur un combobox
    Par -=OAZ=- dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 27/03/2008, 10h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo