metasploit-framework/lib/msf/base/simple/framework.rb

188 lines
4.3 KiB
Ruby

require 'msf/base/simple'
module Msf
module Simple
###
#
# This class wraps the framework-core supplied Framework class and adds some
# helper methods for analyzing statistics as well as other potentially useful
# information that is directly necessary to drive the framework-core.
#
###
module Framework
###
#
# Extends the framework.plugins class instance to automatically check in
# the framework plugin's directory.
#
###
module PluginManager
#
# Loads the supplied plugin by checking to see if it exists in the
# framework default plugin path as necessary.
#
def load(path, opts = {})
def_path = Msf::Config.plugin_directory + File::SEPARATOR + path
if (File.exists?(def_path) or File.exists?(def_path + ".rb"))
super(def_path, opts)
else
super
end
end
end
#
# We extend modules when we're created, and we do it by registering a
# general event subscriber.
#
include GeneralEventSubscriber
#
# Simplifies module instances when they're created.
#
def on_module_created(instance)
Msf::Simple::Framework.simplify_module(instance)
end
ModuleSimplifiers =
{
MODULE_ENCODER => Msf::Simple::Encoder,
MODULE_EXPLOIT => Msf::Simple::Exploit,
MODULE_NOP => Msf::Simple::Nop,
MODULE_PAYLOAD => Msf::Simple::Payload,
MODULE_AUX => Msf::Simple::Auxiliary,
MODULE_POST => Msf::Simple::Post,
}
#
# Create a simplified instance of the framework. This routine takes a hash
# of parameters as an argument. This hash can contain:
#
# OnCreateProc => A callback procedure that is called once the framework
# instance is created.
#
def self.create(opts = {})
framework = Msf::Framework.new(opts)
return simplify(framework, opts)
end
#
# Extends a framework object that may already exist.
#
def self.simplify(framework, opts)
# If the framework instance has not already been extended, do it now.
if (framework.kind_of?(Msf::Simple::Framework) == false)
framework.extend(Msf::Simple::Framework)
framework.plugins.extend(Msf::Simple::Framework::PluginManager)
end
# Initialize the simplified framework
framework.init_simplified()
# Call the creation procedure if one was supplied
if (opts['OnCreateProc'])
opts['OnCreateProc'].call(framework)
end
# Change to a different configuration path if requested
if opts['ConfigDirectory']
Msf::Config::Defaults['ConfigDirectory'] = opts['ConfigDirectory']
end
# Initialize configuration and logging
Msf::Config.init
Msf::Logging.init
# Load the configuration
framework.load_config
# Set the file that will be used to cache information about modules for
# the purpose of providing demand-loaded modules.
framework.modules.set_module_cache_file(
File.join(Msf::Config.config_directory, 'modcache'))
# Initialize the default module search paths
if (Msf::Config.module_directory)
framework.modules.add_module_path(Msf::Config.module_directory)
end
if (Msf::Config.user_module_directory)
framework.modules.add_module_path(Msf::Config.user_module_directory)
end
# If additional module paths have been defined globally, then load them.
# They should be separated by semi-colons.
if framework.datastore['MsfModulePaths']
framework.datastore['MsfModulePaths'].split(";").each { |path|
framework.modules.add_module_path(path)
}
end
# Register the framework as its own general event subscriber in this
# instance
framework.events.add_general_subscriber(framework)
return framework
end
#
# Simplifies a module instance if the type is supported by extending it
# with the simplified module interface.
#
def self.simplify_module(instance)
if ((ModuleSimplifiers[instance.type]) and
(instance.class.include?(ModuleSimplifiers[instance.type]) == false))
instance.extend(ModuleSimplifiers[instance.type])
instance.init_simplified
end
end
##
#
# Simplified interface
#
##
#
# Initializes the simplified interface.
#
def init_simplified
self.stats = Statistics.new(self)
end
#
# Loads configuration, populates the root datastore, etc.
#
def load_config
self.datastore.from_file(Msf::Config.config_file, 'framework/core')
end
#
# Saves the module's datastore to the file
#
def save_config
self.datastore.to_file(Msf::Config.config_file, 'framework/core')
end
#
# Statistics.
#
attr_reader :stats
protected
attr_writer :stats # :nodoc:
end
end
end