如何基于ssdeep进行集群?

hfwmuf9z  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(310)

嗨,我正试图找到组的文件基于ssdeep。
我已经生成了文件的ssdeep并保存在csv文件中。
我正在用perl脚本解析文件,如下所示:

foreach( @all_lines )
{
    chomp;
    my $line = $_;

    my @split_array = split(/,/, $line);
    my $md5 = $split_array[1];
    my $ssdeep = $split_array[4];

    my $blk_size = (split(/:/, $ssdeep))[0];

    if( $blk_size ne "")
    {
        my $cluster_id = check_In_Cluster($ssdeep);

        print WFp "$cluster_id,$md5,$ssdeep\n"; 
    }
}

这还检查ssdeep是否存在于以前的集群组中,如果不存在,则创建新的组。
集群中chec\u的代码

my $ssdeep = shift;
my $cmp_result;

if( $cluster_cnt > 0 ) {
    $cmp_result = ssdeep_compare( $MRU_ssdeep, $ssdeep );
    if( $cmp_result > 85 ) {
        return $MRU_cnt;
    }
}

my $d = int($cluster_cnt/4);
my $thr1 = threads->create(\&check, 0, $d, $ssdeep);
my $thr2 = threads->create(\&check, $d, 2*$d, $ssdeep);
my $thr3 = threads->create(\&check, 2*$d, 3*$d, $ssdeep);
my $thr4 = threads->create(\&check, 3*$d, $cluster_cnt, $ssdeep);

my ($ret1, $ret2, $ret3, $ret4);
$ret1 = $thr1->join();
$ret2 = $thr2->join();
$ret3 = $thr3->join();
$ret4 = $thr4->join();
if($ret1 != -1) {
    $MRU_ssdeep = $ssdeep;
    $MRU_cnt = $ret1;
    return $MRU_cnt;    
} elsif($ret2 != -1) {
    $MRU_ssdeep = $ssdeep;
    $MRU_cnt = $ret2;
    return $MRU_cnt;    
} elsif($ret3 != -1) {
    $MRU_ssdeep = $ssdeep;
    $MRU_cnt = $ret3;
    return $MRU_cnt;    
} elsif($ret4 != -1) {
    $MRU_ssdeep = $ssdeep;
    $MRU_cnt = $ret4;
    return $MRU_cnt;    
} else {
    $cluster_base[$cluster_cnt] = $ssdeep;
    $MRU_ssdeep = $ssdeep;
    $MRU_cnt = $cluster_cnt;
    $cluster_cnt++;
    return $MRU_cnt;    
}

以及chech的代码:

sub check($$$) {
    my $from = shift;
    my $to = shift;
    my $ssdeep = shift;

    for( my $icnt = $from; $icnt < $to; $icnt++ ) {
        my $cmp_result = ssdeep_compare( $cluster_base[$icnt], $ssdeep );
        if( $cmp_result > 85 ) {
            return $icnt;
        }
    }
return -1;
}

但是这个过程需要很多时间(对于20-30mb的csv文件需要8-9个小时)。我也尝试过在签入集群时使用多线程,但没有得到太多帮助。
因为他们不需要像text::csv这样的csv解析器(因为csv上的操作较少),所以我没有使用它。
有人能帮我解决问题吗?是否可以使用hadoop或其他一些框架来基于ssdeep进行分组?

rkue9o1l

rkue9o1l1#

从优化ssdeep到大规模使用(2015-11-27)有一个提示。
根据您的目的,不同块大小的loop和match ssdeep将创建nx(n-1)散列比较。除非需要查找部分内容,否则请避免。
可以按照本文的建议在步骤1中分解散列索引。对于不同块大小的部分内容匹配,这是一种更好的方法。
通过生成“距离表亲”散列来分组相似的散列,可以减少ssdeep散列。

相关问题