Fuzzy Hashing 算法工具ssdeep 使用

引言

ssdeep 是一个用来计算context triggered piecewise hashes(CTPH) 基于文本的分片哈希算法 ,同样也可以叫做模糊哈希 Fuzzy hashes。CTPH可以匹配同源文档(相似文档),这样的文档可能有一些顺序相同的字节,尽管这些字节可能在一个序列中长度和内容都不尽相同。

你可以在这里下载到这个算法的详细解释: Identifying almost identical files using context triggered piecewise hashing

这个是 ssdeep 的代码和使用指南链接: ssdeep code

注意,在安装的时候,如果你使用的是默认的安装路径/usr/local/bin.这个时候你必须要获得root权限, 可以使用sudo 来完成

    $ sudo make install 

基本操作

一般情况下,ssdeep能对每一个文件产生CTPH,模糊哈希。

产生的方法如下:

C:\temp> ssdeep config.h INSTALL doc\README

得到的结果如下:

ssdeep,1.0--blocksize:hash:hash,filename
96:KQhaGCVZGhr83h3bc0ok3892m12wzgnH5w2pw+sxNEI58:FIVkH4x73h39LH+2w+sxaD,"C:\temp\config.h"
96:MD9fHjsEuddrg31904l8bgx5ROg2MQZHZqpAlycowOsexbHDbk:MJwz/l2PqGqqbr2yk6pVgrwPV,"C:\temp\INSTALL"
96:EQOJvOl4ab3hhiNFXc4wwcweomr0cNJDBoqXjmAHKX8dEt001nfEhVIuX0dDcs:3mzpAsZpprbshfu3oujjdENdp21,"C:\temp\doc\README"

注意得到的结果输出是文件的全路径。我们可以使用ssdeep 来得到文件的相对路径,为了得到相对路径我们可以使用参数 -l ,重复上面的例子,我们使用参数-l来得出我们的结果

C:\temp> ssdeep -l config.h INSTALL doc\README
ssdeep,1.0–blocksize:hash:hash,filename
96:KQhaGCVZGhr83h3bc0ok3892m12wzgnH5w2pw+sxNEI58:FIVkH4x73h39LH+2w+sxaD,”config.h”
96:MD9fHjsEuddrg31904l8bgx5ROg2MQZHZqpAlycowOsexbHDbk:MJwz/l2PqGqqbr2yk6pVgrwPV,”INSTALL”
96:EQOJvOl4ab3hhiNFXc4wwcweomr0cNJDBoqXjmAHKX8dEt001nfEhVIuX0dDcs:3mzpAsZpprbshfu3oujjdENdp21,”doc\README”


如果你只想输出文件名我们可以使用参数 -b ,例子如下:

C:\temp> ssdeep -b config.h INSTALL \doc\README
ssdeep,1.0--blocksize:hash:hash,filename
96:KQhaGCVZGhr83h3bc0ok3892m12wzgnH5w2pw+sxNEI58:FIVkH4x73h39LH+2w+sxaD,"config.h"
96:MD9fHjsEuddrg31904l8bgx5ROg2MQZHZqpAlycowOsexbHDbk:MJwz/l2PqGqqbr2yk6pVgrwPV,"INSTALL"
96:EQOJvOl4ab3hhiNFXc4wwcweomr0cNJDBoqXjmAHKX8dEt001nfEhVIuX0dDcs:3mzpAsZpprbshfu3oujjdENdp21,"README"

错误信息

如果我们没有指定特定的文件,这个时候一个错误信息提示就会出现

C:\temp> ssdeep
ssdeep: No input files

ssdeep 不支持管道操作。如果一个输入文件没有找到,ssdeep将会提示出一个错误的信息,如果想要忽略这个错误的信息,我们可以使用-s这个操作

C:\temp> ssdeep doesnotexist.txt
ssdeep: C:\temp\doesnotexist.txt: No such file or directory
C:\temp> ssdeep -s doesnotexist.txt
C:\temp>


迭代模式(Recursive Mode)

一般情况下如果我们尝试处理一个目录的话那么将会产生一个错误的信息,在迭代模式下,ssdeep 将会哈希该目录下的所有文件,以及这个目录文件下的子目录的所有文件, 迭代模式可以使用 -r参数

C:\temp> ssdeep *
ssdeep: C:\temp\backups Is a directory
ssdeep,1.0--blocksize:hash:hash,filename
96:KQhaGCVZGhr83h3bc0ok3892m12wzgnH5w2pw+sxNEI58:FIVkH4x73h39LH+2w+sxaD,"config.h"
ssdeep: C:\temp\www Is a directory

