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++

  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 510
    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 510

  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 510
    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 510
    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 510
    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 510
    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.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par CTJayce Voir le message
    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.
    Merci pour ta réponse, est-ce que tu peux me commenter ? (il marche bien ce programme)

    Citation Envoyé par bacelar Voir le message
    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.
    Ah bon ? je croyais que ce que la dll contenait était en fait la même chose que lors d'un hook via exe sauf que l'emploi d'une dll donnait un plus grande portée au programme....

    le truc c'est que les gens qui expliquent le hoocking via dll vont très vite !

    j'ai lu ca : http://tcharles.developpez.com/simul/

    j'ai tout compris jusqu'à ce qu'il mette le code de hooksClSo.dll, là il m'a carrément pommé...

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 510
    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 510
    Par défaut
    C'est étrange que le code de Vixepti renvoie un code "file not found" et que le code de CTJayce fonctionne.
    A moins que le sous-système cible est été changé.

    Le hooking via un exe utilise le passage de message à un processus unique.
    Le hooking via une Dll injecte la Dll dans tous les processus, donc avec des données non partagées entre chaque processus, par défaut.

    Si tu as bien compris jusque là, c'est que ce n'est pas le hooking qui te pose problème, mais plus le concept de dll, non ?

  10. #10
    Invité
    Invité(e)
    Par défaut
    Peut-être bien que je n'ai pas compris le concept de dll en effet... mais mon principal problème c'est que je ne comprends pas le code pour concevoir cette dll ainsi que celui du programme, à cause de mon niveau pas encore très élevé en c++
    Dernière modification par Invité ; 29/10/2014 à 21h32.

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 510
    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 510
    Par défaut
    Alors commence par bien maitriser le C++, le hooking demande des bonnes connaissances en programmation système.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Ce programme est là pour ça... pour approfondir mes connaissances dans le domaine, je suis clairement bas level mais c'est en faisant des projets dans le genre que je vais réussir a m'améliorer en programmation. Je veux donc absolument apprendre a faire ça même si il faut pour ça que je fasse 1024 programmes avants... le trucs c'est que je sais pas ce qu'il faut que je fasse ....

    EDIT : http://melem.developpez.com/tutoriel...namiques-dlls/

    un petit peu de lecture ne pêut que me faire du bien
    Dernière modification par Invité ; 30/10/2014 à 01h47.

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