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

时间:2010-11-01 10:49:25

标签: java algorithm data-structures distance file-comparison

将两个十六进制文件签名相互比较以获得相似性的最佳方法是什么。

更具体地说,我想要做的是采用.exe文件的十六进制表示形式,并将其与一系列病毒签名进行比较。对于这种方法,我计划将文件(exe)十六进制表示分成N个字符的单独组(即10个十六进制字符),并对病毒签名执行相同操作。我的目标是执行某种启发式方法,因此统计检查此exe文件是否与已知病毒签名具有X%的相似性。

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

你可以意识到会有大量的比较,因此非常慢。所以我想问一下你们是否可以想出一个更好的方法来进行这样的比较,例如一起实现不同的数据结构。

这是针对我正在为我的BSc做的项目,我正在尝试开发一种算法来检测多态恶意软件,这只是整个系统的一部分,另一个是基于遗传算法来演化静态病毒签名。任何建议,意见或资源等一般信息都是非常受欢迎的。


定义:多态恶意软件(病毒,蠕虫,......)与“原始”版本保持相同的功能和有效负载,同时具有明显不同的结构(变体)。他们通过代码混淆实现了这一点,从而改变了他们的十六进制签名。用于多态的一些技术是;格式更改(插入删除空格),变量重命名,语句重新排列,垃圾代码添加,语句替换(x = 1更改为x = y / 5,其中y = 5),交换控制语句。非常像流感病毒变异,因此疫苗接种无效,多态恶意软件会发生变异以避免检测。


更新:建议之后,你们给了我关于阅读的内容;我做到了,但它让我更加困惑。我找到了几种可以应用于我的问题的距离算法,例如;

  • 最常见的子序列
  • Levenshtein算法
  • Needleman-Wunsch算法
  • Smith-Waterman算法
  • Boyer Moore算法
  • Aho Corasick算法

但是现在我不知道使用哪个,他们似乎都以不同的方式做同样的事情。我将继续做研究,以便我能更好地理解每一个;但同时你可以在which might be more suitable给我你的意见,这样我就可以在研究过程中优先考虑并深入研究。


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

GitHub

上有成品纸的副本

4 个答案:

答案 0 :(得分:4)

对于这些算法,我建议你研究一下生物信息学领域。在那里设置类似的问题是你有大文件(基因组序列),你正在寻找某些特征(基因,特殊的众所周知的短碱基序列等)。

同样考虑到多态恶意软件,这个部门应该为你提供很多东西,因为在生物学中似乎很难获得完全匹配。 (不幸的是,我不知道适当的近似搜索/匹配算法指向您。)

此方向的一个示例是调整类似Aho Corasick算法的内容,以便同时搜索多个恶意软件签名。

类似地,像Boyer Moore算法这样的算法可以为您提供出色的搜索运行时间,特别是对于较长的序列(对于大小为N的文本,在其中寻找大小为M的模式的O(N / M)的平均情况,即次线性搜索时间。)

答案 1 :(得分:2)

在网络搜索的背景下,已发表了许多关于在大型文档库中查找重复文档的论文。我想你会觉得它们很有用。例如,请参阅 这presentation

答案 2 :(得分:1)

最近对自动检测bug存储库中的重复错误报告进行了大量研究。这与您面临的问题基本相同。不同之处在于您使用的是二进制数据。它们是类似的问题,因为你将寻找具有相同基本模式的字符串,即使模式可能有一些细微的差别。直线距离算法可能不适合你。

本文对问题进行了总结,并对其引用的一些方法进行了尝试。

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

答案 3 :(得分:1)

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