diff --git a/tools/exploit/pattern_create.rb b/tools/exploit/pattern_create.rb index 4ef9f64b1e..583a6ca6c8 100755 --- a/tools/exploit/pattern_create.rb +++ b/tools/exploit/pattern_create.rb @@ -2,7 +2,6 @@ # # $Id$ # $Revision$ -# msfbase = __FILE__ while File.symlink?(msfbase) @@ -11,18 +10,71 @@ end $:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', '..', 'lib'))) require 'msfenv' - -$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB'] - +require 'msf/core' +require 'msf/base' require 'rex' +require 'optparse' -if (!(length = ARGV.shift)) - $stderr.puts("Usage: #{File.basename($0)} length [set a] [set b] [set c]\n") - exit +module PatternCreate + class OptsConsole + def self.parse(args) + options = {} + parser = OptionParser.new do |opt| + opt.banner = "Usage: #{__FILE__} [options]\nExample: #{__FILE__} -l 50 -s ABC,def,123\nAd1Ad2Ad3Ae1Ae2Ae3Af1Af2Af3Bd1Bd2Bd3Be1Be2Be3Bf1Bf" + opt.separator '' + opt.separator 'Specific options:' + opt.on('-l', '--length ', Integer, "The length of the pattern") do |len| + options[:length] = len + end + + opt.on('-s', '--sets ', Array, "Custom Pattern Sets") do |sets| + options[:sets] = sets + end + + opt.on_tail('-h', '--help', 'Show this message') do + $stdout.puts opt + exit + end + end + + parser.parse!(args) + + if options.empty? + raise OptionParser::MissingArgument, 'No options set, try -h for usage' + end + + options[:sets] = nil unless options[:sets] + + options + end + end + +class Driver + def initialize + begin + @opts = OptsConsole.parse(ARGV) + rescue OptionParser::ParseError => e + $stderr.puts "[x] #{e.message}" + exit + end + end + + def run + pattern = Rex::Text.pattern_create(@opts[:length], @opts[:sets]) + puts pattern + end + + end end -# If the user supplied custom sets, use those. Otherwise, use the default -# sets. -sets = ARGV.length > 0 ? ARGV : Rex::Text::DefaultPatternSets +if __FILE__ == $PROGRAM_NAME + driver = PatternCreate::Driver.new + begin + driver.run + rescue ::Exception => e + elog("#{e.class}: #{e.message}\n#{e.backtrace * "\n"}") + $stderr.puts "[x] #{e.class}: #{e.message}" + $stderr.puts "[*] If necessary, please refer to framework.log for more details." + end +end -puts Rex::Text.pattern_create(length.to_i, sets)