Java中用于文件比较的编程方法

10

如何比较两个十六进制文件签名的相似性?

更具体地说,我想要做的是将 .exe 文件的十六进制表示与一系列病毒签名进行比较。对于这种方法,我计划将文件(.exe)十六进制表示法分成 N 个字符的单独组(例如,10 个十六进制字符),并对病毒签名执行相同操作。我希望通过启发式方法进行一些统计检查,因此可以确定该 exe 文件与已知病毒签名相似度达到 X%。

我想到的最简单但可能非常错误的方法是,将 exe [n,n-1] 与病毒 [n,n-1] 进行比较,其中数组中的每个元素都是一个子数组,因此可以将 exe1 [0,9] 与 virus1 [0,9] 进行比较。每个子集将被以统计方式评分。

正如您所了解的,将会有大量的比较,因此速度非常慢。因此,我想询问您是否能够考虑使用不同的数据结构一起实现这种比较的更好方法。

这是我为我的 BSc 项目做的一个算法,旨在检测多态恶意软件,这只是整个系统的一部分,而另一部分则基于遗传算法来进化静态病毒签名。如果您具有任何建议、评论或一般信息(例如资源),请随时提供。


定义:多态恶意软件(病毒,蠕虫等)保持与其“原始”版本相同的功能和载荷,同时具有明显不同的结构(变体)。它们通过代码混淆实现并改变其十六进制签名。用于多态性的某些技术包括格式更改(插入删除空格)、变量重命名、语句重新排列、添加无用代码、语句替换(x=1 变为 x=y/5,其中 y=5)、控制语句交换。因此,就像流感病毒会发生突变,因此疫苗不起作用一样,多态恶意软件也会发生变异以避免被检测。


更新: 根据您们给我的建议,我进行了一些阅读,但它让我更加困惑了。我找到了几种可应用于我的问题的距离算法,例如:

  • 最长公共子序列
  • Levenshtein算法
  • Needleman-Wunsch算法
  • Smith-Waterman算法
  • Boyer-Moore算法
  • Aho Corasick算法

但现在我不知道该使用哪一个,它们似乎以不同的方式完成相同的任务。我将继续研究,以便更好地理解每个算法;但同时,您能否给出您的意见,哪一个可能更适合,以便我在研究和深入学习时优先考虑它。


更新2:最终我使用了LCSubsequence、LCSubstring和Levenshtein Distance的综合。感谢大家的建议。

GitHub上有一份完整的论文副本。


1
一定要了解“最长公共子串”和“最长公共子序列”。 - Pace
@Pace;干杯,伙计,我会这样做的。 - Carlos
@Pace;老兄,你说得一点也没错!我也在找类似的东西,只是不知道该怎么搜索。谢谢!!! - Carlos
伙计们,我已经包含了一个更新。提前感谢你们所有的帮助。 - Carlos
4个回答

4
对于这样的算法,我建议您研究生物信息学领域。在那里有一个类似的问题设置,即您拥有大型文件(基因组序列),您正在寻找某些标记(基因,特殊的已知短基序列等)。
此外,对于考虑多态恶意软件,这个领域应该为您提供很多帮助,因为在生物学中似乎同样难以获得精确匹配。(不幸的是,我不知道适当的近似搜索/匹配算法,无法指导您。)
从这个方向的一个例子是,调整类似Aho Corasick算法,以便同时搜索几个恶意软件标记。
同样,像Boyer Moore算法这样的算法,尤其是对于较长的序列,可以给您带来极好的搜索运行时间(在大小为N的文本中搜索大小为M的模式的平均情况下为O(N / M),即次线性搜索时间)。

2
在网络搜索的背景下,已经发表了许多关于在大量文档语料库中查找近似重复文档的论文。我认为您会发现它们很有用。例如,请参见此演示文稿

1

最近,对于在错误存储库中自动检测重复错误报告的研究已经相当严肃。这本质上是您所面临的同样问题。不同之处在于您使用的是二进制数据。它们是类似的问题,因为您将寻找具有相同基本模式的字符串,即使这些模式可能存在一些细微的差异。一个简单的距离算法可能无法很好地为您服务。

本文概述了该问题以及其中一些已尝试的方法的引用,并给出了良好的总结。

ftp://ftp.computer.org/press/outgoing/proceedings/Patrick/apsec10/data/4266a366.pdf


1
正如某人指出的那样,与已知字符串和生物信息学问题的相似性可能会有所帮助。最长公共子串非常脆弱,意味着一个差异就可能将该字符串长度减半。你需要一种形式的字符串对齐,但比Smith-Waterman更高效的算法。我建议你看看诸如BLAST、BLAT或MUMMER3等程序,看看它们是否符合你的需求。请记住,这些程序的默认参数是基于生物应用(例如要惩罚插入或替换)的,因此你应该根据你的应用领域重新估计参数,可能基于一个训练集。这是一个已知的问题,因为即使在生物学中,不同的应用也需要不同的参数(例如基于比较两个基因组的进化距离)。然而,甚至在默认情况下,其中一个算法可能也会产生可用的结果。最好的方式是拥有一个病毒变化的生成模型,这可以指导你选择最优的距离和比较算法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接