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