【问题标题】:Scanning for Virus Signatures Using Java使用 Java 扫描病毒签名
【发布时间】:2014-03-31 17:02:29
【问题描述】:

我需要在文件中搜索病毒签名,我正在使用 java 来执行此操作我已经编写了所有其他功能,例如收集文件并将它们过滤成需要搜索的文件等。我只需要一点帮助病毒签名方面。

使用什么格式(散列字符串、二进制、字节)?

我应该使用什么方法来扫描字符串(搜索算法等)?

我正在考虑将文件转换为字节,然后使用 Boyer-Moore 字符串搜索算法来搜索字节。

我想使用签名文件中的病毒签名并扫描文件以查找它们。

 public void Search(File file) {

    if (file.exists()) {

        if (file.isDirectory()) {
            if (file.canRead()) {

                File[] listOfFiles = file.listFiles();
                if (listOfFiles != null) {
                    for (int i = 0; i < listOfFiles.length; i++) {
                        Search(listOfFiles[i]);
                    }
                }
            } else {
                cannotReadDirCount++;
            }
        } else if (file.isFile()) {

            if (file.canRead()) {

                totalFileCount++;

                for (int a = 0; a < executableCriteriaList.size(); a++) {

                    if (file.getName().endsWith(executableCriteriaList.get(a).toLowerCase()) || file.getName().endsWith(executableCriteriaList.get(a).toUpperCase())) {

                        // scanExecutableFile(file); HERE IS where i need to scan the file
                        searchFiles.add(file);
                    }

                }

            } else {
                cannotReadFileCount++;
            }

        }
    } else {
        cannotReadFileCount++;
    }
}

感谢您的帮助

【问题讨论】:

  • 二进制比较不一定足以扫描病毒,它们通常比这更聪明。我建议调用现有的病毒扫描程序。
  • 这是一个项目,所以我需要以自己的方式实现它如果我必须自己扫描,你会建议什么方法?二进制?然后用字符串算法让它更快?
  • 好吧,如果你能找到一个签名文件,其中包含要比较的二进制字符串,你建议的 Boyer-Moore 似乎是一个很好的方法。
  • 如果不同的格式(例如二进制优于字节或哈希),您是否知道签名的速度或检测是否存在差异?我将其视为某种帮助来决定实施哪个hooked-on-mnemonics.blogspot.co.uk/2011/01/…
  • 使用(映射的)字节缓冲区。并且有多个签名,您可能会选择Wu-Manber

标签: java algorithm file search byte


【解决方案1】:

如果您只扫描一个病毒签名,那么像 Boyer-Moore 这样的单字符串搜索算法将是一个不错的选择。 (还有其他快速单次搜索算法。)

但病毒扫描程序通常会查找许多病毒签名,而这些签名通常不仅仅是简单的字节序列签名。

如果您正在寻找(技术上)最佳算法,那么我建议您阅读String Search Algorithms 上的维基百科页面,并考虑它链接到的所有替代方案。这只是一个开始,因为那里(显然)没有列出其他搜索算法。

关于签名的最佳表示,这将取决于您使用的搜索算法。但由于您要在代码对象中查找字节模式,因此基于字节的表示(字节字符串或基于字节的模式/正则表达式)似乎最合适。

(我不知道哈希实际上如何帮助您解决这个问题......)


但这假设您确实需要可用的最佳搜索技术。听起来这是您正在做的一项任务,因此您最初选择 Boyer-Moore 就可以了。一种简单的方法是将每个文件读入内存,然后对每个病毒签名进行 Boyer-Moore 搜索。这不会像商业/专业病毒扫描程序那样快,但它应该足以满足您的目的。

