模糊哈希算法工具ssdeep的使用

转自:http://blog.csdn.net/chichoxian/article/details/54849406

引言

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)
    原文作者:哈希算法
    原文地址: https://blog.csdn.net/weixin_40596016/article/details/79296543
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