确定文件是否加密的方法?

信息安全 密码学 杀毒软件 编程
2021-09-02 05:39:30

我正在研究一个反勒索软件项目。它只是监视文件系统,并监视正在创建和删除的文件。(还监视已知的勒索软件文件扩展名。)

基本操作:如果(Y目录中的文件X被创建),不久之后(Y目录中的文件Z被删除。)扫描文件X并尝试确定它是否是加密文件。

我被卡住了,因为我不知道如何确定文件是否已加密。我已经阅读了很多关于 SO 的帖子,但我仍然是空的。

我的问题基本上是:可以使用哪些方法来确定文件是否已加密?

3个回答

您可以运行ent来查看文件有多少熵,具有高熵的文件可能是压缩或加密的(或两者兼而有之)。一个问题是 JPEG、XLSX 和 ZIP 是压缩的,所以实际上压缩文件很常见。

如果您怀疑 X 是文件 Z 的加密版本,那么您可以检查它们是否具有相似的大小,以及加密标头的小增量。

file如果您的环境(BSD/OSX/Linux 的标准部分)可用,您可以使用该命令。例如,一旦加密内容可用:

$ gpg --encrypt test-encrypted -r sample@sample.com

Enter the user ID.  End with an empty line: 
$ ls                       
test-encrypted      test-encrypted.gpg
$ mv test-encrypted.gpg testfile.txt

file 可以将其识别为 GPG 加密内容:

$ file testfile.txt 
testfile.txt: GPG encrypted data

但是,这仅显示基于标头和尾标的信息。不久前,有人编写了一个Powershell 脚本来查找 Cryptolocker 文件链接到 PS 脚本),这可能对您有帮助,也可能对您没有帮助。您将遇到的问题是:“这是如何加密的?” 例如,如果攻击者只是为“受密码保护的 zip”文件创建了一个复杂的密码,这本身并不是加密,因此您的脚本将被检测为 zip 文件,而不是加密文件。

同样值得注意的是,这些勒索软件文件中有许多在每次迭代时都会发生变化。例如,locky 将 *.locky 附加到每个文件,因此虽然有些可能很容易检测到,但想象一下如果您的所有文件都被重命名为随机校验和。现在您无法识别文件:例如:

MD5 ("salesfile") = 64d11ab29c2d78b325d8a944119d1150.doc
MD5 ("payrollfile") = d9087b158cd38e844999456d17611f1c.doc
MD5 ("engineeringfile") = 14e8e9011a4d3343df39e35fc7f2cd29.doc
MD5 ("researchfile") = 26779202429523339305a90e6ec74146.doc
MD5 ("managementfile") = 419765bc586cdd1bf741afe771951bec.doc

现在你有一个更大的问题。哪个文件对花费时间“破解/解密/等”更重要。在大多数情况下,基于 Unix 的系统上的文件命令和/或 Powershell 脚本应该为您提供一个起点。如果你真的想要技术的话,还有YARA创建一个 YARA 签名,并使用它进行搜索。

如果您有一个干净的系统,您可以使用 PowerShell 为有效文件生成哈希(即,您可能有有效的加密、压缩、二进制和常规文件);并且每次扫描都会生成新的哈希值并比较是否有任何哈希值发生了变化。

根据类型等,您可以确定这是否是正常行为。

例如,我希望在 Windows 中使用 PowerShell Get-Process 来提醒进程是否有更改等。

这是可以扩展的想法的演示。

PS C:\windows\system32> ## 演示
# 展示如何对服务器进行指纹识别并找出是否有新的 
# 进程自引导或上一个基线以来启动
#   
获取进程 * | Export-Clixml 'D:\Digital Forensics\__\baseline-local-GPROC-000.xml'
$gpbaseline000 = Import-Clixml 'D:\Digital Forensics\__\baseline-local-GPROC-000.xml'

启动进程记事本.exe

获取进程 * | Export-Clixml 'D:\Digital Forensics\__\baseline-local-GPROC-001.xml'
$gpbaseline001 = Import-Clixml 'D:\Digital Forensics\__\baseline-local-GPROC-001.xml'

比较对象 $gpbaseline000 $gpbaseline001 -属性进程名

PowerShell ISE 中的示例 PowerShell 会话 有关示例输出,请参见图像。