This adds a script to create matches for each signature against every other signature (this scales poorly, as you can imagine) - warvox - VoIP based wardialing tool, forked from rapid7/warvox.
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
 (DIR) commit 97843c47d173a7437e2329017fbc6ae5bab8f836
 (DIR) parent 78f8af7b8c4dc5c0f0ad6fa3683702c1bd01f8f6
 (HTM) Author: HD Moore <hd_moore@rapid7.com>
       Date:   Sun, 27 Mar 2011 18:30:32 +0000
       
       This adds a script to create matches for each signature against every other signature (this scales poorly, as you can imagine)
       
       
       Diffstat:
         A bin/create_matches.rb               |      80 +++++++++++++++++++++++++++++++
       
       1 file changed, 80 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/bin/create_matches.rb b/bin/create_matches.rb
       @@ -0,0 +1,80 @@
       +#!/usr/bin/env ruby
       +
       +#
       +# Given the path to a signature file, determine the closests matching signatures
       +# within the same directory, creating a .match file.
       +#
       +
       +
       +def is_bad_sig?(sig)
       +        return true if sig == [0,0,0,0]
       +        false
       +end
       +
       +def load_signature(data)
       +        data.split("\n").map { |line|
       +                line.strip.split(",").map{|bits| bits.to_i }
       +        }.reject {|sig| is_bad_sig?(sig) }
       +end
       +
       +inp = ARGV.shift || exit(1)
       +ind = ARGV.shift
       +dir = File.expand_path(inp) + "/"
       +set = {}
       +
       +d = Dir.new(dir)
       +d.entries.each do |ent|
       +        next if ent !~ /\.sig$/
       +        name,trash = ent.split('.', 2)
       +        data       = File.read(File.join(dir, ent))
       +        set[name]  = load_signature(data)
       +        
       +        if set.keys.length % 500 == 0
       +                puts "[*] Loaded #{set.keys.length} signatures..."                
       +        end
       +end
       +d.close
       +
       +puts "[*] Finished loading #{set.keys.length} signatures..."
       +
       +max   = 1
       +cnt   = 0
       +stime = Time.now.to_f
       +
       +targs = ind ? [ind] : set.keys.sort
       +
       +while targs.length > 0
       +        jobs = []
       +
       +        while jobs.length < max
       +                targ = targs.shift
       +                break if not targ
       +                pid = fork
       +                
       +                if pid
       +                        jobs << pid
       +                        next
       +                end
       +        
       +                mine = targ
       +                msig = set[targ]
       +        
       +                res  = []
       +                set.each_pair do |n,sig|
       +                        next if n == mine
       +                        hits = (msig & sig).length
       +                        res << [ ( hits / msig.length.to_f ) * 100.0, hits, n ]
       +                end
       +
       +                File.open(File.join(dir, mine + ".matches"), "w") do |fd|
       +                        res.sort{|a,b| b[0] <=> a[0] }.each do |r|
       +                                fd.puts "#{"%.2f" % r[0]}\t#{r[2]}"
       +                        end
       +                end
       +        
       +                exit(0)
       +        end
       +        jobs.each {|j| Process.waitpid(j) }
       +        cnt += jobs.length
       +        puts "[*] Processed #{cnt}/#{set.keys.length} in #{Time.now.to_f - stime} seconds"        
       +end