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

C++ Discussion :

Hook :: Marche avec Qt marche pas avec CodeBlocks


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Hook :: Marche avec Qt marche pas avec CodeBlocks
    Salut tout le monde !
    Je suis un petit peu en galère en ce moment parce que je regarde les hooks windows en c++ (et c'est pas ce qu'il y a de plus facile).
    Après 2 jours de recherches, 2 heures de désespoir et 1 dodo je commence enfin a comprendre comment ça marche grâce a ce cher monsieur :
    (bien que son but soit de faire un keylogger et ce n'est pas le miens, mais là n'est pas la question).
    En efet cette vidéo explique assez bien mais je ne veux pas utiliser Qt, dans le doute j'ai quand même écrit ce programme dessus (c'est pas la fin hein ! seulement 1/3 de la vidéo) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include <QtCore/QCoreApplication>
    #include <QDebug>
    #include <QTime>
    #include <QChar>
    #include <windows.h>
    #include <iostream>
     
    HHOOK hHook;
     
    using namespace std;
     
    LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
        qDebug() << "key pressed";
        return CallNextHookEx(hHook, nCode, wParam, lParam);
    }
     
    int main(int argc, char *argv[]) {
        QCoreApplication a(argc, argv);
        hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);
        if(hHook == NULL) {
            qDebug() << "Hook Failed";
        }
        return a.exec();
    }
    donc celui là fonctionne, il ne fait rien et quand j'appuie sur une touche du clavier, il me renvoie "key pressedé"

    mais moi je veux pas utiliser Qt donc dans code blocks j'ai fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <windows.h>
    #include <iostream>
     
    HHOOK hHook;
     
    using namespace std;
     
    LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
        cout << "key pressed";
        return CallNextHookEx(hHook, nCode, wParam, lParam);
    }
     
    int main(int argc, char *argv[]) {
        while(1) {
            hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);
            if(hHook == NULL) {
                cout << "Hook Failed";
            }
        }
        return 0;
    }
    mais ce truc la ne marche pas, il renvoie "Hook failed" a l’infini....

    qu'est-ce qui est faux dans mon programme ?

    thanks d'avance amis développeur

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 495

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour ta réponse

    Citation Envoyé par bacelar Voir le message
    hmm j'ai encore de très grosse difficulté avec le c(++) j'ai pas encore assez d'entrainement (c'est mon premier vrai programme).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main(int argc, char *argv[]) {
            hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);
            if(hHook == NULL) {
                cout << "Hook Failed";
                DWORD lastError = GetLastError();
                cout << lastError;
            }
        return 0;
    }
    c'est ça ?

    ça renvoie rien

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 495
    Par défaut
    GetLastError est écrasé à chaque appel utilisant ce mécanisme antique.
    Or, l'utilisation de std::cout peut écraser la variable globale utilisée par GetLastError.
    Il faut récupérer la valeur le plus tôt possible, donc avant l'utilisation de std::cout.

    Je suis a peu près certain que cette version simplifiée du hooking impose l'utilisation d'une pompe à messages donc que votre boucle "While(1)" est une erreur.
    Le sous-système cible de votre programme est bien "windows" et non "console" ?

    Qt intégre, en interne, une pompe à messages.

  5. #5
    Invité
    Invité(e)
    Par défaut
    J'ai réussi a obtenir le code d'erreur 2, mais apparemment c'est file not found.... j'ai pas de fichier moi


    c'est quoi un sous-système cible ?

    je veux pas utiliser Qt parce que jusqu'à maintenant je n'avais jamais vu son utilisation pour les hooks, et après je voudrais partir sur l'utilisation d'une dll (même si je suis tout perdu sur ce sujet, je finirais bien par comprendre)

  6. #6
    Membre actif
    Homme Profil pro
    007
    Inscrit en
    Octobre 2014
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : 007

    Informations forums :
    Inscription : Octobre 2014
    Messages : 119
    Par défaut
    Salut,

    Essaye avec ça dans ton main, note la présence de GetModuleHandle necessaire pour une appli console ou une dll et de la boucle de message windows qui est caché par le framework Qt. Faut pas oublier UnhookWindowsHookEx pour mettre fin au hook.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      hHook = ::SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, ::GetModuleHandle(0), 0);
     
      if (hHook == 0) {
        std::cout<< "Hook Failed:"<< ::GetLastError()<< "\n"<< std::flush;
        return 1;
      }
     
      MSG win_message= {0};
      while (::GetMessage(&win_message, 0, 0, 0)) {
        ::TranslateMessage(&win_message);
        ::DispatchMessage(&win_message);
      }

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 495
    Par défaut
    Le hooking via un exécutable et via une Dll sont complètement différents, ne perdez pas à comprendre le hooking via exécutable alors.

    Windows dispose de plusieurs sous-systèmes : Win32, OS/2, POSIX ...
    En Win32, il y a 2 types d'exécutables, ceux qui sont "console" qui disposent automatiquement d'une console, et ceux qui sont "windows" qui n'ont pas besoin d'une console et qui utilise généralement une pompe à message pour la gestion des fenêtres qu'ils créent.

    Le sous-système cible est indiqué dans la partie en-tête du format PE des exécutables sous Windows et c'est dans les options du linker qu'on indique si l'exécutable est de type "console" ou de type "windows".

    Beaucoup de traitements asynchrones bas niveau utilisent les mécanismes d'envoie/réception de message entre fenêtres, ce que seul les exécutable disposant d'une pompe à message sont à même de faire.

Discussions similaires

  1. Soft marche avec Jdeveloper mais pas avec Apache
    Par haifa28 dans le forum JDeveloper
    Réponses: 1
    Dernier message: 05/06/2007, 13h58
  2. [mod_rewrite] marche dans httpd.conf pas avec .htaccess
    Par __fabrice dans le forum Apache
    Réponses: 3
    Dernier message: 08/05/2007, 21h12
  3. [Apache2] Ca marche avec Firefox mais pas avec IE
    Par Barnabo dans le forum Apache
    Réponses: 1
    Dernier message: 15/03/2007, 11h07
  4. Réponses: 1
    Dernier message: 12/01/2007, 11h20
  5. Sa marche avec Firefox mais pas avec IE ?
    Par boolat dans le forum Flash
    Réponses: 1
    Dernier message: 30/10/2006, 14h02

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