Java中的程序化方法进行文件比较

前端之家收集整理的这篇文章主要介绍了Java中的程序化方法进行文件比较前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
将两个十六进制文件签名相互比较的最佳方法是相似之处.

更具体地说,我想做的是使用.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算法
>史密斯沃特曼算法
> Boyer摩尔算法
> Aho Corasick算法

但现在我不知道使用哪一种,他们似乎都用不同的方式做同样的事情.我会继续做研究,以便我能更好地了解每一个;但同时你可以给我你的意见,这可能更适合,以便我可以优先考虑我的研究和深入学习.

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

GitHub上有一份完成的纸的副本

解决方法

对于像这样的算法,我建议您研究生物信息学领域.有一个类似的问题设置在那里,你有大文件(基因组序列),您正在寻找某些签名(基因,特别熟知的短基因序列等).

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

从这个方向出发的一个例子是适应像Aho Corasick算法这样的东西,以便同时搜索多个恶意软件签名.

类似地,类似于Boyer Moore算法的算法为您提供梦幻般的搜索运行时,特别是对于较长的序列(大小为N的文本的平均大小为N(N / M)),您可以在其中查找大小为M的模式,即子线性搜索时间).

猜你在找的Java相关文章