比较两个十六进制文件签名彼此之间的相似性的最佳方法是什么。
更具体地说,我想做的是获取.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),控制语句交换。就像流感病毒会变异一样,因此疫苗接种是无效的,多态恶意软件也会变异以避免检测。
更新: 在给您建议之后,你们就给我做了什么阅读;我这样做了,但是这让我有些困惑。我发现了几种适用于我的问题的距离算法,例如;
但是现在我不知道该使用哪个,它们似乎都以不同的方式来做同一件事。我将继续进行研究,以便可以更好地理解每一个。但与此同时,您能否提出我的意见,which might be more suitable
以便在研究过程中优先考虑并进行更深入的研究。
更新2: 我最终合并使用LCSubsequence,LCSubstring和Levenshtein Distance。谢谢大家的建议。
GitHub上有完成论文的副本
对于此类算法,建议您研究生物信息学领域。这里有一个类似的问题设置,因为您有大文件(基因组序列),在其中要寻找某些签名(基因,特殊的众所周知的短碱基序列等)。
同样,考虑到多态恶意软件,该领域应为您提供很多服务,因为在生物学上,获得精确匹配似乎同样困难。(不幸的是,我不知道有合适的近似搜索/匹配算法可以指向您。)
这个方向的一个例子是改编Aho
Corasick
算法之类的东西,以便同时搜索多个恶意软件签名。
类似地,像Boyer
Moore算法之类的算法为您提供了绝佳的搜索运行时间,尤其是对于较长的序列(对于大小为N的文本,您在其中寻找大小为M的模式即次线性搜索时间的O(N
/ M)的平均情况)。
问题内容: 您如何建议完成此任务? 我所面临的挑战是智能呈现差异信息。在我重新发明轮子之前,是否有一种公认的方法来处理这种比较? 问题答案: 您可以尝试XStream的体系结构,处理JSON映射 另外,请看一下这篇文章:比较两个XML文件并在C#中使用XMLDiff生成第三个文件。它在C#中,但是逻辑是相同的。
问题内容: 我正在为生成Excel文件(二进制文件)的某些代码编写JUnit测试。我还有另一个包含预期输出的Excel文件。将实际文件与预期文件进行比较的最简单方法是什么? 当然,我可以自己编写代码,但是我想知道在受信任的第三方库(例如Spring或Apache Commons)中是否已有这样做的方法。 问题答案: 这就是我最终要做的(由DBUnit完成繁重的工作): 这将比较两个文件中的数据,没
问题内容: 我遇到了一个需要将字符串转换为EBCDIC编码然后对其进行排序的要求。我们需要使用EBCDIC对其进行排序,因为字符串必须放在大型机中。我将排序的字符串只有大写字母和整数。 我用谷歌搜索了一下,然后发现了来自IBM的链接,该 链接按顺序列出了字符 我意识到,EBCDIC排序与常规java字典排序完全相反(至少对于我要处理的数据类型而言)。 我的问题是我的认识对吗?如果不是我想念的东西?
本文向大家介绍基于java中cookie和session的比较,包括了基于java中cookie和session的比较的使用技巧和注意事项,需要的朋友参考一下 cookie和session的比较 一、对于cookie: ①cookie是创建于服务器端 ②cookie保存在浏览器端 ③cookie的生命周期可以通过cookie.setMaxAge(2000);来设置,如果没有设置setMaxAge,
谁能解释一下为什么下面的代码不起作用: 但这一个有效: 换句话说,与创建普通类实例相比,接口实现何时是可互换的?当我使用compareTo()方法时会出现错误,该方法是Comparable接口的一部分,由所有包装类(如整数)实现。 所以我猜