# This file is part of Metasm, the Ruby assembly manipulation suite # Copyright (C) 2006-2009 Yoann GUILLOT # # Licence is LGPL, see LICENCE in the top-level directory # # this script scans a directory for PE files which export a given symbol name (regexp case-insensitive) # usage : ruby scanpeexports.rb # require 'metasm' if not base = ARGV.shift puts 'base dir ?' base = gets.chomp end if not pat = ARGV.shift puts 'pattern ?' pat = gets.chomp puts 'searching...' end def _puts(a) puts a.to_s.ljust(60) end def _printadv(a) $stderr.print a.to_s.ljust(60)[-60, 60] + "\r" end # the recursive scanning procedure iter = lambda { |f, match| if File.directory? f # show where we are & recurse _printadv f Dir[ File.join(f, '*') ].each { |ff| iter[ff, match] } else # interpret any file as a PE begin pe = Metasm::PE.decode_file_header(f) pe.decode_exports next if not pe.export # scan the export directory for the symbol pattern, excluding forwarders pe.export.exports.each { |exp| if exp.name =~ /#{match}/i and not exp.forwarder_lib _puts f + " : " + exp.name end } rescue # the file is not a valid PE end end } # go iter[base, pat] if RUBY_PLATFORM =~ /win32/i _puts "press [enter] to exit" gets end