require 'rex/parser/arguments'

module Msf
module Ui
module Console
module CommandDispatcher

###
#
# NOP module command dispatcher.
#
###
class Nop

	include Msf::Ui::Console::ModuleCommandDispatcher

	@@generate_opts = Rex::Parser::Arguments.new(
		"-b" => [ true,  "The list of characters to avoid: '\\x00\\xff'"  ],
		"-h" => [ false, "Help banner."                                   ],
		"-s" => [ true,  "The comma separated list of registers to save." ],
		"-t" => [ true,  "The output type: ruby, perl, c, or raw."        ])

	#
	# Returns the hash of supported commands.
	#
	def commands
		{
			"generate" => "Generates a NOP sled",
		}
	end

	#
	# Returns the name of the command dispatcher.
	#
	def name
		"Nop"
	end

	#
	# Generates a NOP sled.
	#
	def cmd_generate(*args)

		# No arguments?  Tell them how to use it.
		if (args.length == 0)
			args << "-h"
		end

		# Parse the arguments
		badchars = nil
		saveregs = nil
		type     = "ruby"
		length   = 200

		@@generate_opts.parse(args) { |opt, idx, val|
			case opt
				when nil
					length = val.to_i	
				when '-b'
					badchars = Rex::Text.hex_to_raw(val)
				when "-c"
					saveregs = val.split(/,\s?/)
				when '-t'
					type = val
				when '-h'
					print(
						"Usage: generate [options] length\n\n" +
						"Generates a NOP sled of a given length.\n" +
						@@generate_opts.usage)
					return false
			end
		}

		# Generate the sled
		begin
			sled = mod.generate_simple(
				length,
				'BadChars'      => badchars,
				'SaveRegisters' => saveregs,
				'Format'        => type)
		rescue
			log_error("Sled generation failed: #{$!}.")
			return false
		end

		# Display generated sled
		print(sled)

		return true
	end

end

end end end end
