如何比较两个十六进制文件签名的相似性?
更具体地说,我想要做的是将 .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算法
但现在我不知道该使用哪一个,它们似乎以不同的方式完成相同的任务。我将继续研究,以便更好地理解每个算法;但同时,您能否给出您的意见,哪一个可能更适合
,以便我在研究和深入学习时优先考虑它。
更新2:最终我使用了LCSubsequence、LCSubstring和Levenshtein Distance的综合。感谢大家的建议。
在GitHub上有一份完整的论文副本。