Привет всем, хочу предложить вашему вниманию результаты моего эксперимента с интерфейсом IDXGIOutputDuplication. Из описания в MSDN интерфейс просто волшебный, однако пришлось повозиться для того чтобы приспособить его для пересылки экрана. В результате получилась пародия на RDP или маленький скелетик удаленного управления. Маленький в прямом смысле – неупакованный сервис с сервером в ресурсах весить 50 кбт, если его упаковать, то получится 30 кбт. Выложить это все я решил потому, что я удовлетворил свое любопытство и мне надоело возиться с этим проектом.
Итак, получилось три модуля:
Первый модуль, это клиент для просмотра удаленного экрана; второй модуль, это сервер – захват и сжатие удаленного экрана; третий модуль, это сервис для управления работой сервера т.е. решет проблемы с переключением пользователей.
Все эти модули дают возможность управлять удаленным компом наподобие RDP и подобных ей программ. Есть возможность, обратного вызова, в смысле, когда сервер соединяется с клиентом. Классический вариант, когда сервер висит на каком-либо порту и ждет запросы клиента тоже есть.
Логика работы предельно простая: при помощи интерфейса IDXGIOutputDuplication делаются скриншоты, являющиеся кадрами видеопоследовательности. Для уменьшения трафика изменил цветовую палитру каждого кадра, и на сервер отправляю разницу между кадрами, которая сжимается zlib. Мышь и клавиатура пересылается асинхронно через UDP сокет. Сервис запускает сервер от имени системы при помощи дублирования токена winlogon. Также, сервис перезапускает сервер если изменяется пользователь. Для установки сервиса нужны права админа. Можно сервер использовать и без сервиса. У Сервера есть три режима работы: первый - сервер слушает торт 443 и периодически ищет возможность соединиться с клиентом через порт 7788: второй – сервер не слушает порт и только делает попытки соединиться с клиентом; третий – сервер только слушает порт и все. UDP, порт для пересылки, ввода выбирается произвольно. Обратный вызов работает так: нужно сделать акк. на freedns.afraid.org и связать DNS имя с IP адресом компа на котором запущен клиент для примера: serg.chickenkiller.com связан с 127.0.0.1. ДНС имя серверу известно, через него сервер узнает ИП. В результате, если вы запустите на своем компе сервер и клиент, то через минуту сервер подключится к клиенту и вы увидите копию экрана своего компа. Авторизация между клиентом и сервером происходит автоматически типа примитивный handshake.
В архиве есть исходник и три бинарика. Возможно кому-нибудь все это пригодиться. Нпример пошпионить за кем-нибудь
Итак, получилось три модуля:
Первый модуль, это клиент для просмотра удаленного экрана; второй модуль, это сервер – захват и сжатие удаленного экрана; третий модуль, это сервис для управления работой сервера т.е. решет проблемы с переключением пользователей.
Все эти модули дают возможность управлять удаленным компом наподобие RDP и подобных ей программ. Есть возможность, обратного вызова, в смысле, когда сервер соединяется с клиентом. Классический вариант, когда сервер висит на каком-либо порту и ждет запросы клиента тоже есть.
Логика работы предельно простая: при помощи интерфейса IDXGIOutputDuplication делаются скриншоты, являющиеся кадрами видеопоследовательности. Для уменьшения трафика изменил цветовую палитру каждого кадра, и на сервер отправляю разницу между кадрами, которая сжимается zlib. Мышь и клавиатура пересылается асинхронно через UDP сокет. Сервис запускает сервер от имени системы при помощи дублирования токена winlogon. Также, сервис перезапускает сервер если изменяется пользователь. Для установки сервиса нужны права админа. Можно сервер использовать и без сервиса. У Сервера есть три режима работы: первый - сервер слушает торт 443 и периодически ищет возможность соединиться с клиентом через порт 7788: второй – сервер не слушает порт и только делает попытки соединиться с клиентом; третий – сервер только слушает порт и все. UDP, порт для пересылки, ввода выбирается произвольно. Обратный вызов работает так: нужно сделать акк. на freedns.afraid.org и связать DNS имя с IP адресом компа на котором запущен клиент для примера: serg.chickenkiller.com связан с 127.0.0.1. ДНС имя серверу известно, через него сервер узнает ИП. В результате, если вы запустите на своем компе сервер и клиент, то через минуту сервер подключится к клиенту и вы увидите копию экрана своего компа. Авторизация между клиентом и сервером происходит автоматически типа примитивный handshake.
В архиве есть исходник и три бинарика. Возможно кому-нибудь все это пригодиться. Нпример пошпионить за кем-нибудь