Видео-шпион

gh05t (gh05t@yandex.ru)

Хакер, номер #076, стр. 076-108-1

Лепим сервис визуального наблюдения

Во многих компаниях, где работа идет преимущественно за компьютером, админы любят устанавливать на машины сотрудников интересную программу: сервис визуального наблюдения. Она висит в памяти и записывает все, что происходит на рабочем столе пользователя. Если вдруг юзер решил вместо работы поиграть в сапера – менеджер это мгновенно заметит и даст геймеру по ушам. Такой способ слежения наверняка пригодится хакеру, которого должно уже тошнить от текстовых логов обычных spyware-утилит.

Как ты уже понял, в этой статье мы разберемся, как написать программу видео-шпион. Некий сервис, который будет раз в какое-то время снимать с рабочего стола пользователя скриншот и отправлять на мыло (как вариант – сохранять на диск). В принципе, в том, чтобы снять, сжать и отправить, снимок экрана большой сложности нет. Но вот устройство сервисов штука уже не такая простая, и ей придется уделить особое внимание. Почему именно сервис? Ну, во-первых, так принято ;). Во-вторых, сервис не даст себя убить простому смертному пользователю. И, в-третьих, он не будет нагло висеть в автозагрузке, а залезет очень далеко и глубоко. Так что, чтобы обнаружить его и обезвредить придется поднапрячься.

Трепанация

Раз уж мы собрались писать шпиона в виде сервиса, сначала мы должны разобраться, что он из себя представляет. Итак, сервис, или, как его любят называть разработчики винды «Служба», - это исполняемый файл PE-формата, то есть экзешник. От обычного приложения его отличает особая начинка. Каждый сервис должен состоять как минимум из трех специальных функции, о каждой из которых мы поговорим отдельно:

1) Main-функция. Как я уже сказал, сервисы представляют собой обычные исполняемые файлы, у которых, как и у всех, должна быть главная функция, вызываемая при запуске программы. В ней мы должны, прежде всего, сообщить системе, что данный файл содержит код не обычной программы, а службы. Для этого мы вызовем функцию StartServiceCtrlDispatcher и передадим ей структуру типа Service_Table_Entry, в которой будут описаны имя сервиса и указатель на его ServiceMain-функцию.

Main-функция нашего шпиона

DispatchTable.lpServiceName:='Our service';

DispatchTable.lpServiceProc:=@ServiceMain;

StartServiceCtrlDispatcher(DispatchTable);

2) ServiceMain-функция. На этом участке кода будет происходить инициализация и вся основная работа нашего шпиона. О нем нам еще предстоит поговорить ниже.

3) Handler-функция. Предназначена для обработки системных событий типа запуска, паузы или остановки сервиса. В качестве параметра система передает ей сообщение об изменении состояния сервиса. Все типы сообщений я описывать не буду, их можно взять в MSDN, скажу лишь о SERVICE_CONTROL_INTERROGATE. Это сообщение самое важное и требует немедленно возвратить текущий «статус» сервиса, используя SetServiceStatus. Даже, если мы забьем на всякие функции типа остановки сервиса, это сообщение обрабатывать все равно придется.

Let's code!

Зная основу анатомии сервисов, можно приступить к кодингу. Хочу заметить, что, как правило, сервисы – это консольные приложения, а значит, писать мы будем непосредственно в коде проекта. В связи с этим можешь смело удалять из проекта все юниты, вычищать секцию uses и весь код между begin и end.

Содержание  Вперед на стр. 076-108-2
ttfb: 3.917932510376 ms