AV 引擎如何如此高效地搜索已知签名的文件?
Posted
技术标签:
【中文标题】AV 引擎如何如此高效地搜索已知签名的文件?【英文标题】:How do AV engines search files for known signatures so efficiently? 【发布时间】:2013-05-04 18:26:49 【问题描述】:随着新病毒变种的发布,搜索字符串形式的数据继续增长,这引发了我的问题 - AV 引擎如何如此有效地搜索文件以查找已知签名?如果我下载了一个新文件,我的 AV 扫描仪会根据其签名迅速识别该文件是否为威胁,但它怎么能如此迅速地做到这一点呢?我敢肯定,目前已有数十万个签名。
【问题讨论】:
【参考方案1】:更新:正如 tripleee 所指出的,Aho-Corasick algorithm 似乎与病毒扫描程序非常相关。以下是一些值得阅读的内容:
http://www.dais.unive.it/~calpar/AA07-08/aho-corasick.pdf
http://www.researchgate.net/publication/4276168_Generalized_Aho-Corasick_Algorithm_for_Signature_Based_Anti-Virus_Applications/file/d912f50bd440de76b0.pdf
http://jason.spashett.com/av/index.htm
Aho-Corasick-like algorithm for use in anti-malware code
以下是我的旧答案。它仍然适用于轻松检测像蠕虫这样简单地复制自身的恶意软件:
我将写一些关于 AV 如何可能工作的想法。我不确定。如果有人认为信息不正确,请通知我。
反病毒软件可以通过多种方式检测可能的威胁。一种方法是基于签名的 检测。
签名只是文件的唯一指纹(只是一个字节序列)。在计算机科学方面,它可以称为散列。单个散列可能需要大约 4/8/16 个字节。假设大小为 4 字节(例如,CRC32),大约 6700 万 个签名可以存储在 256MB 中。
所有这些哈希值都可以存储在签名数据库中。这个数据库可以用一个平衡树结构来实现,因此插入、删除和搜索操作可以在O(logn)
时间完成,即使n
的值很大(n是条目数)。否则,如果有大量内存可用,则可以使用 hashtable,它提供O(1)
插入、删除和搜索。随着n
越来越大并且使用了良好的散列技术,这可能会更快。
因此,防病毒软件的大致工作是计算文件的哈希值或仅计算其关键部分(可能存在恶意注入),并在其签名数据库中搜索它。如上所述,搜索速度非常快,可以在短时间内扫描大量文件。如果找到,该文件将被归类为恶意文件。
同样,数据库的更新也很快,插入和删除也很快。
您可以阅读这些页面以获得更多信息。
Which is faster, Hash lookup or Binary search?
https://security.stackexchange.com/questions/379/what-are-rainbow-tables-and-how-are-they-used
【讨论】:
有趣的帖子。我最初的想法是 AV 引擎不想在每个文件中检查相同的位置/偏移量以获取签名。换句话说,我认为由于高碰撞发生率,某些偏移量会比其他偏移量更好。【参考方案2】:许多签名都锚定到特定偏移量或文件二进制结构中的特定部分。您可以跳过包含显示字符串的数据部分、内部结构的初始化数据等的二进制文件部分。
当今的许多蠕虫都是独立的文件,它们的完整文件签名(SHA1 哈希或类似的)就足够了。
如何扫描文件中的大量模式的一般问题最好使用指向Aho-Corasick algorithm 的指针来回答。
【讨论】:
【参考方案3】:我不知道实用的 AV 是如何工作的。但我认为这个问题与使用给定字典在长文本中查找单词有一些关系。
对于上面的问题,像TRIE这样的数据结构会使其非常快。处理包含 K 个单词的 Length=N 文本字典仅需 O(N) 时间。
【讨论】:
以上是关于AV 引擎如何如此高效地搜索已知签名的文件?的主要内容,如果未能解决你的问题,请参考以下文章