Files
metasploit-gs/lib/msf/core/module_manager.rb
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

175 lines
5.2 KiB
Ruby
Raw Normal View History

# -*- coding: binary -*-
#
2012-10-01 13:09:30 -05:00
# Core
#
2012-10-01 13:09:30 -05:00
require 'pathname'
2005-05-22 07:23:25 +00:00
#
2012-10-01 13:09:30 -05:00
# Project
2005-05-22 07:23:25 +00:00
#
2012-10-01 13:09:30 -05:00
module Msf
2012-12-03 22:23:40 -06:00
# Upper management decided to throw in some middle management
# because the modules were getting out of hand. This bad boy takes
# care of the work of managing the interaction with modules in terms
# of loading and instantiation.
2012-10-01 13:09:30 -05:00
#
# @todo add unload support
2012-12-10 13:36:09 -06:00
class ModuleManager
2012-12-03 22:23:40 -06:00
include Msf::Framework::Offspring
2012-10-01 13:09:30 -05:00
# require here so that Msf::ModuleManager is already defined
include Msf::ModuleManager::Cache
include Msf::ModuleManager::Loading
include Msf::ModuleManager::ModulePaths
include Msf::ModuleManager::ModuleSets
include Msf::ModuleManager::Reloading
2012-12-12 13:41:04 -06:00
include Enumerable
2012-10-01 13:09:30 -05:00
2012-12-03 22:23:40 -06:00
def [](key)
names = key.split("/")
type = names.shift
module_set = module_set_by_type[type]
return unless module_set
2012-12-03 22:23:40 -06:00
module_reference_name = names.join("/")
module_set[module_reference_name]
2012-10-01 13:09:30 -05:00
end
2005-10-31 15:56:59 +00:00
# Creates a module instance using the supplied reference name.
2012-10-01 13:09:30 -05:00
#
# @param name [String] A module reference name. It may optionally
# be prefixed with a "<type>/", in which case the module will be
# created from the {Msf::ModuleSet} for the given <type>.
# Otherwise, we step through all sets until we find one that
# matches.
# @return (see Msf::ModuleSet#create)
2019-06-03 13:40:27 -05:00
def create(name, aliased_as: nil)
# First, a direct alias check
return create(self.aliases[name], aliased_as: name) if self.aliases[name]
2012-10-01 13:09:30 -05:00
# Check to see if it has a module type prefix. If it does,
# try to load it from the specific module set for that type.
names = name.split("/")
2012-10-04 11:14:08 -05:00
potential_type_or_directory = names.first
2012-10-01 13:09:30 -05:00
2012-10-04 11:14:08 -05:00
# if first name is a type
if DIRECTORY_BY_TYPE.has_key? potential_type_or_directory
2012-10-04 11:14:08 -05:00
type = potential_type_or_directory
# if first name is a type directory
else
type = TYPE_BY_DIRECTORY[potential_type_or_directory]
end
2012-12-10 13:36:09 -06:00
module_instance = nil
2012-10-04 11:14:08 -05:00
if type
2012-10-01 13:09:30 -05:00
module_set = module_set_by_type[type]
# First element in names is the type, so skip it
module_reference_name = names[1 .. -1].join("/")
2012-12-10 13:36:09 -06:00
module_instance = module_set.create(module_reference_name)
2012-10-01 13:09:30 -05:00
else
# Then we don't have a type, so we have to step through each set
# to see if we can create this module.
2019-06-03 13:40:27 -05:00
module_set_by_type.each do |type, set|
if aliased = self.aliases["#{type}/#{name}"]
module_instance = create(aliased, aliased_as: "#{type}/#{name}")
else
module_reference_name = names.join("/")
module_instance = set.create(module_reference_name)
end
2012-12-10 13:36:09 -06:00
break if module_instance
end
2012-10-01 13:09:30 -05:00
end
if module_instance
2019-08-22 11:19:31 -05:00
# If the module instance is populated by one of the recursive `create`
# calls this field may be set and we'll want to keep its original value
module_instance.aliased_as ||= aliased_as
end
2012-12-10 13:36:09 -06:00
module_instance
2012-10-01 13:09:30 -05:00
end
2005-10-31 15:56:59 +00:00
2012-12-12 13:41:04 -06:00
# Iterate over all modules in all sets
#
# @yieldparam name [String] The module's reference name
# @yieldparam mod_class [Msf::Module] A module class
def each
module_set_by_type.each do |type, set|
set.each do |name, mod_class|
yield name, mod_class
end
end
end
# @param [Msf::Framework] framework The framework for which this instance is managing the modules.
# @param [Array<String>] types List of module types to load. Defaults to all module types in {Msf::MODULE_TYPES}.
def initialize(framework, types=Msf::MODULE_TYPES)
2012-10-01 13:09:30 -05:00
#
# defaults
#
2012-10-04 11:14:08 -05:00
self.module_info_by_path = {}
2012-10-01 13:09:30 -05:00
self.enablement_by_type = {}
2012-10-04 16:32:12 -05:00
self.module_load_error_by_path = {}
2015-12-29 10:37:09 +01:00
self.module_load_warnings = {}
2012-10-01 13:09:30 -05:00
self.module_paths = []
self.module_set_by_type = {}
2019-06-03 13:40:27 -05:00
self.aliases = {}
self.inv_aliases = self.aliases.invert
2012-10-01 13:09:30 -05:00
#
# from arguments
#
self.framework = framework
types.each { |type|
init_module_set(type)
}
end
2012-10-01 13:09:30 -05:00
protected
2019-06-03 13:40:27 -05:00
attr_accessor :aliases, :inv_aliases
2012-12-03 22:23:40 -06:00
# This method automatically subscribes a module to whatever event
# providers it wishes to monitor. This can be used to allow modules
# to automatically execute or perform other tasks when certain
# events occur. For instance, when a new host is detected, other
2015-04-13 13:21:41 +05:00
# auxiliary modules may wish to run such that they can collect more
2012-12-03 22:23:40 -06:00
# information about the host that was detected.
2012-10-01 13:09:30 -05:00
#
2013-05-21 08:19:47 -05:00
# @param klass [Class<Msf::Module>] The module class
# @return [void]
2013-05-21 08:19:47 -05:00
def auto_subscribe_module(klass)
2012-10-01 13:09:30 -05:00
# If auto-subscription is enabled (which it is by default), figure out
# if it subscribes to any particular interfaces.
inst = nil
2012-10-01 13:09:30 -05:00
#
# Exploit event subscriber check
#
2013-05-21 08:19:47 -05:00
if (klass.include?(Msf::ExploitEvent) == true)
framework.events.add_exploit_subscriber((inst) ? inst : (inst = klass.new))
end
2012-10-01 13:09:30 -05:00
#
# Session event subscriber check
#
2013-05-21 08:19:47 -05:00
if (klass.include?(Msf::SessionEvent) == true)
framework.events.add_session_subscriber((inst) ? inst : (inst = klass.new))
end
end
2012-12-12 13:41:04 -06:00
end
end