更具体地说,我想做的是使用.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的模式,即子线性搜索时间).