Code in DLL:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include "stdafx.h" #pragma data_seg(".hdata") // секция в памяти общая для всех процессов HINSTANCE hi = NULL; // эта переменная может изменяться любым поэтому здесь не должно быть ничего лишнего #pragma data_seg() // конец секции #pragma comment(linker, "/section:.hdata,rws") // даем права этой секции HHOOK hKeyHook = NULL; DWORD idproc; BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: // вызывается каждый раз когда новый процесс грузит DLL в свою память { if (!hi) // запоминаем запустивший хэндл(наша DLL) толко первый раз, чтобы он небыл переписан на новый hi = hModule; break; } case DLL_PROCESS_DETACH: { break; } default: break; } return TRUE; } LRESULT CALLBACK DebugProc(int nCode, WPARAM wParam, LPARAM lParam) // вызывается при нажатии или отпускании клавиши { if (nCode == HC_ACTION && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)) { // нам нужно только нажатие printf("Замечен кейлогер"); } return CallNextHookEx(hKeyHook, nCode, wParam, lParam); // обработали передаем дальше } extern "C" __declspec(dllexport) int SetKeyboardHook(void) // эту функцию надо вызывать из приложения для создания ловушек { hKeyHook = SetWindowsHookEx(WH_DEBUG, &DebugProc, hi, 0); return 1; } // конец DLL The code of the program calling the DLL:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <locale> #include <windows.h> INT main() { LPWSTR name = L"dllmain.dll"; HMODULE namer = LoadLibrary(name); setlocale(LC_ALL, "russian"); int (*setHook)(void); setHook = (int (*)(void))GetProcAddress(namer, "SetKeyboardHook"); setHook(); MSG msg = { 0 }; while (GetMessage(&msg, NULL, 0, 0)) { DispatchMessage(&msg); } system("pause"); ExitProcess(0); } The hook from the DLL for some reason does not work, although it should be. SetHook () returns everything as it should, no errors. Why the hook is not put in the DLL? I did everything by the example ( http://uinc.ru/articles/zametki/001.shtml ) (of course, replacing the right moments). How do I change the code so that the hook is set and catches everything WH_KEYBOARD (using WH_DEBUG and PDEBUGHOOKINFO structure?