普通的防病毒软件(据我所知)使用一种蛮力类型的方法,在这种方法中,他们获取文件的哈希值并将其与数千个已知病毒的哈希值进行比较。仅仅是他们拥有配备超高速SSD的服务器,并且将哈希值上传到服务器并真正快速地进行搜索,还是我对它们的工作原理完全不了解?

评论

您为什么认为在数千个列表中查找哈希值比较慢?使用正确的数据结构,现代计算机可以每秒进行数百万次这样的搜索。数以千计的哈希表很容易放入内存,不需要快速的SSD。

哈希查找平均为O(1)(仅在极少数情况下,它在O(n)中起作用)。尽管如此,哈希的重点是执行文字比较。因此,这意味着黑客可以向病毒添加无意义的两个字节,并通过将所有可能的值分配给两个字节来轻松制作65'536版本的文件。

AV软件仍然是PC上最大的性能拖累之一:)相对而言,如此之快...

哈希的查找不是问题,哈希的计算更多。但是,基于纯签名的AV不再是一个好的解决方案。 (而且更先进的方法要求更高)

他们不是。他们将性能损失隐藏在其他过程中。

#1 楼

披露:我为一家防病毒软件供应商工作。

由于大多数反病毒引擎都是作为保护端点而诞生的,即使现在对于许多端点而言,端点保护也是业务的重要组成部分,因此现代反病毒引擎针对扫描端点进行了优化。此优化包括许多内容,例如:


不扫描不会包含可能感染计算机的感染的文件;
记住已扫描的文件,而不扫描除非修改了文件,否则它们将再次出现;
在可能的情况下优化扫描文件类型-例如,在扫描可执行文件时,仅需要扫描文件的某些部分。这样可以最大程度地减少磁盘读取并提高性能。

一个常见的误解是AV引擎使用哈希。它们通常不会这样做,原因有以下三个:


首先是避开哈希检测非常简单,根本不需要修改实际的恶意代码;
第二个是使用散列不允许您实施任何形式的主动保护-您将只能检测到您看到的恶意软件;
计算散列需要读取整个文件,而对于某些文件(例如可执行文件),这不是必需的。而且读取非SSD硬盘上的整个文件是一项昂贵的操作-大多数AV引擎应扫描大型干净的可执行文件,而不是计算其上的哈希值


评论


存储文件时,在可执行文件中,在消息中间添加一个随机数会使每个文件具有不同的哈希值。

– Skaperen
17年11月12日在8:41

我已经多次听说过这种“哈希检测”。感谢您确认这是没有道理的。

–扎农
17年11月12日13:43

我认为此答案不能完全解决如何实现性能的主要问题。特别是,“大多数AV引擎应该比在其上计算散列更快地扫描大型干净的可执行文件”,这似乎只会使OP的问题永久存在。与从中计算散列/校验和相比,扫描大文件的速度有何精确度?这两个操作似乎都是O(n)。

–aroth
17年11月13日在13:48

@aroth因为“例如,当扫描可执行文件时,只需要扫描其中的某些部分即可。这可以最大程度地减少磁盘读取,并提高性能。”

– David Mulder
17年11月13日在14:30

@ PeterA.Schneider因为缺少更好的用词,所以无法编写可监控的操作吗?

–timuzhti
17年11月14日在8:24

#2 楼


(据我所知)常见的防病毒软件使用一种蛮力类型的方法,可以获取文件的哈希值并将其与数千个已知病毒的哈希值进行比较。仅仅是他们拥有配备超高速SSD的服务器,并且将哈希值上传并真正快速地进行搜索,还是我对它们的工作原理完全不了解。


我认为您是重新考虑那些仅进行哈希处理的在线“防病毒”,与提到的(启发式和基于规则的防病毒)SmokeDispenser(效率更高,更高级)相比,效果相当差。

哈希是一个不错的选择在一个用例中,您将一个病毒文件发送给很多人,并且您使用的AV引擎经常更新,因此在遇到病毒之前,将接收并存储哈希值。例如,在这种情况下,您可以立即将电子邮件附件标记为病毒/网络钓鱼/勒索软件/特洛伊木马等,并且您可以以最小的计算量来完成此操作。如果您仍然必须读取整个文件并且连接良好(两方面都是因为例如您是邮件服务器),那么额外的I / O费用就可以忽略不计。

