我需要在文件中搜索病毒签名,我正在使用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++;
}
}
感谢您的帮助
答案 0 :(得分:1)
有几种算法可以帮助您。我建议Aho-Corasick或Rabin-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搜索。这不会像商业/专业病毒扫描程序那么快,但它应该足以满足您的目的。