随着新病毒变种的发布,搜索字符串形式的数据继续增长,这引发了我的问题 - AV 引擎如何如此有效地搜索文件以查找已知签名?如果我下载了一个新文件,我的 AV 扫描仪会根据其签名迅速识别该文件是否为威胁,但它怎么能如此迅速地做到这一点呢?我敢肯定,到目前为止,已有数十万个签名。
3 回答
更新:正如triplee 所指出的,Aho-Corasick 算法似乎与病毒扫描程序非常相关。这里有一些东西要读:
http://www.dais.unive.it/~calpar/AA07-08/aho-corasick.pdf
http://jason.spashett.com/av/index.htm
以下是我的旧答案。它仍然适用于轻松检测像蠕虫这样简单地复制自身的恶意软件:
我将写一些关于 AV可能如何工作的想法。我不确定。如果有人认为信息不正确,请通知我。
AV 检测潜在威胁的方法有很多种。一种方法是基于签名的检测。
签名只是文件的唯一指纹(只是一个字节序列)。在计算机科学方面,它可以称为哈希。单个散列可能需要大约 4/8/16 个字节。假设大小为 4 字节(例如CRC32),大约6700 万个签名可以存储在256MB中。
所有这些哈希值都可以存储在签名数据库中。这个数据库可以用一个平衡的树结构来实现,这样插入、删除和搜索操作可以及时完成,即使对于较大的值(n是条目的数量)O(logn)
也非常快。n
否则,如果有大量内存可用,可以使用哈希表O(1)
,它提供插入、删除和搜索。n
随着规模越来越大并且使用了良好的散列技术,这可能会更快。
因此,防病毒软件的大致工作是计算文件的哈希值或仅计算其关键部分(可能存在恶意注入),并在其签名数据库中搜索它。如上所述,搜索速度非常快,可以在短时间内扫描大量文件。如果找到,则该文件被归类为恶意文件。
同样,数据库可以快速更新,因为插入和删除也很快。
您可以阅读这些页面以获得更多见解。
https://security.stackexchange.com/questions/379/what-are-rainbow-tables-and-how-are-they-used
许多签名都锚定到特定的偏移量,或文件二进制结构中的特定部分。您可以跳过包含显示字符串的数据部分、内部结构的初始化数据等的二进制部分。
许多当今的蠕虫是独立文件,完整文件签名(SHA1 哈希或类似的)就足够了。
如何扫描文件中的大量模式的一般问题最好用指向Aho-Corasick 算法的指针来回答。
我不知道实用的 AV 是如何工作的。但我认为这个问题与在给定字典的长文本中查找单词有一些关系。
对于上面的问题,像 TRIE 这样的数据结构会使其非常快。处理包含 K 个单词的 Length=N 文本字典仅需 O(N) 时间。