【摘要】一个文件也许有意或无意地产生变化。例如,有意的情况有作者改动文本内容、恶意代码自
动变化;无意的情况有传输出错、磁盘存储出错等。如何有效判断两个文件是否相似,从而是同源的?这
个问题在很多领域都有遇到。
Kornblum 提出了模糊哈希算法。模糊哈希的主要原理是,使用一个弱哈希计算文件局部内容,在特
定条件下对文件进行分片,然后使用一个强哈希对文件每片计算哈希值,取这些值的一部分并连接起来,
与分片条件一起构成一个模糊哈希结果。使用一个字符串相似性对比算法判断两个模糊哈希值的相似度有
多少,从而判断两个文件的相似程度。
随着计算机网络技术的发展,恶意代码的问题也越来越严峻,对于现有的恶意代码产生的变体(包
括在多处修改、增加、删除部分内容),使用模糊哈希均能发现与源文件的相似关系,是目前判断相似性,
检测恶意代码较好的一种方法。
【关键字】模糊哈希 恶意代码检测 ssdeep
目 录
第一章 绪论................................................................................................................. 1
1.1 项目介绍........................................................................................................ 1
1.1.1 项目背景............................................................................................. 1
1.1.2 基本概念............................................................................................. 1
1.1.3 技术算法............................................................................................. 1
1.2 项目应用........................................................................................................ 2
1.3 全文组织结构................................................................................................ 2
1.4 本章小结........................................................................................................ 3
第二章 研究目标及内容............................................................................................. 4
2.1 研究目标......................................................................................................... 4
2.2 研究内容......................................................................................................... 4
第三章 需求及设计思路............................................................................................. 5
3.1 需求分析......................................................................................................... 5
3.1.1 编写目的............................................................................................. 5
3.1.2 开发意图............................................................................................. 5
3.1.3 功能说明............................................................................................. 5
3.1.4 性能要求............................................................................................. 5
3.1.5 运行环境............................................................................................. 6
3.2 设计思路......................................................................................................... 6
3.2.1 开发环境............................................................................................. 6
3.2.2 主要功能............................................................................................. 6
3.2.3 基本结构............................................................................................. 6
3.2.4 实现思路............................................................................................. 6
第四章 设计与实现..................................................................................................... 9
4.1 引言................................................................................................................. 9
4.1.1 编写目的............................................................................................. 9
4.1.2 背景..................................................................................................... 9
4.2 系统设计......................................................................................................... 9
4.2.1 总体设计............................................................................................. 9
4.2.2 运行设计........................................................................................... 10
4.2.3 模块实现........................................................................................... 10
第五章 核心功能展示............................................................................................... 13
5.1 运行测试....................................................................................................... 13
5.2 系统改进和提高........................................................................................... 14
个人总结 ....................................................................................错误!未定义书签。
附件 ............................................................................................................................16
第一章 绪论
1.1 项目介绍
1.1.1 项目背景
能够高效、高质地检测出恶意代码,一直是信息安全领域的一个核心问题。
近年来,每天新出现的恶意代码样本已经数以万计,而频繁检测统计上传这些样
本会占用网络带宽,影响用户对网络的正常使用。为了避免上述问题出现了只上
传其哈希值的手段。用服务器将上传的哈希值与特征库中的哈希值进行对比,如
果特征库中存在完全一样的哈希值,则认为该对象是恶意代码。但是这类哈希算
法对任何细微的变化计算得到的哈希值将完全不同并且找不出任何规律。然而,
恶意代码本身是可能发生变化的,如何有效判断恶意代码是否相似,显然,采用
传统哈希算法对这类恶意代码无能为力,因此出现了“分片哈希”算法。
其策略非常简单,即每隔一个固定间隔就将文件分片,对每片计算一个哈希
值,将这些哈希值一起作相似比较。而局部的修改只会影响少量分片的哈希结果,
因此从整个文件看还是能有较高的相似性。然而这种方法依然面临一个问题,即
在一个文件中插入或删除一个字节,就会失效。为了降低这种局部变化带来的全
局影响,有人提出了模糊哈希算法。对文件的部分变化(包括在多处修改、增加、
删除部分内容),使用模糊哈希均能发现与源文件的相似关系,是目前判断相似
性较好的一种方法。
1.1.2 基本概念
模糊哈希算法又叫基于内容分割的分片哈希算法,主要用于文件的相似性比
较。主要原理是使用一个弱哈希计算文件局部内容,在特定条件下对文件进行分
片,然后使用一个强哈希对文件每片计算哈希值,取这些值的一部分并连接起来,
与分片条件一起构成一个模糊哈希结果。使用一个字符串相似性对比算法判断两
个模糊哈希值的相似度有多少,从而判断两个文件的相似程度。
模糊哈希的算法与模糊逻辑搜索很像,它可以寻找相似但不完全相同的文档,
即所谓的同源性文件。
1.1.3 技术算法
1. 分片
在 ssdeep 中,使用 Alder-32 算法作为弱哈希。它实际是一种用于校验和的
弱哈希,类似于 CRC32,不能用于密码学算法,但计算快速,生成 4 字节哈希值,
并且是滚动哈希。
除了弱哈希算法,还需要一个分片值,例如 n,由它来控制分片条件。
当 Alder-32 哈希值除以 n 的余数恰好等于 n-1 时,就在当前位置分片;否则,
1
不分片,窗口往后滚动一个字节,然后再次计算 Alder-32 哈希值并判断,如此继
续。
2. 每片求哈希
将文件分片完以后,就可以对每片分别计算哈希了。可以使用传统的哈希算
法,例如 MD5。在 ssdeep 中,使用一个名为 Fowler-Noll-Vo hash 的哈希算法。
3. 压缩映射
对每一个文件分片,计算得到一个哈希值以后,可以选择将结果压缩短。例
如,在 ssdeep 中,只取 FNV 哈希结果的最低 6 位,并用一个 ASCII 字符表示出来,
作为这个分片的最终哈希结果。
4. 连接哈希值
将每片压缩后的哈希值连接到一起,就得到这个文件的模糊哈希值了。如果
分片条件参数 n 对不同文件可能不同,还应该将 n 纳入模糊哈希值中。
5. 比较哈希值
由于 ssdeep 对每一片得到的哈希值是一个 ASCII 字符,最终得到的文件模糊
哈希值就是一个字符串了。假设是 s1、s2,将 s1 到 s2 的“加权编辑距离”作为评
价其相似性的依据。
接下来,ssdeep 将这个距离除以 s1 和 s2 的长度和,以将绝对结果变为相对
结果,再映射到 0-100 的一个整数值上,其中,100 表示两个字符串完全一致,
而 0 表示完全不相似。
在实践中,一般将 ssdeep 的结果为 1 或以上认为有相似性,而将结果为 0
认为是不相似。
1.2 项目应用
2006 年,Jesse Kornblum 提出 CTPH,并给出一个名为 spamsum 的算法实例。
随后,Jason Sherman 开发了 ssdeep 工具以实现这一算法。模糊哈希最初应用于
计算机取证,随即,反病毒领域发现了它的妙处,试图将其用于恶意代码的变种
检测,然而直接使用的效果并不佳,应考虑与其他方法配合使用。
然而,在源码相似性比较上,模糊哈希表现出较好的准确性,因此被用于开
源代码漏洞挖掘。在现实中,大量的开源项目使用第三方开源库,而又这些库引
入的漏洞并不同步更新,因此存在潜在的安全威胁。使用模糊哈希来判断开源项
目之间的相互引用关系,并取得了杰出的成绩。
事实上,在过滤相似度很高的新闻、考试防作弊系统以及论文抄袭检查方面,
使用模糊哈希算法可以起到很大的效果。
1.3 全文组织结构
本文是基于模糊哈希的恶意代码检测系统,本章第一章是绪论,简单介绍了
下模糊哈希。
2
第二章是研究目标及内容,明确项目研究的目的。
第三章是需求及设计思路,对项目需求进行简单的设计,提供思路。
第四章是设计与实现,将思路进行设计与实现。
第五章是核心功能展示,将最后的实现部分展示出来。
第六章是总结。
1.4 本章小结
本章是绪论,对模糊哈希算法做了简单的介绍以及使用背景应用方面的涉及。
3
第二章 研究目标及内容
2.1 研究目标
随着计算机的普及,网络世界的迅速发展,信息共享的同时也不可避免地出
现了一些不和谐的地方。网络为人们带来的便捷,人们越来越透明化,互联网的
发展代表着信息越来越值钱。在这种大环境的趋势下,利益驱动着有些人做出违
反规则的事情出来。比如盗窃他人的劳动成果,利用某些技术窃取他人的隐私信
息等。为了预防他人对信息的不正当提取,Jason Sherman 开发了 ssdeep 实现
spamsun 算法。该算法最初用于取证,后来被用于恶意代码检测和开源软件的漏
洞挖掘。
该论文就是研究 ssdeep 算法,并且对其进行改进,提高对比精准度。
2.2 研究内容
这是一个信息量很大的时代,为了减轻计算量,模糊哈希应运而生。模糊哈
希可以用来过滤相似度高的新闻,考试防作弊系统,论文抄袭检查以及对于病毒
的检测。本次论文主要是研究基于模糊哈希的病毒检测,对 SSDEEP 进行改进。
SSDEEP 本身就已经比较快速,因此,主要改进 SSDEEP 的精准度。本论文主要研
究 SSDEEP 算法的步骤、内涵以及精准度,了解这些之后,对 SSDEEP 进行改进以
提高算法精准度,然后,对病毒文件进行检测,根据结果判断该文件是否为病毒
的变种。
4
第三章 需求及设计思路
3.1 需求分析
3.1.1 编写目的
需求分析是基于模糊哈希的恶意代码检测系统前期开发阶段针对用户所进
行的,在这节中我们通过对该系统进行了详细而具体的需求分析,通过这节可以
使读者了解该系统的所有功能。
在进行系统设计前,我们一组的成员通过自己平时实验积累的经验,一起探
讨了该系统要实现的功能,每个组员分工明确。
3.1.2 开发意图
一个文件也许有意或无意地产生变化。例如,有意的情况有作者改动文本内
容、恶意代码自动变化;无意的情况有传输出错、磁盘存储出错等。如何有效判
断两个文件是否相似,从而是同源的?这个问题在很多领域都有遇到。
最朴素的方法是逐个字节对比,并统计相同字节占文件大小的比例。这存在
两个问题:1、对 n 个文件寻找相似关系,每个文件需要读取和对比 n-1 次;2、
如果在一个文件中插入或删除一个字节,这种方法得到的相似结果也许很糟糕。
先说第一个问题。自然的想法是对每个文件生成较短的“指纹”,然后不一一
比较文件本身,而是一一比较指纹。这样来降低比较量,提高效率。显然,传统
的哈希算法正好可以充当这种“指纹”。传统哈希也会面临前面提到的第二个问题。
原文件哪怕仅仅只是一个字节的变化也会导致最后的哈希值发生明显的变化。这
个特性使得哈希算法能够确定一个文件是否被修改过,然而这也带来了很大的局
限性,那就是无法分辨内容稍有不同的同类文件。这对我们的反病毒过程来说是
很不利的,因为一个样本的变种是数量最多的。
因此 Kornblum 提出了模糊哈希算法,其思想是:不再固定长度分片,而使
用文件局部数据的特点来决定是否分片,使得局部的变化:修改、增加、删除等,
只影响局部的分片方法,而不会将影响扩散至其他分片点。
3.1.3 功能说明
在运行界面中选择一个文件,计算文件的模糊哈希值,与恶意代码库里的恶
意代码的文件哈希值进行对比,若相似度很大则说明这代码很有可能是恶意代码
的变种。相似度是一个映射值,100 表示两个字符串完全一致,而 0 表示完全不
相似。
3.1.4 性能要求
精度
5