大多数防病毒软件都有数十万甚至数百万个恶意软件签名,但它们会在合理的短时间内以高检测率扫描许多文件。即使是实时扫描程序也不会显着降低计算机速度,但可以提供强大的威胁防护。扫描仪如何才能达到这种性能?
我知道这可能是一个广泛的问题,但我想对此有一个大致的了解。
大多数防病毒软件都有数十万甚至数百万个恶意软件签名,但它们会在合理的短时间内以高检测率扫描许多文件。即使是实时扫描程序也不会显着降低计算机速度,但可以提供强大的威胁防护。扫描仪如何才能达到这种性能?
我知道这可能是一个广泛的问题,但我想对此有一个大致的了解。
一个很好的类比是20 个问题的游戏,其目标是通过询问 20 个看似无关的是/否问题来识别任意对象。游戏背后的想法是,每个答案都会消除一半的对象,因此理论上可以仅用 20 个二进制特征来描述 2^20 (1,048,576) 个对象。
另一个类比是视觉皮层如何处理视觉信息。大脑有非常简单和快速的硬件来检测和分类无限数量的图像。只有六层神经元(神经元数量估计为 1.4 亿)用于逐步提取更复杂的特征并将它们传递到下一层。这些层相互来回交互以产生可以根据内存进行验证的抽象概念。
防病毒引擎将已知恶意软件的许多特征存储在定义文件中,当它们扫描新文件时,它们会优化这些特征的提取和分类(匹配)。存储特征还可以使检测更加稳健,这样恶意软件中的微小变化就不会阻碍检测。特征提取也是并行完成的,以便充分利用资源。
大多数功能是由人类设计的,但有些功能本身没有意义,例如文件末尾有一个空字节或文件大小与可打印文本大小之间的比率。这些无意义或不直观的特征是通过数据挖掘大量文件随机生成和测试的。最后通过特征组合对文件进行描述和分类。作为旁注,在 Stack Exchange 上关闭问题的最佳预测指标是问题的第一个字母是否为小写。
因此,当一个新文件被扫描时,它会很快被分类为越来越精细的类别,然后与一小组签名进行匹配。每一步都会排除大量干净的文件,并决定接下来应该提取哪些其他特征。第一步在计算资源方面非常小,但它们决定了以后应该采取哪些更昂贵的步骤。
通过仅使用少量磁盘读取和 CPU 周期,引擎可以确定文件类型。假设它是一个 JAR 文件。使用此信息,它开始收集 JAR 文件的特征。如果已签名,则中止扫描。如果它没有导入任何函数,那么扫描将被中止(我在这里过于简单化了)。它是否使用任何棘手的功能?那么应该提取更多的特征。它是否使用已知的易受攻击的功能?然后应该彻底检查已知的 Java 漏洞利用签名。
读写扫描背后的原理相同,但它也像看门人一样工作。因此,进程执行的每个操作(通常是 API 调用)都会被检查并允许或拒绝。同样,每个可疑操作都会触发更多过滤器和更多检查。在检查期间,进程或线程正在等待操作完成,但有时整个进程被主动挂起。这可能看起来像很大的开销,但是一旦验证了特定操作,它就会被缓存并非常快速地执行或根本不执行。结果是性能下降,类似于让机器慢几个百分点。在此处查看 20 种 AV 产品的 PCMark 分数。
因此,速度优化来自于对构成绝大多数扫描文件的干净文件执行的极少工作。繁重的工作只针对可疑的恶意软件文件,AV 甚至可能需要几秒钟的时间来模拟该过程,甚至将其发送到云端进行分析。
神奇之处在于渐进式分类。
恶意软件签名是表示存在恶意代码的唯一值。简而言之,当防病毒程序扫描您的计算机时,它会计算文件的签名(例如哈希),然后将该签名/哈希与已知的不良签名列表进行比较。
计算文件的单个哈希值,然后将其与数百万个哈希值列表进行比较,比在给定文件中查找每个恶意软件签名要容易得多。
签名可以表示文件中的一系列字节。它也可以是文件或其部分的加密哈希。每个 AV 供应商的做法都略有不同。
通常有防病毒软件扫描的“性能与深度”设置。这些扫描本质上是查看在他们断定文件是否安全之前他们将处理多少代码。
应该注意的是,防病毒技术已经得到改进,而且是更新的技术,不仅仅是基于签名的。这些技术的结合以及减少性能影响的优化使 AV 比以前快得多。
保证,如果您对主要操作系统驱动器运行 AV 进行最详细的检查,您会发现处理文件时性能受到影响。它通常不是 CPU 性能的损失,而是磁盘驱动器性能的损失(显然 SSD 在这里有优势)。
AV 使用的一些节省时间的技术
此外,常见的 AV 解决方案用于静态检测的其他技术:
希望有帮助!
进一步阅读: 维基百科