因为这是少数在所有用例中,(好的)防病毒软件不会(只是)使用哈希。

但是,检查哈希确实非常非常快。您根本不需要SSD或任何复杂的硬件。

想象一下(即使它不能完全那样工作)您有一个十六进制的哈希值,例如“ baadc0debaadbaad”,并想验证它是否存有千亿个档案的档案中是否存在。

创建归档文件时,您在硬盘上创建了256个目录,并将它们从“ 00”命名为“ ff”(十进制为0到255)。在每个目录中,您都创建了256个目录,名称再次从“ 00”到“ ff”。然后在每个目录中再次放置256个目录,并在AB / CD / EF格式的每个第三级目录中放置所有以'abcdef'开头的哈希,将其分成256个文件,从“ 00.txt”到“ ff.txt”。

因此,哈希值“ baadc0debaadbaad”最终存储在文件“ C:/ba/ad/c0/de.txt”中,该文件的内容为:

...
baadc0de81f872ac Ebola virus
baadc0debaadbaad Dark Avenger virus
baadc0debf31fe11 known clean file
...


该文件中有多少个哈希?如果哈希是均匀分布的,则只需将1000亿除以文件数即可。一共有256个文件夹,其中包含256个子文件夹,其中包含256个子文件夹,其中包含256个文件,因此文件数为256 * 256 * 256 * 256 =4294967296。

千亿除以该数字约为二十四。 。那就是那个文件中平均应该有多少个哈希。

所以,如果给您一个哈希,并要求您手动找到它在这千亿个哈希之间,那么您只需要要单击相应的第一级文件夹,请单击第二个,再单击第三个文件夹,打开相应的文件并读取二十四个哈希。您可能会在不到30秒的时间内完成操作,“显然”每秒检查了30亿个哈希。用手。靠你自己这似乎是不可能的,只是很好的数据组织。

计算机可以更有效地完成相同的事情。

基于规则的扫描

更多复杂的情况是如何在一个文件(您最初不知道)的内部扫描已知和经过分析的病毒。

在这种情况下,有用的事实是操作系统必须执行病毒,因此病毒不能随处可见-它必须是操作系统会主动寻找它的地方。通常,病毒会通过隐藏某个地方(例如,在数据区域中)并将其可执行区域的开头替换为对自身的调用来感染可执行文件。这意味着在大多数情况下,您只需要扫描可执行区域并确保它是干净的即可(当然,病毒始终以隐藏在不太可能的地方的聪明方法一直弹出,因此实际情况比我刚才说的要复杂得多)。

防病毒软件位于相同的位置,在这种情况下,将对文件执行基于规则的分析。这类似于哈希搜索:检查敏感区域中遇到的第一个字节,然后根据其值在其他地方查看另一个字节。进行这种操作的算法有时称为自动机。例如,查看文本字符串是否为“ Hello,World!”。或“黎明袭击”,您将检查第一个字母;如果它是H,那么您将忽略对“黎明时的攻击”的所有检查。

通过程序,多态性和自加密使这变得更加复杂-事实上,两个不同的代码(例如2 + 2和2 * 2)可能会产生相同的结果,因此您需要进行更多检查(“如果第一个单词是Hello,Howdy或Good ...”,以便确定您找到了变体)可怕的病毒称呼,宇宙!对于自加密代码,您可能需要找到一种破解代码的算法(如果在很短的时间内可行),或者专注于识别自解密例程,否则,该病毒将使其自身无法执行。通过系统。

但是,通过仔细选择选择树,您将能够快速收敛到单一可能性(病毒名称),或者确信没有已知病毒存在。

启发式

这是最复杂(且最慢)的分析,但也是功能最强大的,因为它使您可以强烈怀疑迄今未知的病毒的存在。
您可以想到作为许多基于规则的小型识别器的启发式方法;较小的速度可以抵消许多速度。每个识别器都将识别一段执行动作的代码,例如解密代码,尝试获得系统特权,打开和写入文件,挂钩系统调用,将代码重写到内存中,渗透到操作系统等。许多合法程序会执行所有这些操作中的一项或多项,或者看起来是这样做的(例如,解密和解压缩看起来非常相似。有些程序也经过加密以保护知识产权,而不是隐藏恶意代码)。对于每个操作,您都将建立一个“得分”,并且超过一定阈值的可执行代码可能会被视为可疑。

