Hooks

M5i9k Messages postés 49 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 10 novembre 2007 - 7 août 2006 à 00:24
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 - 15 août 2006 à 11:07
Bonsoir,

je voulais savoir si il était possible de creer un hook lors du chargement d'un dll c'est à dire dans la fonction DllMain d'un dll, j'essaye de le faire mais n'y arrive pas :

#include "windows.h"

HHOOK hKeyb;
HINSTANCE hDll;

LRESULT CALLBACK KeybProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode < 0)  // do not process message
        return CallNextHookEx(hKeyb, nCode, wParam, lParam);

    MessageBox(NULL, "Appui", "Message", MB_OK);

    return CallNextHookEx(hKeyb, nCode, wParam, lParam);
}

void Hook()
{
   
    hKeyb = SetWindowsHookEx(WH_KEYBOARD, KeybProc, hDll, 0);
    if(!hKeyb)
        MessageBox(NULL, "Erreur", "Erreur", MB_OK);
}

void UnHook()
{
    if(hKeyb)
        UnhookWindowsHookEx(hKeyb);
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    hDll = hinstDLL;
    if(fdwReason == DLL_PROCESS_ATTACH)
    {
        Hook();
    }
   
    if(fdwReason == DLL_PROCESS_DETACH)
    {
        UnHook();
    }

    return TRUE;
}

11 réponses

nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
7 août 2006 à 09:45
Il ne faut jamais utiliser de fonctions bloquantes comme MessageBox dans un hook, car sinon le système d'exploitation ne va pas effectuer le hook. Essaie plutôt un fopen/fwrite à la place, et donne nous le résultat.

<hr size="2" width="100%" />Sachant qu'on peut toujours enlever une ligne à un programme, et que dans un programme il y a toujours un bug, un programme peut se résumer à une ligne avec un bug.
0
M5i9k Messages postés 49 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 10 novembre 2007
7 août 2006 à 12:27
Voila, j'ai réecris ma fonction :

LRESULT CALLBACK KeybProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode < 0)  // do not process message
        return CallNextHookEx(hKeyb, nCode, wParam, lParam);

    // Sauvegarde dans le fichier
    ofstream fichier;
    fichier.open("c:\\log.txt", ios::out);
    fichier << "touche appuyée" << endl;
    fichier.close();

    return CallNextHookEx(hKeyb, nCode, wParam, lParam);
}

Resultat : rien du tout...
En fait je voudrais creer seulement le hook sur le processus qui charge la dll plutot qu'un hook global si possible.
0
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
7 août 2006 à 13:32
Salut,

Désolé je ne fait pas de C (enfin pas pour les DLL) mais en Delphi le DLLMain ne se déclenche pas de lui meme, il faut le lancer via un autre point d'entré qui indiquera au passage l'etat de la DLL :

Voila un morceau de code que j'utilise dans une de mes appli (Dll) Delphi :

------

procedure Main( Reason : Integer ) ;  <= Ton DllMain Ici
begin



  case reason of  <= ici fait un switch c'est plus prope !



    DLL_PROCESS_DETACH: // DLL Se ferme
    begin
        // Traiter evenement à la fermeture
    end;



    DLL_PROCESS_ATTACH: // DLL Se lance
    begin
      // Traiter evenement au lancement
    end;



  end;



end;



begin                  <= là on est dans le programme principal, 
                        . et c'est ce qui nous sert d'entry point
   DllProc := @Main;   
   DllProc(DLL_PROCESS_ATTACH);   <= appel du DLLMain !
end.


------

Enfin voila pour te donner une idée, cherche l'équivalent en C/C++.

A+
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
7 août 2006 à 14:31
Non son code C est correct pour le DllMain.

<hr size="2" width="100%" />Sachant qu'on peut toujours enlever une ligne à un programme, et que dans un programme il y a toujours un bug, un programme peut se résumer à une ligne avec un bug.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
7 août 2006 à 15:11
Bon ba désolé je vois pas alors... mais fait quand meme un switch dans ton DLLMain :-)
0
M5i9k Messages postés 49 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 10 novembre 2007
7 août 2006 à 15:16
C'est fait :
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)

{

switch(fdwReason){

case DLL_PROCESS_ATTACH:hDll = hinstDLL;

Hook();

break;

case DLL_PROCESS_DETACH:UnHook();

break;}

return TRUE;
}

Le hook s'installe bien mais on dirais que la fonction ne s'execute jamais :s
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
7 août 2006 à 15:22
Pour elguevel :
En C++, lors du chargement d'une DLL, Windows va aller automatiquement exécuter la fonction DllMain, avec la raison donnée dans le deuxième paramètre (fdwReason).

<hr size="2" width="100%" />Sachant qu'on peut toujours enlever une ligne à un programme, et que dans un programme il y a toujours un bug, un programme peut se résumer à une ligne avec un bug.
0
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
10 août 2006 à 11:12
Merci pour cette precision ... ;-)
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
10 août 2006 à 13:03
Essaie d'enlever le Unhook de ton DllMain, je pense que ton problème doit venir de là.

<hr size="2" width="100%" />Sachant qu'on peut toujours enlever une ligne à un programme, et que dans un programme il y a toujours un bug, un programme peut se résumer à une ligne avec un bug.
0
M5i9k Messages postés 49 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 10 novembre 2007
13 août 2006 à 15:33
Quelques nouvelles sur la dll :
Si j'enlève le unhook, sa ne fonctionne pas.
J'ai ajouté un MessageBox dans la fonction Hook() :
void Hook()
{   
    hKeyb = SetWindowsHookEx(WH_KEYBOARD, KeybProc, hDll, 0);
    if(!hKeyb)
        MessageBox(NULL, "Erreur", "Erreur", MB_OK);
    else
        MessageBox(NULL, "Réussite", "", MB_OK);
}
Donc sa m'affiche une boite de message "Réussite", lorsque je laisse cette boite ouverte, le hook fonctionne, à partir du moment ou je la ferme, le hook semble s'arrêter, si cela peut vous aider à m'aider, je n'ai toujours pas résolu le problème...
0
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
15 août 2006 à 11:07
Et si tu crée un Thread qui boucle infiniment et que tu le suspend ... ( pour remplacer la messagebox )

Tu executes ta fonction Hook normalement, et tu resume le thread immediatement après comme çà evite à ta DLL de se terminer et pour terminer ton Hook, tu clos le thread dans ton unhook !

C'est une idée comme çà, je sais pas si c'est la bonne solution !?
0
Rejoignez-nous