一尘不染

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

java

比较两个十六进制文件签名彼此之间的相似性的最佳方法是什么。

更具体地说,我想做的是获取.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算法

但是现在我不知道该使用哪个,它们似乎都以不同的方式来做同一件事。我将继续进行研究,以便可以更好地理解每一个。但与此同时,您能否提出我的意见,which might be more suitable以便在研究过程中优先考虑并进行更深入的研究。


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

GitHub上有完成论文的副本


阅读 146

收藏
2020-12-03

共1个答案

一尘不染

对于此类算法,建议您研究生物信息学领域。这里有一个类似的问题设置,因为您有大文件(基因组序列),在其中要寻找某些签名(基因,特殊的众所周知的短碱基序列等)。

同样,考虑到多态恶意软件,该领域应为您提供很多服务,因为在生物学上,获得精确匹配似乎同样困难。(不幸的是,我不知道有合适的近似搜索/匹配算法可以指向您。)

这个方向的一个例子是改编Aho
Corasick
算法之类的东西,以便同时搜索多个恶意软件签名。

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

2020-12-03