启发式引擎的确切细节当然比这复杂得多;他们需要平衡速度,可靠性(当他们说这是可疑时,必须是可疑的)和敏感性(当它是可疑时,他们必须能够说出它是可疑的)。

实际上,它们非常复杂,以至于通常被防病毒公司严密保护,并经常被吹捧为“人工智能”的“智能”。

不断更新规则的必要性(仍然寻找十年前就已经灭绝的病毒几乎没有任何意义),而且不那么紧急,但同样重要的是,调整启发式算法,是防病毒软件质量的一个重要参数是其更新频率的原因(即使在某种程度上,出色的启发式引擎可能允许较少的更新,而不可能完美的启发式引擎可能根本不需要)。

优化

如果您是防病毒软件,并且能够加载到操作系统内核中,从而可以拦截任何磁盘写入操作,并且可以确定在不激活代码的情况下无法引导操作系统(即, (无法进行蓝筹),那么的确是在您不知情的情况下,无法修改磁盘上的文件。在这一点上,您可以跟踪已扫描并发现干净的文件,并且仅扫描自上次扫描以来已被修改的文件,这只占总数的很小一部分(您甚至可能会忽略由非扫描文件执行的磁盘写入操作)感染的进程;只要您考虑到这样的事实,即可以使用某种方式使用Javascript编写的病毒可以要求另一个进程(例如WSCRIPT代表它写入磁盘)。

评论


在您对256个目录和256个子目录等的解释中,等等..这是什么类型的数据结构?例如,它不是二叉树,而是一棵树,对吗?仅仅是目录树吗?极好的答案。我很惊讶它没有引起更多讨论。感谢您抽出宝贵的时间提供这种高质量的内容。

–哈珀维尔
19年4月12日在2:05

@harperville这是一棵N树,是的。当然,这里,N = 256。二叉树的N = 2。您可以使用目录(如果没有目录长度限制)和二进制散列来执行此操作。然后,该目录也被实现为树-我认为通常是B树,它是具有变量N的N树。如果仅填充有哈希值的树,则最终会得到B树。而且,如果该目录实际上确实是作为B树实现的,并且没有其他效率低下的情况(有!),那么您可以将所有文件保存在一个目录中,以加快访问速度。

– Lerni
19年4月12日在9:16



#3 楼

尽管防病毒软件可能会上载样本进行分析(请参阅下文),但这并不是检测的工作原理。

基于签名的系统也变得越来越少见(因为它们很容易逃避)。它们也无法正常工作。

签名是建立在特定区域或二进制文件的一部分之上的。如果位置未知,则使签名窗口在二进制文件中“滑动”。因此,这比您作为中间产品所想的要复杂得多,并且会生成更多的样本。

尽管如此,搜索这些签名并不是很慢,但也不是很快。使用杀毒软件时通常会出现明显的延迟。

尽管如此,这样做并不需要大量的磁盘空间或RAM(尽管有些)-当4K视频被播放时,还有很多事情要做。解码以显示。

除了签名,还进行了启发式分析和行为分析,因此将要讨论的二进制文件放到沙盒中并对其行为进行分析。如果所采取的操作可疑,则这些二进制文件可能会被阻止-这是将样本发送到AV供应商进行进一步分析的时间。

总结:

这不是这么快。但是操作并不复杂,以至于它们需要服务器,而不能由工作站自己完成。

这样的服务器基础架构必须庞大。如果要在工作站上进行艰苦的工作,那将意味着一台强大的服务器可能会服务于一些客户,从而使供应商可能拥有3亿份副本来支付和操作数百万台服务器。

评论


我要争论的唯一一点是端点:服务器资源比率是2还是3:1 ...无论您是在谈论移动电话,笔记本电脑甚至是商务台式机,比率都应该更高。我们使用的库存计算服务器是96核和1TB RAM,以及12个SSD和24个旋转磁盘。那将相当于数十到数百个端点。

–基本
17年11月12日在18:38



@Basic完全取决于所用服务器的类型,是的。我将对该段进行编辑以使其更加宽松。

– Tobi Nary
17年11月12日在18:43