Итак, приветствую. В данной статье будет разобран процесс написания программы, позволяющей в режиме реального времени отслеживать все действия происходящие на удаленном компьютере, без ведома конечного пользователя. Автор статьи предупреждает, что не несет ответственности за неправомерное использование нижеизложенных технологий и не рекомендует использовать ее в противоправных целях. Поехали!
При написании любого достаточно большого программного продукта, требуется разбить глобальную задачу на несколько более простых. Так и в данном случае, я выделил несколько практически несвязанных между собой процессов, которые, работая совместно, позволяют добиться требуемого результата. В частности, для реализации поставленной задачи требуется реализовать:
0) Добавление служебных файлов при первом запуске в папки системы
1) Снятие скриншота с экрана
2) Отправку скриншота на удаленный сервер
Соответственно, для реализации была выбрана платформа .NET, обладающая всем необходимым функционалом. Приложение написано на WindowsForms в целях наглядности и отладки, по большому счету оно могло быть консольным.
Описание функций:
SetConfig – обеспечивает чтение параметров конфигурации из приложенного файл настроек
Send – отвечает за отправку скриншота на почту
MakeScreen – отвечает за снятие скриншота
Circle – отвечает за повторение снятие и отправки скриншота в фоновом режиме с заданной периодичностью
CasualStart – определяет действия при очередном запуске программы
FirstStart – обеспечивает корректную установку программы
Теперь – чуть подробнее по каждой из функций. Настройка конфигурации:
Так как программное обеспечение должно быть гибким, следует обеспечить возможность изменения внутренних параметров программы извне ее кода. При каждом запуске данное программное обеспечение пытается найти файл SaveScreen.ini, обновить свои параметры и лишь потом начинать работать в штатном режиме. В случае же, когда обновить параметры невозможно, используются значения по умолчанию.
(о том, какой параметр за что отвечает – будет в конце статьи)
По техническим причинам, вместо пробела пришлось использовать нижнее подчеркивание, а вместо @ — #, но внутри программы осуществляется обратная замена.
Выполнение программы начинается в блоке Form1_load, и может развиваться в двух режимах – обычный запуск(если на компьютере есть установочная директория) и установка(если установочной директории нет). Рассмотрим каждый из них.
Первый запуск:
При первом запуске требуется создать директорию, в которой будут размещаться файлы программы, перенести туда исполняемый файл и файл конфигурации, а так же – добавить необходимые записи в реестр, для добавления программного обеспечения в автозапуск.
Соответственно, это осуществляет функция FirstStart()
После установки приложение закрывается – при следующей перезагрузке компьютера оно будет работать в штатном режиме.
Штатный запуск:
Штатный запуск запускает фоновый поток, который осуществляет снятие и отправку скриншота, а так же очищает папку с скриншотами, снятыми за прошлую сессию. После чего, ожидает в течении значительного промежутка времени перед принудительным завершением приложения. Перед запуском фонового потока возможна пауза, которую стоит выставлять на сравнительно медленных компьютерах для ускорения загрузки системы и отсутствия конфликтов при запуске.
СasualStart()
Циркуляция:
Все прозаично до безобразия – в вечном цикле мы снимаем и отправляем скриншоты, после чего – ждем указанное время. На порядок интереснее сам процесс снятия и отправки скрина.
Сделать скриншот:
В С# есть возможность сохранения изображения в битмап путем функции копирования с экрана. Поэтому все, что требуется сделать – создать объект для хранения скриншота, с разрешением, равным текущему разрешению экрана, привязать к нему объект, способный получить битмап с экрана и сохранить это в предварительно созданную директорию.
Отправка на почту:
В C# есть возможность работы с почтой используя предустановленные классы, позволяющие заполнить поля письма, указать адресата и адресанта и, собственно – осуществить отправку вызовом одного метода. Этот метод завернуть в try-catch блок на случай отсутствия подключения к сети – даже в таком случае программа не выдаст сообщение об ошибке, а будет покорно ждать, пока у нее появится возможность обратиться к серверу. Почтовый сервер был выбран из соображений простоты, в принципе — можно снимки перекидывать куда угодно.
Общее взаимодействие:
Запуск программы, пoвторюсь, осуществляется в методе Form1_Load. Программа пытается обновить конфиг, потом определяет – была ли она запущена в первый раз, если да – добавляется в нужную папку и в автозагрузку и отключается, а если нет – запускает фоновый процесс, который стабильно по заданному интервалу закидывает изображение с экрана на почтовый сервер. Ничего сложного или необычного, просто взаимодействие нескольких встроенных классов.
И, наконец, пояснение файла автоконфигурации – все имена переменных совпадают с именами в программе, поэтому, поясняя поля в инит-файле, я так же описываю сами переменные.
wayToDir – имя подпапки, в которую скидываются скриншоты
finalDir = -имя директории, в которую переносится программа
nameOfApp = название исполняемого файла
subKeyAdress = путь к записи в реестре для добавления в авторан
reserved – зарезервированное поле
name — название записи в реестре
startPause — пауза перед началом записи скринов
exitPause – пауза перед принудительным выходом из программы
adressFrom –адрес отправителя
nameFrom –подпись отправителя
nameTo — почтовый адрес получателя
mailSubject — Тема письма
mailBody – текст письма
smtpAdress –адрес SMTP сервера почты отправителя
smtpPort – порт отправки почты
mailPassword – пароль от почты отправителя
exp – расширение файла
timeBetweenScreens –время между снятием двух скриншотов.
Резюмируя:
Только что был описан процесс написания приложения для отслеживания действий на удаленном компе. Подключив сюда получение файла с списком команд с сервера и разбиение его, получим упрощенный самописный TeamViewer. Но это — не в этой статье.
Исходники
При написании любого достаточно большого программного продукта, требуется разбить глобальную задачу на несколько более простых. Так и в данном случае, я выделил несколько практически несвязанных между собой процессов, которые, работая совместно, позволяют добиться требуемого результата. В частности, для реализации поставленной задачи требуется реализовать:
0) Добавление служебных файлов при первом запуске в папки системы
1) Снятие скриншота с экрана
2) Отправку скриншота на удаленный сервер
Соответственно, для реализации была выбрана платформа .NET, обладающая всем необходимым функционалом. Приложение написано на WindowsForms в целях наглядности и отладки, по большому счету оно могло быть консольным.
Описание функций:
SetConfig – обеспечивает чтение параметров конфигурации из приложенного файл настроек
Send – отвечает за отправку скриншота на почту
MakeScreen – отвечает за снятие скриншота
Circle – отвечает за повторение снятие и отправки скриншота в фоновом режиме с заданной периодичностью
CasualStart – определяет действия при очередном запуске программы
FirstStart – обеспечивает корректную установку программы
Теперь – чуть подробнее по каждой из функций. Настройка конфигурации:
Так как программное обеспечение должно быть гибким, следует обеспечить возможность изменения внутренних параметров программы извне ее кода. При каждом запуске данное программное обеспечение пытается найти файл SaveScreen.ini, обновить свои параметры и лишь потом начинать работать в штатном режиме. В случае же, когда обновить параметры невозможно, используются значения по умолчанию.
(о том, какой параметр за что отвечает – будет в конце статьи)
По техническим причинам, вместо пробела пришлось использовать нижнее подчеркивание, а вместо @ — #, но внутри программы осуществляется обратная замена.
Выполнение программы начинается в блоке Form1_load, и может развиваться в двух режимах – обычный запуск(если на компьютере есть установочная директория) и установка(если установочной директории нет). Рассмотрим каждый из них.
Первый запуск:
При первом запуске требуется создать директорию, в которой будут размещаться файлы программы, перенести туда исполняемый файл и файл конфигурации, а так же – добавить необходимые записи в реестр, для добавления программного обеспечения в автозапуск.
Соответственно, это осуществляет функция FirstStart()
После установки приложение закрывается – при следующей перезагрузке компьютера оно будет работать в штатном режиме.
Штатный запуск:
Штатный запуск запускает фоновый поток, который осуществляет снятие и отправку скриншота, а так же очищает папку с скриншотами, снятыми за прошлую сессию. После чего, ожидает в течении значительного промежутка времени перед принудительным завершением приложения. Перед запуском фонового потока возможна пауза, которую стоит выставлять на сравнительно медленных компьютерах для ускорения загрузки системы и отсутствия конфликтов при запуске.
СasualStart()
Циркуляция:
Все прозаично до безобразия – в вечном цикле мы снимаем и отправляем скриншоты, после чего – ждем указанное время. На порядок интереснее сам процесс снятия и отправки скрина.
Сделать скриншот:
В С# есть возможность сохранения изображения в битмап путем функции копирования с экрана. Поэтому все, что требуется сделать – создать объект для хранения скриншота, с разрешением, равным текущему разрешению экрана, привязать к нему объект, способный получить битмап с экрана и сохранить это в предварительно созданную директорию.
Отправка на почту:
В C# есть возможность работы с почтой используя предустановленные классы, позволяющие заполнить поля письма, указать адресата и адресанта и, собственно – осуществить отправку вызовом одного метода. Этот метод завернуть в try-catch блок на случай отсутствия подключения к сети – даже в таком случае программа не выдаст сообщение об ошибке, а будет покорно ждать, пока у нее появится возможность обратиться к серверу. Почтовый сервер был выбран из соображений простоты, в принципе — можно снимки перекидывать куда угодно.
Общее взаимодействие:
Запуск программы, пoвторюсь, осуществляется в методе Form1_Load. Программа пытается обновить конфиг, потом определяет – была ли она запущена в первый раз, если да – добавляется в нужную папку и в автозагрузку и отключается, а если нет – запускает фоновый процесс, который стабильно по заданному интервалу закидывает изображение с экрана на почтовый сервер. Ничего сложного или необычного, просто взаимодействие нескольких встроенных классов.
И, наконец, пояснение файла автоконфигурации – все имена переменных совпадают с именами в программе, поэтому, поясняя поля в инит-файле, я так же описываю сами переменные.
wayToDir – имя подпапки, в которую скидываются скриншоты
finalDir = -имя директории, в которую переносится программа
nameOfApp = название исполняемого файла
subKeyAdress = путь к записи в реестре для добавления в авторан
reserved – зарезервированное поле
name — название записи в реестре
startPause — пауза перед началом записи скринов
exitPause – пауза перед принудительным выходом из программы
adressFrom –адрес отправителя
nameFrom –подпись отправителя
nameTo — почтовый адрес получателя
mailSubject — Тема письма
mailBody – текст письма
smtpAdress –адрес SMTP сервера почты отправителя
smtpPort – порт отправки почты
mailPassword – пароль от почты отправителя
exp – расширение файла
timeBetweenScreens –время между снятием двух скриншотов.
Резюмируя:
Только что был описан процесс написания приложения для отслеживания действий на удаленном компе. Подключив сюда получение файла с списком команд с сервера и разбиение его, получим упрощенный самописный TeamViewer. Но это — не в этой статье.
Исходники