Сервер – Клиент Изнутри. На примере и разработка программы!
Если Вам интересно посмотреть, как пишутся «Программы сервер – клиент» и как они работают на реальном примере, предлагаю прочитать пост до конца. Будет интересно!
Пример программы я решил писать на Delphi! Так как, это проще и хорошо подходит для маленького, но реального примера. Что касается грозного слова «Троян» которое я упомянул выше, то тут, получается действительно, самый настоящий троян, но с малым и безобидным функционалом.
Вы узнаете, по какому принципу пишутся «Трояны» и как они работают изнутри! Но, есть одно «НО» Трояны не пишут, так как – это будет описано ниже. Поскольку в нашем примере, «Серверная» часть программы будет много весить (Это не приемлемо для реального трояна), и мы не будет её скрывать в системе. В реальном, «Вредоносном ПО» дела обстоят немного по другому.
Серверную часть программы стараются разработать с малым размером, ну примерно «100 КБ» Плюс — минус сколько-то КБ. И скрывают её в системе, так, что искать её придется долго!…
Но все ровно, принцип разработки один! И данный пример идеально подойдёт для понимания, как работаю программы по принципу «Сервер — Клиент» Просто у нас не правильный тон разработки трояна, а оно нам надо? Правильно. НЕТ!!! Мы же хорошие ребята и хулиганить не собираемся!
Как работают программы по принципу «Сервер – Клиент»
Просто и в двух словах картина выглядит вот так: Вы на своём компьютере запускаете «Клиентскую» часть программы, как правило, она имеет «GUI» то есть интерфейс пользователя (Если клиент не консольный)
На компьютере, к которому вы желаете получить доступ, запускается «Серверная» часть программы, она же открывает определённый порт на чужом компьютере и не видна в системе.
Через этот порт происходит соединения, Вы в клиенте указываете порт и IPадрес компьютера, на котором запущен сервер, подключаетесь к серверу и можете спокойно выполнять какие-то действия на чужом ПК со своего компьютера! Ещё можно прочитать мой прошлый пост и узнать:
Надеюсь, что здесь объяснил, вроде как понятно и простым человеческим языком! Если что-то не ясно, дальше, на примере все станет ясно! Далее давайте определимся, какие действия буду выполняться на удалённом ПК вследствие работы нашего маленького трояна!
Какой функционал в данном примере программы Сервер – Клиент.
Честно сказать, на этом этапе, когда размышлял, что бы показать я как-то замешкался и не как не мог придумать, что-то интересное! В общем пусть будет функционал из одной возможности и до жути простой:
— Пользователь будет получать Ваше сообщение.
Не вижу смысла добавлять какие-то другие возможности. Так как, считаю, что для примера и понимание этого вполне достаточно. Так же, думаю, не стоит писать много кода, то, что имеется ниже, то же достаточно, что бы посмотреть на программу изнутри!
А за место сообщение может быть все что угодно, зависит от фантазии человека решившего написать троян и от его знаний в программировании.
Ну, а у нас будет такой прикол! Человек, сидя за компьютером, неожиданно получит сообщение, например
«Привет, я шастаю по твоему компу»
представляете реакцию человека? Думаю это смешно, было бы увидеть его выражение лица!!!
Разработка программы по принципу «Сервер – Клиент»
Приступаем к самому интересному! И начнём мы с разработки самого «Сервера» после чего напишем под него клиент! Я не буду объяснять код программы, просто, буду приводить примеры, все же у меня не блог по программированию, да и цель поста показать поэтапно процесс разработки подобных программ по типу «Сервер – Клиент»
Разработка Сервера!
Изначально, нужно научить «Сервер» открывать какой-то порт на компьютере, дабы в дальнейшем иметь возможность подключиться к нему из «Клиента» а уже после научим принимать команды и выполнять какие-то действия на ПК.
Откроем порт следующим кодом, который до боли прост:
1 2 3 4 5 6 |
procedure TForm1.FormCreate(Sender: TObject); begin ServerSocket1.Port := 666; ServerSocket1.Active := true; end; |
Теперь если запустить программу появится просто, пустое окно без всяких кнопок и прочих элементов. И самое главное, на компьютере будет открыт порт с номером «666» Именно на этот порт в дальнейшем будем отправлять команды на сервер, и он в свою очередь будет их обрабатывать.
А пока убедимся, что сервер работает и порт открыт, вспоминаем команду «netstat» и смотрим результат.
Как видим на компьютере, вследствие запуска нашей программы действительно был открыт порт с номером «666» Это говорит только ободном, программа работает, и пришла пора научить «Сервер» принимать сообщение.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var komm:string; Begin komm:=socket.ReceiveText; if copy(komm,1,12) = 'MESSAGE_TEXT' then begin Delete(komm, 1, 12); ShowMessage(komm); end; end; |
Тут дела обстоят следующие образом! Если серверу придёт команда с названием «MESSAGE_TEXT» (Название может быть любое) то сработает процедура «ShowMessage» и покажет сообщение, которое пришло вмести с командой и хранится в строковой переменной «komm»
Соответственно текст сообщение будем набирать в «Клиенте» и он может быть любого содержание!
В прочем, на этом разработка «Серверной» части закончена. В итоге у нас получился файлик «Server.exe» и пока отложим его в сторону до того момента пока не напишем «Клиент»
Разработка Клиента!
Клиент у нас будет по понятным причинам с графическим интерфейсом пользователя (GUI) и должен иметь элементы управление, кнопки и поля ввода. У меня получился вот такой вид программы:
Определимся со всеми элементами! Хотя и так понят но, как говорится, на всякий случай поясню.
— IP: Поля для ввода IPкомпьютера, где запущен сервер.
— Port: Указываем номер порта на котором висит сервер.
— Подключится: Кнопка для подключения к серверу.
— Текст сообщение: Поле для ввода сообщение, которое нужно отправить.
— Отправить сообщение…: Соответственно кнопка для отправки сообщение.
— Статус соединение: Тут мы узнаем, подключились или нет!
Дальше пробуем научить «Клиент» подключаться к серверу и проверим, как это работает. В данном варианте, код для кнопки «Подключится» выглядит так:
1 2 3 4 5 6 7 8 9 |
procedure TForm1.Button1Click(Sender: TObject); begin ClientSocket.Host := IP.Text; ClientSocket.Port := StrToInt(Port.Text); ClientSocket.Open; end; |
Можно уже прям сейчас, запустить программу, и попробовать подключиться к «Серверу» но мы не узнаем результат, подключились или нет. Перед проверкой исправим это и научим программу показывать результат соединение.
1 2 3 4 5 6 7 8 |
procedure TForm1.ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket); begin Label4.Caption := ('Удалось выполнить подключение к: ' + IP.Text); Label4.Font.Color := clGreen; end; |
И на тот случай, если все токи не удалось подключиться к серверу, например потому-что «Сервер» на удалённом ПК не запущен и соответственно порт «666» закрыт.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
procedure TForm1.ClientSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin if ErrorCode = 10061 then begin ClientSocket.Active := False; Label4.Font.Color := clRed; Label4.Caption := ('НЕУдалосьвыполнитьподключениек:' + IP.Text); ErrorCode := 0; end; end; |
Теперь смотрим, как работает программа. Для начала запускаем клиент, но не запускаем сервер, что бы проверить, будет ли выведено сообщением о том, что подключится, не удалось.
Подключиться не удалось, все верно! Сервер же не запущен, соответственно подключаться не куда!
Проверим, как работает программа с запущенным сервером немного ниже, а пока научим «Клиент» отправлять нашу команду «MESSAGE_TEXT» помните? Мы её указали в «Сервере» если она придёт, то сообщение показать!
1 2 3 4 5 |
procedure TForm1.Button2Click(Sender: TObject); begin ClientSocket.Socket.SendText('MESSAGE_TEXT' + MSG_TEXT.text); end; |
Вот такой код будет для кнопки «Отправить сообщение на удалённый компьютер» При нажатии этой кнопки сервер получит команду «MESSAGE_TEXT»и выполнит соответствующие действия, в нашем же случае, покажет сообщение из поля клиента «Текст сообщение»
Теперь когда «Клиент» умеет определять статус подключение к «Серверу» самое время все проверить. Запустим Сервер и Клиент. Далее пробуем подключиться к «Серверу» и смотрим статус.
Видим, что статус подключения к удалённому компьютеру (В данном случае – это локальный) положительный, то есть мы успешно подключились к серверу по нужно порту.
Теперь самое время, после подключения нажать кнопку и посмотреть выдаст сервер сообщение с нашим текстом или нет.
Видим, что сообщение с текстом вышло успешно – это свидетельствует о том, что наша «Программа» работает хорошо.
Если Вы не знали о таком типе программ, которые работают по принципу «Клиент — Сервер» то сейчас я надеюсь, для Вас стало все ясно и понятно!
Выше разработанную программу я закину в архив и дам ссылку на загрузку чуть ниже, на тот случай если Вам интересно попробовать. Например, киньте «Сервер» жене на компьютер, а сами со своего компьютера шлите ей сообщение, после смейтесь и наблюдайте за её реакцией.
Я так уже делал, прикольно!