Как стать автором
Обновить

ScreenLogger – улыбнитесь, вас снимает скрытая камера

Время на прочтение4 мин
Количество просмотров7.8K
Итак, приветствую. В данной статье будет разобран процесс написания программы, позволяющей в режиме реального времени отслеживать все действия происходящие на удаленном компьютере, без ведома конечного пользователя. Автор статьи предупреждает, что не несет ответственности за неправомерное использование нижеизложенных технологий и не рекомендует использовать ее в противоправных целях. Поехали!

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

0) Добавление служебных файлов при первом запуске в папки системы
1) Снятие скриншота с экрана
2) Отправку скриншота на удаленный сервер

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

Описание функций:

SetConfig – обеспечивает чтение параметров конфигурации из приложенного файл настроек
Send – отвечает за отправку скриншота на почту
MakeScreen – отвечает за снятие скриншота
Circle – отвечает за повторение снятие и отправки скриншота в фоновом режиме с заданной периодичностью
CasualStart – определяет действия при очередном запуске программы
FirstStart – обеспечивает корректную установку программы

Теперь – чуть подробнее по каждой из функций. Настройка конфигурации:

Так как программное обеспечение должно быть гибким, следует обеспечить возможность изменения внутренних параметров программы извне ее кода. При каждом запуске данное программное обеспечение пытается найти файл SaveScreen.ini, обновить свои параметры и лишь потом начинать работать в штатном режиме. В случае же, когда обновить параметры невозможно, используются значения по умолчанию.

(о том, какой параметр за что отвечает – будет в конце статьи)

По техническим причинам, вместо пробела пришлось использовать нижнее подчеркивание, а вместо @ — #, но внутри программы осуществляется обратная замена.

Выполнение программы начинается в блоке Form1_load, и может развиваться в двух режимах – обычный запуск(если на компьютере есть установочная директория) и установка(если установочной директории нет). Рассмотрим каждый из них.

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

Соответственно, это осуществляет функция FirstStart()

image

После установки приложение закрывается – при следующей перезагрузке компьютера оно будет работать в штатном режиме.

Штатный запуск:
Штатный запуск запускает фоновый поток, который осуществляет снятие и отправку скриншота, а так же очищает папку с скриншотами, снятыми за прошлую сессию. После чего, ожидает в течении значительного промежутка времени перед принудительным завершением приложения. Перед запуском фонового потока возможна пауза, которую стоит выставлять на сравнительно медленных компьютерах для ускорения загрузки системы и отсутствия конфликтов при запуске.
СasualStart()

image

Циркуляция:
Все прозаично до безобразия – в вечном цикле мы снимаем и отправляем скриншоты, после чего – ждем указанное время. На порядок интереснее сам процесс снятия и отправки скрина.

image

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

image

Отправка на почту:
В C# есть возможность работы с почтой используя предустановленные классы, позволяющие заполнить поля письма, указать адресата и адресанта и, собственно – осуществить отправку вызовом одного метода. Этот метод завернуть в try-catch блок на случай отсутствия подключения к сети – даже в таком случае программа не выдаст сообщение об ошибке, а будет покорно ждать, пока у нее появится возможность обратиться к серверу. Почтовый сервер был выбран из соображений простоты, в принципе — можно снимки перекидывать куда угодно.

image

Общее взаимодействие:
Запуск программы, пoвторюсь, осуществляется в методе Form1_Load. Программа пытается обновить конфиг, потом определяет – была ли она запущена в первый раз, если да – добавляется в нужную папку и в автозагрузку и отключается, а если нет – запускает фоновый процесс, который стабильно по заданному интервалу закидывает изображение с экрана на почтовый сервер. Ничего сложного или необычного, просто взаимодействие нескольких встроенных классов.
image

И, наконец, пояснение файла автоконфигурации – все имена переменных совпадают с именами в программе, поэтому, поясняя поля в инит-файле, я так же описываю сами переменные.

image

wayToDir – имя подпапки, в которую скидываются скриншоты
finalDir = -имя директории, в которую переносится программа
nameOfApp = название исполняемого файла
subKeyAdress = путь к записи в реестре для добавления в авторан
reserved – зарезервированное поле
name — название записи в реестре
startPause — пауза перед началом записи скринов
exitPause – пауза перед принудительным выходом из программы
adressFrom –адрес отправителя
nameFrom –подпись отправителя
nameTo — почтовый адрес получателя
mailSubject — Тема письма
mailBody – текст письма
smtpAdress –адрес SMTP сервера почты отправителя
smtpPort – порт отправки почты
mailPassword – пароль от почты отправителя
exp – расширение файла
timeBetweenScreens –время между снятием двух скриншотов.

Резюмируя:

Только что был описан процесс написания приложения для отслеживания действий на удаленном компе. Подключив сюда получение файла с списком команд с сервера и разбиение его, получим упрощенный самописный TeamViewer. Но это — не в этой статье.

Исходники
Теги:
Хабы:
Всего голосов 43: ↑16 и ↓27-11
Комментарии16

Публикации

Истории

Работа

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
14 сентября
Конференция Practical ML Conf
МоскваОнлайн
19 сентября
CDI Conf 2024
Москва
20 – 22 сентября
BCI Hack Moscow
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
25 сентября
Конференция Yandex Scale 2024
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн