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

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

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

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. Но это — не в этой статье.

Исходники
Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 16

    +19

    А ещё можно листинги вставлять не в виде скриншотов, а в виде фотографии экрана на телефон, например.

      –8
      Ок, учту. Нигде в правилах оформления не было рекомендаций по оформлению кода…
      Но на будущее — я вас понял
      +2
      Так это же защита от копирования!
      И, за одно, чтобы люди думали, когда переписывают.
      +4

      Как написать троян ) Ну ничего, все через это проходят, я тоже в свое время такое писал на Delphi. Только у меня была цель спереть пароль от диалАпа, pwl файл

        0
        Тоже писал такой на делфи, только цель была — получение списка вопросов к тестам =)
        +1
        Поздравляю вы написали кастрированную версию yaware/upwork/сотни других существующих таймтрекеров.
        по поводу «без ведома», как оно маскируется вы говорите? антивирь ему люлей не вставляет за попытки ломиться куда не следует?
          –6
          При первом запуске — вставляет. Говорит, что запускается приложение из непроверенного источника.
          А если программа установлена — единственное место, где можно ее найти, это диспетчер процессов.
          +1
          нижнее подчеркивание

          Хотел бы я посмотреть как выглядит верхнее подчёркивание :)
            0

            верхнее "надчёркивание" :)
            https://ru.wikipedia.org/wiki/Черта_сверху

              0
              Так оно «над», а не «под» :-) Впрочем, тут тоже слово «верхнее» явно лишнее. BTW, на самом деле интересно, откуда это нижнее взялось в совокупности с подчёркиванием.
              +1
              Т.е. больше во всей статье вас ничего не смутило? :)
                0
                Я не спец по Windows и по подглядыванию :)
                  –1
                  А есть еще конструктивные замечания? Любопытно
                +1
                Забавно, но на днях реализовал простенький рабочий anti screen logger, который как раз должен защитить от таких наивных логгеров. Можете попробовать — github.com/flamencist/AntiScreenLogger.
                Думаю, что хорошие скрин логгеры должны реализоваться на более низком уровне.
                  0
                  Не очень понятно, зачем изобретать свой велосипед, к тому же обладающий множеством недостатков, разве что автор просто набирается начального опыта в разработке.
                  И я бы посоветовал обратить внимание на хранение пароля от email в незашифрованном виде в конфигурационном файле. Доступ к указанной почте никак не защищён.

                  Only users with full accounts can post comments. Log in, please.