除了 Angel 的回应,正如您提到的流行的勒索软件变体中所见,加密是逐个文件完成的,其中一个文件被加密,然后文件的纯文本版本被删除,然后勒索软件移动到下一个文件。它可能会启动并行线程来加密多个文件,但结果与我们的目的相同。让我们看看 eda2、Cryptowall 和 CTB-Locker 是如何做到的。
eda2(开源勒索软件)
让我们从开源勒索软件eda2开始,作者从 github 上删除了代码,它的作用是这样的:
//Encrypts a file with AES algorithm
public void EncryptFile(string file, string password)
{
byte[] bytesToBeEncrypted = File.ReadAllBytes(file);
byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
// Hash the password with SHA256
passwordBytes = SHA256.Create().ComputeHash(passwordBytes);
byte[] bytesEncrypted = AES_Encrypt(bytesToBeEncrypted, passwordBytes);
File.WriteAllBytes(file, bytesEncrypted);
System.IO.File.Move(file, file + ".locked"); //new file extension
}
它开始检查驱动器和目录,递归地将每个与其条件匹配的文件(文件扩展名在其预定义列表中)传递给 EncryptFile 方法,并且该文件被其加密版本覆盖。
Cryptowall 4
Cryptowall 4 由Cisco Talos分析,此图显示了其加密过程:
此勒索软件运行多个单独的线程,其中一个是执行加密部分的“DoFilesEncryption”线程。
遍历文件夹并找到文件后:
此时真正的文件内容加密发生,原始文件以 512 KB 块的块读取。每个块都使用生成的密钥加密,使用 AES-CBC 256 算法,并直接写入新文件(连同前四个字节中的块大小)。
删除是这样的:
// Move the new encrypted file name in the old original position, replacing the old one
bRetVal = MoveFileEx(newEncFileName, lpOrgFileName,
MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING);
if (!bRetVal)
// Delete the old file in the standard manner:
DeleteFile(lpOrgFileName);
else {
// Rename the original replaced file in the new random file name
bRetVal = MoveFileEx(lpOrgFileName, newEncFileName, MOVEFILE_REPLACE_EXISTING);
}
CTB-Locker
正如这里分析的那样,有点像 Cryptowall,有一个线程负责加密文件,这个例程在其中发生:
- 使用 MoveFileEx API 调用将文件移动到临时文件(%TEMP%\<name>.tmp 其中 <name> 由 corehash 确定)
- 临时文件被读入内存
- 生成非对称密钥对和对称密钥
- 文件缓冲区使用 zlib 库中的 DEFLATE 数据压缩算法进行压缩(静态链接到可执行文件)
- 压缩后,文件缓冲区使用 AES-256-ECB 加密
- 包含与此文件关联的公钥和加密信息向量的标头被添加到加密数据之前
- 标头前缀的加密缓冲区被写入临时文件
- 使用 MoveFileEx API 调用移动临时文件以覆盖原始文件,并在原始文件中附加一个新的扩展名(派生自 corehash)
进一步的思考和总结
如上所述,文件在旅途中被加密,通常被其加密版本覆盖。现在让我们分析一下这个设计。在我看来,逐个加密和替换文件是一个更好的选择。
- 一个一个加密文件很容易实现
- 如果勒索软件在运行过程中被阻止,一些重要文件仍有可能被加密并且受害者愿意付费
- 批量加密然后批量删除文件需要额外的磁盘空间和复杂的文件删除
保持沉默和隐藏是勒索软件的担忧之一,另一个担忧是它们必须快速。它们还必须简单,以便可执行文件尽可能小。
它们针对未受保护的系统,这些恶意软件使用的漏洞利用工具包针对 Flash 等应用程序中的漏洞,它们还从没有数据备份的受害者那里获利,因此通常它们不必处理强化和超级安全的系统. 他们只是针对未受保护的未备份用户。他们不必是防弹的才能盈利,他们只需要足够好,所以有时他们没有最好的实施。
现在,为了解决加密大文件时的性能问题,我看到勒索软件使用的一种技术是仅加密文件的前 n 字节。这通常足以破坏大多数文件,并且比加密整个文件要快得多。不幸的是,此时我找不到使用这种技术的特定勒索软件的名称。
中途
发现勒索软件
请参阅中途发现加密勒索软件怎么办?作为背景,在操作过程中捕获勒索软件并不一定能让您完全停止它或取回所有文件。
勒索软件不会加密你的整个文件系统,它们通常会保持可执行文件完好无损,因此受害者必须打开图像、文档或类似的东西才能注意到有问题。
即使对于尚未对勒索软件进行过一些研究的精通计算机的人来说,也可能不清楚发生了什么,文档损坏或无法打开的原因可能有很多(一些勒索软件不会改变文件的扩展名)。将此添加到有人实际注意到勒索软件正在加密他们的文件的可能性上,这似乎并不是一个主要问题。
即使这是一个主要问题,而不是批量加密/删除,恶意软件也可以监控用户活动,同时保持隐藏状态,不进行加密,一旦发现用户处于非活动状态/afk,它就可以启动加密过程。