【讨论】:

  • 是的,谢谢,我想我会实现一个 Boyer-Moore 搜索并为每个不同的签名重复它
  • 一个快速的问题,我不一定要尝试识别代码中的字节模式,它可能是散列字节等,您建议我使用什么?散列签名、二进制签名还是字节签名?
  • 好吧,如果您尝试检测散列字节(无论这意味着什么!),那么您可以将您的签名表示为散列签名。但这种方法对我来说没有意义,所以我真的不能给你建议。
【解决方案2】:

有几种算法可以帮助您。我建议Aho-CorasickRabin-Karp,但suffix tree 也可能会派上用场。 Rabin-Karp 是其中最容易实现的,但 Aho-Corasick 不使用哈希,因此您不需要特别注意冲突。

【讨论】:

  • 谢谢,您能建议任何特定格式的签名文件,如二进制、字节或散列字符串吗?
  • @user3481933 实际上我建议的算法适用于所有这些格式。尽管如此,您比较的字符串越短,算法运行的速度就越快。您还应该考虑签名的类型和您搜索的文件。
  • ahh 我打算使用每个签名在新行上的字节,然后在扫描之前将它们扫描到数组列表中,然后为每个文件遍历它们,是否有最佳格式签名?
  • @user3481933 请注意,Aho-Corasick 和 Rabin-Karp 都会在扫描前将所有签名放在同一个数据结构中,这将替换您提到的 ArrayList。
【解决方案3】:

Boyer–Moore 技术并未用于各种防病毒软件供应商使用的病毒签名。他们大多在整个文件或文件的部分上使用 MD5、SHA1、SHA256 或文本指纹。您会发现最大的数据库主要是 SHA1 整个文件哈希。

Cisco's ClamAV's 来源是publicly available on Github。此外,他们的 CVD 文件 are documented on how to crack them open to look at their various hashes。这是一个 Gzipped TAR 文件 (.tar.gz),其中包含一系列字节作为标头,然后重命名为 .cvd 文件。一些scripts exist 将tar.gz 提取出来。里面是各种格式的character-delimited text files,是病毒定义的“数据库”。文件中的分隔符会发生变化,但通常是冒号。

当您看到它时,您会了解到病毒签名是通过多种方式完成的:

  • MD5 整个文件哈希。这是最初的技术,但最终出现了误报,因为 MD5 只有这么多的地址空间。它仍用于尚未出现误报的旧文件,但已被逐步淘汰。但是,Clam 和大多数其他 AV 应用程序至少在一小部分扫描中使用了它。他们会这样做,直到遇到误报。如果是这样,将其切换到 SHA1。

  • SHA1 整个文件哈希。这是在 MD5 之后出现的,因为它有更多的地址空间。但不幸的是,这也用完了地址空间并最终出现了误报,因此他们转向了 SHA256。但是,这些仍然使用,直到由于误报而被标记为已失效,然后切换到 SHA256。您会发现 ClamAV 的 SHA1 整个文件哈希是记录的最常见的哈希。

  • SHA256 整个文件哈希。这是可用的,但并不总是使用。原因是与 SHA1 哈希相比,它增加了定义文件的大小。因此,目前,病毒定义主要存储在 SHA1 整个文件哈希中,除非由于与另一个文件的误报冲突而需要 SHA256。

  • PE 部分哈希 -- 存储在 MD5、SHA1 和 SHA256 中。一些病毒会发生变异,捕获它们的唯一方法是根据所谓的PE section of an executable file 生成哈希。在可执行文件中有are multiple PE sections。同样,Clam 从 MD5 开始,但随后在误报冲突中引入了 SHA1 和 SHA256。

  • 文件指纹。这些是在链接到恶意活动的文件中检测到的小 UTF8 文本字符串,例如可能不是可执行文件的网页。

  • 其他...文档:https://github.com/vrtadmin/clamav-devel/blob/master/docs/signatures.pdf

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 2010-10-02
    • 1970-01-01
    • 2010-10-28
    • 2010-11-29
    • 2010-10-13
    • 1970-01-01
    • 2014-07-15
    相关资源
    最近更新 更多