比较两个十六进制文件签名的相似性的最佳方法是什么。
更具体地说,我想做的是采用 .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)、交换控制语句。就像流感病毒发生变异并因此疫苗接种无效一样,多态恶意软件也会发生变异以避免被发现。
更新:在你们给我关于阅读内容的建议之后;我这样做了,但这让我更加困惑。我发现了几种适用于我的问题的距离算法,例如;
- 最长公共子序列
- 文斯坦算法
- Needleman-Wunsch 算法
- 史密斯-沃特曼算法
- 博耶摩尔算法
- Aho Corasick 算法
但现在我不知道该使用哪个,他们似乎都以不同的方式做同样的事情。我会继续做研究,以便更好地理解每一个;但与此同时,您能否给我您的意见,which might be more suitable
以便我在研究期间优先考虑它并深入研究它。
更新 2:我最终使用了 LCSubsequence、LCSubstring 和 Levenshtein Distance 的合并。谢谢大家的建议。
GitHub上有一份完成的论文