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

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

ЗАЙЦЕВ ОЛЕГ

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


InstallHook;

Memo1.Lines.Add('<< Выполнена переустановка ловушки >>');

Handled := true;

end;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

Application.OnMessage := OnAppMessage;

InstallHook;

end;

Итак, в результате у нас получился достаточно простой шпион, работоспособный в Windows 9x и NT, да к тому же не использующий DLL. Последний факт затрудняет отлов подобных кейлоггеров - отловить такой кейлоггер можно двумя методами:

1. Установить в систему монитор, который будет отслеживать факт установки ловушек.

2. Применить отладочную ловушку с типом WH_DEBUG. Ловушка данного типа вызывается перед любой другой ловушкой, что позволяет производить мониторинг использования ловушек и блокировать их работу.

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

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

2. Регистрация окна шпиона при помощи функции SetClipboardViewer в качестве так называемого «просмотрщика буфера обмена». Это наиболее корректный и документированный путь наблюдения за буфером обмена.

3. Слежение за буфером обмена по руткит-принципу, путем перехвата соответствующих функций и мониторинга их вызова.

Метод на базе SetClipboardViewer является наиболее простым с точки зрения реализации, поэтому заслуживает подробного рассмотрения. Для начала немного теории. Регистрируемые при помощи SetClipboardViewer окна образуют цепочку просмотрщиков. При этом система запоминает хендл окна, установленный при помощи последнего успешного вызова SetClipboardViewer в «голове» цепочки, а хендл первого окна цепочки возвращает вызывающему SetClipboardViewer приложение. Далее при изменении буфера обмена система передает сообщение типа WM_DRAWCLIPBOARD последнему из зарегистрированных просмотрщиков. При получении сообщения он его обрабатывает, а затем (что важно!) пересылает последующему в цепочке окну. Тот, в свою очередь, передают далее, и так до конца цепочки. Понятное дело, что если одно из окон-просмотрщиков будет разрушено, то цепочка прервется. На этот случай предусмотрена функция ChangeClipboardChain, позволяющая удалить окно из цепочки перед его разрушением. После вызова этой функции все зарегистрированные в цепочке окна получают сообщение WM_CHANGECBCHAIN и, в случае необходимости, хранящийся у них хендл следующего в цепочке окна.

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

procedure TCMForm.FormCreate(Sender: TObject);

begin

hNextClipboardViewer := SetClipboardViewer(Handle);

if hNextClipboardViewer > 0 then

Назад на стр. 070-040-6  Содержание  Вперед на стр. 070-040-8