使用Java扫描病毒签名

时间:2014-03-31 17:02:29

标签: java algorithm file search byte

我需要在文件中搜索病毒签名,我正在使用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++;
    }
}

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

有几种算法可以帮助您。我建议Aho-CorasickRabin-Karp,但suffix tree也可以派上用场。 Rabin-Karp是最容易实现的,但是Aho-Corasick不使用哈希,所以你不需要特别小心碰撞。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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

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

(我看不出哈希会如何帮助你解决这个问题...)


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