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

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

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

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

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

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


定义 :多态恶意软件(病毒,蠕虫,……)与“原始”版本保持相同的function和有效负载,同时具有明显不同的结构(变体)。 他们通过代码混淆实现了这一点,从而改变了他们的hex签名。 用于多态的一些技术是; 格式更改(插入删除空格),变量重命名,语句重新排列,垃圾代码添加,语句替换(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上有一份完成的纸张

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

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

从这个方向来看,一个例子就是调整类似Aho Corasick算法的东西,以便同时搜索多个恶意软件签名。

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

已经发表了许多论文,在网络搜索的背景下,在大量文档中发现近似重复的文档。 我想你会发现它们很有用。 例如,请参阅此演示文稿 。

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

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

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

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