C:\temp> ssdeep -r *
ssdeep,1.0--blocksize:hash:hash,filename
768:McAQ8tPlH25e85Q2OiYpD08NvHmjJ97UfPMO47sekO:uN9M553OiiN/OJ9MM+e3,"C:\temp\backups\mystuff.zip"
384:bcEKuglk+GUYIk90a1lEF+Wfsy2solvW8mK1enQXP79:bmlFGUNk9L1roy4K1enQ,"C:\temp\backups\ssdeep.exe"
96:CFzROqsgconvv7uUo6jTcEGEvpVCN116S:CNVnqj8cMVCv16,"C:\temp\backups\foo.doc"
96:KQhaGCVZGhr83h3bc0ok3892m12wzgnH5w2pw+sxNEI58:FIVkH4x73h39LH+2w+sxaD,"config.h"
96:aN0jOc0WlWW+LWQnjv7ufGcE5ESr5YaZ6uicEDEO9VCN116Sb5EutkB:aSeoF+L/zqfGtfr5YiWcsVCv16W5htk,"C:temp\www\index.html"

匹配模式

在ssdeep 中最强大的功能就是匹配输入文件的哈希和一系列已知的hash值做比较,由于模糊哈希的不严格性,注意这里指的是ssdeep能够指示两个文件是匹配,但是这不以为着这些文件是相关的。你应该独立的检测每一对文件的相似性,看他们是怎么相关的。

我们创建一个文件叫做foo.txt 这个时候我们复制foo.txt 到文件bar.txt中

$ ls -l foo.txt
-rw-r--r--   1 jessekor  jessekor  240 Oct 25 08:01 foo.txt

$ cp foo.txt bar.txt
$ echo 1 >> bar.txt

这个时候我们用传统的加密hash算法MD5他并不能匹配这两个hash, 因为只要一个字节的轻微变动都会使得他们的hash产生巨大的变化。

$ md5deep foo.txt bar.txt
7b3e9e08ecc391f2da684dd784c5af7c /Users/jessekornblum/foo.txt
32436c952f0f4c53bea1dc955a081de4 /Users/jessekornblum/bar.txt

但是对于这种情况,fuzzy hashing却可以做到,我们首先计算foo.txt的hash值,然后把它保存到hashes.txt这个文件中,这个时候我们比较foo.txt文件的hash值,和bar.txt的hash值看它们之间的相似程度

在这里我们使用参数-m ,-m 需要后面接两个参数,一个是一个已知的文件的hash值,另一个是输入的文件(需要比较的文件)

$ ssdeep -b foo.txt > hashes.txt
$ ssdeep -bm hashes.txt bar.txt
bar.txt matches foo.txt (64)

在括号里面的值是相似度得分,这个分数越高就说明这两个文件越相似

源代码复用检测

ssdeep 最实用的功能就是匹配功能,你可以使用ssdeep 的匹配模式来找出源码的复用。假设有两个文件夹,在这些文件夹中包含了一堆代码,我们可以先计算出一个文件夹下的树结构上的所有文件的hash值在和另外的一个文件夹下的所有文件进行一一比对,找出相似代码。

假设一个文件夹叫做md5deep-1.12 和一个文件夹叫做ssdeep-1.1,我们比较这两个文件夹下的代码复用情况

C:\> ssdeep -lr md5deep-1.12 > md5deep-hashes.txt

C:\>ssdeep -lrm md5deep-hashes.txt ssdeep-1.1
ssdeep-1.1\cycles.c matches md5deep-1.12\cycles.c (94)
ssdeep-1.1\dig.c matches md5deep-1.12\dig.c (35)
ssdeep-1.1\helpers.c matches md5deep-1.12\helpers.c (57)




这里写图片描述

fuzzy clustering算法是一种聚类算法,与传统的硬聚类算法不同,它可以将各个对象在不同聚类中的隶属度以模糊的方式进行度量。 在传统的硬聚类算法中,每个对象只能属于一个聚类,而在fuzzy clustering算法中,每个对象可以部分地属于不同的聚类。这是通过给每个对象分配一个隶属度值来表示的,该隶属度值介于0和1之间。隶属度值越接近1,表示对象属于该聚类的隶属度越高;反之,越接近0表示隶属度越低。 fuzzy clustering算法的核心是计算每个对象到各个聚类中心的距离,并根据这些距离值来确定每个对象的隶属度。其中一个常用的计算距离的方法是欧氏距离。在计算过程中,除了需要计算当前对象与各个聚类中心的距离外,还需要考虑其他对象的隶属度对最终结果的影响。 fuzzy clustering算法的优点是它能够更好地处理数据的模糊性和不确定性。它适用于那些不太适合硬聚类的情况,如数据存在交叉类别、噪声干扰较大、数据分布不均匀等情况下的聚类分析。此外,fuzzy clustering算法还能为聚类结果提供更丰富的信息,同时将数据按照隶属度进行分类,实现了更多细粒度的划分。 然而,fuzzy clustering算法也存在一些挑战和限制。首先,计算复杂度较高,随着数据量的增加,算法的运行时间也会大幅增加。其次,隶属度的确定需要一定的经验,对初始值的选取和迭代次数的设定有一定要求。此外,fuzzy clustering算法对于数据的选择性和不稳定性较为敏感,不同的数据集可能会导致不同的聚类结果。 总的来说,fuzzy clustering算法在一些特定的数据分析问题中具有一定的优势,但在应用中需要综合考虑其特点和限制,选择合适的算法和参数来得到有效的聚类结果。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值