2014-02-14 32 views
0

嗨我试图找到基于ssdeep文件的组。如何基于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_In_Cluster

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;  
} 

和再检查一下代码:

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; 
} 

但这个过程需要非常多的时间(因为要用8-9Hours 20-30MB csv文件)。 我也尝试使用多线程,而在群集中检查,但没有太多的帮助,我从这。

由于他们不需要csv解析器,如Text :: CSV(因为对csv的操作较少),我没有使用它。

任何人都可以解决我的问题吗?是否有可能使用hadoop或其他框架进行基于ssdeep的分组?

回答

0

配置您的代码。

确保您没有重新计算刚刚缓存的内容。

您是否考虑过多阶段方法?

  1. 计算所有哈希
  2. 运行在预先计算哈希

档案集群。也许ssdeep只需要8小时的数据集。

+0

我有一个生成ssdeep文件的脚本。我在另一个只比较结果的脚本中聚集(如上所示)。我的问题是在第二阶段,我把它们聚集在一起。 –

+0

简介。探查器在哪里说你大部分时间用完了? –

0

Optimizing ssDeep for use at scale (2015-11-27)有一条提示。

  1. 取决于您的目的,循环和匹配不同块大小的SSDEEP将创建一个N x(N-1)哈希比较。除非你需要找到部分内容,否则,避免它。

  2. 正如文章中建议的那样,可以在步骤1中对散列索引进行细分。对于不同块大小的部分内容匹配,这是一种更好的方法。

  3. 通过生成一个“距离表兄弟”散列,可以通过对相似散列进行分组来减少SSDEEP散列。