java - 使用 Java 扫描病毒签名

标签 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++;
    }
}

感谢帮助

最佳答案

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

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

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

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

(我看不出散列实际上如何帮助您解决这个问题...)


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

关于java - 使用 Java 扫描病毒签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22767742/

相关文章:

java - 在 Firebase 中使用电话号码注册并登录

java - 如何在打印函数中调用类?

algorithm - 搜索满足特定条件的所有区间

Python:字面意思是 "printing"一个函数

Java - 读取字符串和 int : java. util.NoSuchElementException

java - 哪个版本的 Eclipse 与 App Engine Java 一起使用?

php - 优先随机选择

algorithm - 从 F# 中的 n 元树中提取叶路径

c# - 创建后写入文件时文件正在使用中

android - Android 上未创建 USB 摄像头节点